<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>SOLID on PG Blog</title><link>https://pg-blogs.netlify.app/tags/solid/</link><description>Recent content in SOLID on PG Blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 03 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://pg-blogs.netlify.app/tags/solid/index.xml" rel="self" type="application/rss+xml"/><item><title>Designing for Change: Boundaries, Contracts, and Dependency Inversion in Java</title><link>https://pg-blogs.netlify.app/posts/12-designing-for-change-in-java/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>https://pg-blogs.netlify.app/posts/12-designing-for-change-in-java/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Most Java systems don&amp;rsquo;t fail because a single class was written badly. They fail because the &lt;em&gt;boundaries&lt;/em&gt; between classes were drawn in the wrong place — a database library leaks into business logic, a payment provider&amp;rsquo;s SDK shows up in twelve unrelated files, and changing one third-party dependency means touching half the codebase.&lt;/p&gt;
&lt;p&gt;Designing for change is not about predicting the future correctly. It&amp;rsquo;s about &lt;strong&gt;isolating what varies&lt;/strong&gt; so that when it inevitably does vary — a new payment provider, a swapped database, a different message broker — the blast radius is one adapter, not the whole system.&lt;/p&gt;</description></item><item><title>Designing for Change: Boundaries, Contracts, and Dependency Inversion in Python</title><link>https://pg-blogs.netlify.app/posts/13-designing-for-change-in-python/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>https://pg-blogs.netlify.app/posts/13-designing-for-change-in-python/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Python&amp;rsquo;s flexibility makes it easy to wire everything together directly — call the &lt;code&gt;requests&lt;/code&gt; library from inside your business logic, import the ORM model straight into your pricing rules, instantiate a third-party SDK client wherever it&amp;rsquo;s needed. It works, right up until the payment provider changes, or you want a fast unit test that doesn&amp;rsquo;t need a live database.&lt;/p&gt;
&lt;p&gt;Designing for change means drawing boundaries around the parts of the system likely to move — third-party services, storage, transport — so that a swap or a test double touches one small adapter instead of rippling through the codebase.&lt;/p&gt;</description></item></channel></rss>