<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Walter Nascimento</title>
    <description>The latest articles on DEV Community by Walter Nascimento (@walternascimentobarroso).</description>
    <link>https://dev.to/walternascimentobarroso</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F397267%2F29dd9f79-3fb0-4f5f-b091-308b7aebbff1.png</url>
      <title>DEV Community: Walter Nascimento</title>
      <link>https://dev.to/walternascimentobarroso</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/walternascimentobarroso"/>
    <language>en</language>
    <item>
      <title>Polymorphism: Eliminating Conditionals and Unlocking Extensibility</title>
      <dc:creator>Walter Nascimento</dc:creator>
      <pubDate>Sat, 28 Feb 2026 05:59:00 +0000</pubDate>
      <link>https://dev.to/walternascimentobarroso/polymorphism-eliminating-conditionals-and-unlocking-extensibility-3gp9</link>
      <guid>https://dev.to/walternascimentobarroso/polymorphism-eliminating-conditionals-and-unlocking-extensibility-3gp9</guid>
      <description>&lt;p&gt;Most developers think polymorphism means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“One interface, multiple implementations.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s technically correct.&lt;/p&gt;

&lt;p&gt;But architecturally incomplete.&lt;/p&gt;

&lt;p&gt;Polymorphism is about this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Replacing conditional logic with behavioral variation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If your system grows with &lt;code&gt;switch&lt;/code&gt; statements,&lt;br&gt;
you’re not using polymorphism.&lt;/p&gt;

&lt;p&gt;You’re fighting it.&lt;/p&gt;


&lt;h2&gt;
  
  
  A Brief Historical Context
&lt;/h2&gt;

&lt;p&gt;Polymorphism was introduced to allow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Message passing between objects&lt;/li&gt;
&lt;li&gt;Dynamic behavior resolution&lt;/li&gt;
&lt;li&gt;Runtime flexibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of asking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;'credit_card'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mf"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You delegate behavior to the object itself.&lt;/p&gt;

&lt;p&gt;That shift changes everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  ❌ The Conditional Explosion Problem
&lt;/h2&gt;

&lt;p&gt;Imagine a pricing system.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DiscountCalculator&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s1"&gt;'percentage'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s1"&gt;'fixed'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s1"&gt;'none'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;InvalidArgumentException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Invalid discount type'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Violates Open/Closed Principle&lt;/li&gt;
&lt;li&gt;Every new discount modifies the class&lt;/li&gt;
&lt;li&gt;High risk of regression&lt;/li&gt;
&lt;li&gt;Business rules centralized in conditionals&lt;/li&gt;
&lt;li&gt;Hard to test behaviors independently&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This grows over time.&lt;/p&gt;

&lt;p&gt;Switch becomes monster.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Introducing Polymorphism
&lt;/h2&gt;

&lt;p&gt;Define a contract.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;DiscountStrategy&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Implement behaviors separately.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PercentageDiscount&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;DiscountStrategy&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$percentage&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;percentage&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FixedDiscount&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;DiscountStrategy&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$amountToSubtract&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;amountToSubtract&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NoDiscount&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;DiscountStrategy&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the calculator becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PriceCalculator&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;DiscountStrategy&lt;/span&gt; &lt;span class="nv"&gt;$discountStrategy&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;discountStrategy&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No conditionals.&lt;/p&gt;

&lt;p&gt;Behavior varies by object.&lt;/p&gt;

&lt;p&gt;That’s polymorphism.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Is Architecturally Superior
&lt;/h2&gt;

&lt;p&gt;Adding a new discount:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SeasonalDiscount&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;DiscountStrategy&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You don’t modify existing code.&lt;/p&gt;

&lt;p&gt;You extend behavior safely.&lt;/p&gt;

&lt;p&gt;That’s Open/Closed Principle in action.&lt;/p&gt;

&lt;p&gt;Polymorphism enables it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Runtime Polymorphism vs Structural Polymorphism
&lt;/h2&gt;

&lt;p&gt;PHP supports runtime polymorphism through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Interfaces&lt;/li&gt;
&lt;li&gt;Abstract classes&lt;/li&gt;
&lt;li&gt;Method overriding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;checkout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;DiscountStrategy&lt;/span&gt; &lt;span class="nv"&gt;$discount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$discount&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;apply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Any implementation works.&lt;/p&gt;

&lt;p&gt;Behavior is resolved at runtime.&lt;/p&gt;

&lt;p&gt;No conditionals needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Power: Removing Knowledge of Types
&lt;/h2&gt;

&lt;p&gt;Conditional logic requires type awareness:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$payment&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nc"&gt;StripePayment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mf"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Polymorphism removes that knowledge.&lt;/p&gt;

&lt;p&gt;The system does not care about concrete type.&lt;/p&gt;

&lt;p&gt;It only cares about behavior.&lt;/p&gt;

&lt;p&gt;That reduces coupling dramatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Advanced Insight: Polymorphism and Domain Modeling
&lt;/h2&gt;

&lt;p&gt;In rich domain models, polymorphism represents real-world behavior variation.&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$userType&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;'admin'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mf"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Model roles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;UserRole&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;canApprove&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AdminRole&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;UserRole&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;canApprove&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CustomerRole&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;UserRole&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;canApprove&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;UserRole&lt;/span&gt; &lt;span class="nv"&gt;$role&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;canApprove&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;canApprove&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No role conditionals across the system.&lt;/p&gt;

&lt;p&gt;Behavior lives where it belongs.&lt;/p&gt;




&lt;h2&gt;
  
  
  When Polymorphism Is Overused
&lt;/h2&gt;

&lt;p&gt;Polymorphism becomes harmful when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You create abstractions without variability&lt;/li&gt;
&lt;li&gt;There is only ever one implementation&lt;/li&gt;
&lt;li&gt;You abstract prematurely&lt;/li&gt;
&lt;li&gt;You hide simple logic behind unnecessary indirection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Like abstraction, polymorphism should follow variation.&lt;/p&gt;

&lt;p&gt;Not fear of change.&lt;/p&gt;




&lt;h2&gt;
  
  
  Polymorphism vs Inheritance
&lt;/h2&gt;

&lt;p&gt;Inheritance enables polymorphism.&lt;/p&gt;

&lt;p&gt;But inheritance is not required for polymorphism.&lt;/p&gt;

&lt;p&gt;Interfaces + composition are often cleaner.&lt;/p&gt;

&lt;p&gt;Modern systems favor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Composition&lt;/li&gt;
&lt;li&gt;Strategy pattern&lt;/li&gt;
&lt;li&gt;Interface-driven design&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Deep inheritance hierarchies are rarely necessary.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Architectural Impact
&lt;/h2&gt;

&lt;p&gt;Without polymorphism:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conditionals multiply&lt;/li&gt;
&lt;li&gt;Code becomes rigid&lt;/li&gt;
&lt;li&gt;Modifications become risky&lt;/li&gt;
&lt;li&gt;Extension requires modification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With polymorphism:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Behavior becomes pluggable&lt;/li&gt;
&lt;li&gt;Extension becomes safe&lt;/li&gt;
&lt;li&gt;Testing becomes simpler&lt;/li&gt;
&lt;li&gt;Systems evolve without breaking&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Insight
&lt;/h2&gt;

&lt;p&gt;Polymorphism is not about multiple implementations.&lt;/p&gt;

&lt;p&gt;It is about removing decision logic from central coordinators.&lt;/p&gt;

&lt;p&gt;If encapsulation protects invariants,&lt;br&gt;
if abstraction protects dependency direction,&lt;br&gt;
if inheritance models specialization,&lt;/p&gt;

&lt;p&gt;Polymorphism unlocks extensibility.&lt;/p&gt;

&lt;p&gt;And extensibility is what keeps systems alive over time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Thanks for reading!
&lt;/h2&gt;

&lt;p&gt;If you have any questions, complaints or tips, you can leave them here in the comments. I will be happy to answer!&lt;br&gt;
😊😊 See you! 😊😊&lt;/p&gt;




&lt;h2&gt;
  
  
  Support Me
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/channel/UCXm0xRtDRrdnvkW24WmkBqA" rel="noopener noreferrer"&gt;Youtube - WalterNascimentoBarroso&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/walternascimentobarroso" rel="noopener noreferrer"&gt;Github - WalterNascimentoBarroso&lt;/a&gt;&lt;br&gt;
&lt;a href="https://codepen.io" rel="noopener noreferrer"&gt;Codepen - WalterNascimentoBarroso&lt;/a&gt;&lt;/p&gt;

</description>
      <category>oop</category>
      <category>webdev</category>
      <category>programming</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Inheritance: The Most Misused Pillar of OOP</title>
      <dc:creator>Walter Nascimento</dc:creator>
      <pubDate>Fri, 27 Feb 2026 05:59:00 +0000</pubDate>
      <link>https://dev.to/walternascimentobarroso/inheritance-the-most-misused-pillar-of-oop-2a3e</link>
      <guid>https://dev.to/walternascimentobarroso/inheritance-the-most-misused-pillar-of-oop-2a3e</guid>
      <description>&lt;p&gt;Inheritance was introduced to promote reuse.&lt;/p&gt;

&lt;p&gt;But in modern systems,&lt;br&gt;
it is one of the biggest sources of fragility.&lt;/p&gt;

&lt;p&gt;Used correctly, it models specialization.&lt;/p&gt;

&lt;p&gt;Used incorrectly, it creates tight coupling, broken abstractions, and subtle bugs.&lt;/p&gt;

&lt;p&gt;Inheritance is powerful.&lt;/p&gt;

&lt;p&gt;And dangerous.&lt;/p&gt;


&lt;h2&gt;
  
  
  A Brief Historical Context
&lt;/h2&gt;

&lt;p&gt;Inheritance emerged strongly in Smalltalk and later C++ as a way to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reuse behavior&lt;/li&gt;
&lt;li&gt;Model taxonomies&lt;/li&gt;
&lt;li&gt;Represent “is-a” relationships&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But as systems scaled, developers discovered something:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Inheritance couples classes more tightly than composition.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The child class is structurally bound to the parent.&lt;/p&gt;

&lt;p&gt;If the parent changes, everything below it may break.&lt;/p&gt;


&lt;h2&gt;
  
  
  What Inheritance Really Means
&lt;/h2&gt;

&lt;p&gt;Inheritance is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A specialization relationship&lt;/li&gt;
&lt;li&gt;A behavioral extension mechanism&lt;/li&gt;
&lt;li&gt;A polymorphic substitution mechanism&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inheritance is not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A code reuse shortcut&lt;/li&gt;
&lt;li&gt;A way to share utilities&lt;/li&gt;
&lt;li&gt;A dumping ground for common methods&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your only goal is reuse,&lt;br&gt;
inheritance is often the wrong tool.&lt;/p&gt;


&lt;h2&gt;
  
  
  ❌ The Wrong Way: Inheritance for Reuse
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FileLogger&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Y-m-d'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;' - '&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now someone wants email logging:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EmailLogger&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;FileLogger&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$formatted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;// send email&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why is this problematic?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EmailLogger depends on FileLogger&lt;/li&gt;
&lt;li&gt;FileLogger was never meant to be a base abstraction&lt;/li&gt;
&lt;li&gt;Shared logic forces structural coupling&lt;/li&gt;
&lt;li&gt;Changing FileLogger impacts EmailLogger&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is inheritance for reuse.&lt;/p&gt;

&lt;p&gt;And it's fragile.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Rectangle / Square Problem
&lt;/h2&gt;

&lt;p&gt;A classic example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Rectangle&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$width&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$height&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;setWidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$width&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$width&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;setHeight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$height&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$height&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;area&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Square&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Rectangle&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;setWidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$width&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$width&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$width&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;setHeight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$height&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$height&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$height&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Seems logical.&lt;/p&gt;

&lt;p&gt;But watch this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Rectangle&lt;/span&gt; &lt;span class="nv"&gt;$rectangle&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$rectangle&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setWidth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$rectangle&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;setHeight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$rectangle&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;area&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected result: 50.&lt;/p&gt;

&lt;p&gt;If we pass Square?&lt;/p&gt;

&lt;p&gt;Result: 100.&lt;/p&gt;

&lt;p&gt;This violates the Liskov Substitution Principle.&lt;/p&gt;

&lt;p&gt;The child cannot safely substitute the parent.&lt;/p&gt;

&lt;p&gt;Inheritance broke behavioral expectations.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Rule of Inheritance
&lt;/h2&gt;

&lt;p&gt;For inheritance to be valid:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The child must fully respect the behavioral contract of the parent.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not just the method signatures.&lt;/p&gt;

&lt;p&gt;The behavior.&lt;/p&gt;

&lt;p&gt;If overriding changes expectations,&lt;br&gt;
inheritance is wrong.&lt;/p&gt;


&lt;h2&gt;
  
  
  When Inheritance Is Appropriate
&lt;/h2&gt;

&lt;p&gt;Inheritance works well for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Framework base classes (with strict contracts)&lt;/li&gt;
&lt;li&gt;Template Method pattern&lt;/li&gt;
&lt;li&gt;Controlled extensibility&lt;/li&gt;
&lt;li&gt;Internal engine hierarchies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;abstract&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ReportGenerator&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;collectData&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;export&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;abstract&lt;/span&gt; &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;collectData&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;abstract&lt;/span&gt; &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;export&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Concrete implementations specialize behavior without breaking the algorithm structure.&lt;/p&gt;

&lt;p&gt;That’s safe inheritance.&lt;/p&gt;




&lt;h2&gt;
  
  
  Prefer Composition Over Inheritance
&lt;/h2&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EmailLogger&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;FileLogger&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use composition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LoggerFormatter&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Y-m-d'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;' - '&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;EmailLogger&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;LoggerFormatter&lt;/span&gt; &lt;span class="nv"&gt;$formatter&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$formatted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;formatter&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;// send email&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now:&lt;/p&gt;

&lt;p&gt;✔ No structural coupling&lt;br&gt;
✔ Reuse without hierarchy&lt;br&gt;
✔ Replaceable components&lt;br&gt;
✔ Safer evolution&lt;/p&gt;

&lt;p&gt;Composition isolates change.&lt;/p&gt;

&lt;p&gt;Inheritance propagates change.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Fragility Problem
&lt;/h2&gt;

&lt;p&gt;Inheritance creates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tight coupling&lt;/li&gt;
&lt;li&gt;Implicit dependencies&lt;/li&gt;
&lt;li&gt;Hidden assumptions&lt;/li&gt;
&lt;li&gt;Deep hierarchy complexity&lt;/li&gt;
&lt;li&gt;Hard-to-reason systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The deeper the hierarchy,&lt;br&gt;
the harder the system becomes to maintain.&lt;/p&gt;

&lt;p&gt;Modern architectures prefer shallow hierarchies and composition.&lt;/p&gt;




&lt;h2&gt;
  
  
  Advanced Insight: Inheritance and Encapsulation Conflict
&lt;/h2&gt;

&lt;p&gt;Inheritance can weaken encapsulation.&lt;/p&gt;

&lt;p&gt;Protected properties allow subclasses to manipulate internal state.&lt;/p&gt;

&lt;p&gt;That breaks invariants.&lt;/p&gt;

&lt;p&gt;That weakens object boundaries.&lt;/p&gt;

&lt;p&gt;That introduces subtle bugs.&lt;/p&gt;

&lt;p&gt;This is why many modern systems favor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Final classes&lt;/li&gt;
&lt;li&gt;Composition&lt;/li&gt;
&lt;li&gt;Interfaces over abstract base classes&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  When NOT to Use Inheritance
&lt;/h2&gt;

&lt;p&gt;Avoid inheritance when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You only want code reuse&lt;/li&gt;
&lt;li&gt;You cannot guarantee behavioral substitution&lt;/li&gt;
&lt;li&gt;The base class wasn’t designed for extension&lt;/li&gt;
&lt;li&gt;You foresee independent evolution&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Insight
&lt;/h2&gt;

&lt;p&gt;Inheritance is about specialization, not reuse.&lt;/p&gt;

&lt;p&gt;If encapsulation protects internal state&lt;br&gt;
and abstraction protects dependency boundaries&lt;/p&gt;

&lt;p&gt;Inheritance must protect behavioral contracts.&lt;/p&gt;

&lt;p&gt;Used correctly, it models true “is-a” relationships.&lt;/p&gt;

&lt;p&gt;Used carelessly, it introduces silent architectural decay.&lt;/p&gt;

&lt;p&gt;Inheritance is powerful.&lt;/p&gt;

&lt;p&gt;That’s why it must be used carefully.&lt;/p&gt;




&lt;h2&gt;
  
  
  Thanks for reading!
&lt;/h2&gt;

&lt;p&gt;If you have any questions, complaints or tips, you can leave them here in the comments. I will be happy to answer!&lt;br&gt;
😊😊 See you! 😊😊&lt;/p&gt;




&lt;h2&gt;
  
  
  Support Me
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/channel/UCXm0xRtDRrdnvkW24WmkBqA" rel="noopener noreferrer"&gt;Youtube - WalterNascimentoBarroso&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/walternascimentobarroso" rel="noopener noreferrer"&gt;Github - WalterNascimentoBarroso&lt;/a&gt;&lt;br&gt;
&lt;a href="https://codepen.io" rel="noopener noreferrer"&gt;Codepen - WalterNascimentoBarroso&lt;/a&gt;&lt;/p&gt;

</description>
      <category>oop</category>
      <category>webdev</category>
      <category>softwareengineering</category>
      <category>programming</category>
    </item>
    <item>
      <title>Abstraction: Designing Systems That Don’t Collapse Under Complexity</title>
      <dc:creator>Walter Nascimento</dc:creator>
      <pubDate>Thu, 26 Feb 2026 05:59:00 +0000</pubDate>
      <link>https://dev.to/walternascimentobarroso/abstraction-designing-systems-that-dont-collapse-under-complexity-3h29</link>
      <guid>https://dev.to/walternascimentobarroso/abstraction-designing-systems-that-dont-collapse-under-complexity-3h29</guid>
      <description>&lt;p&gt;Encapsulation protects invariants.&lt;/p&gt;

&lt;p&gt;Abstraction protects architecture.&lt;/p&gt;

&lt;p&gt;If encapsulation controls state,&lt;br&gt;
abstraction controls dependency.&lt;/p&gt;

&lt;p&gt;And without it, your system slowly turns into a fragile web of concrete implementations.&lt;/p&gt;


&lt;h2&gt;
  
  
  A Brief Historical Context
&lt;/h2&gt;

&lt;p&gt;Abstraction became critical when software systems stopped being small.&lt;/p&gt;

&lt;p&gt;In early OOP systems, objects communicated directly with concrete implementations.&lt;/p&gt;

&lt;p&gt;But as systems grew:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Infrastructure changed&lt;/li&gt;
&lt;li&gt;Databases evolved&lt;/li&gt;
&lt;li&gt;APIs were replaced&lt;/li&gt;
&lt;li&gt;Vendors switched&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hard-coded dependencies became the biggest source of rigidity.&lt;/p&gt;

&lt;p&gt;Abstraction emerged as a way to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Depend on behavior contracts, not implementations.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That single idea made large systems survivable.&lt;/p&gt;


&lt;h2&gt;
  
  
  What Abstraction Really Means
&lt;/h2&gt;

&lt;p&gt;Abstraction is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Defining behavior without exposing implementation&lt;/li&gt;
&lt;li&gt;Programming against contracts&lt;/li&gt;
&lt;li&gt;Isolating high-level logic from low-level details&lt;/li&gt;
&lt;li&gt;Reducing coupling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Abstraction is not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Just creating interfaces everywhere&lt;/li&gt;
&lt;li&gt;Adding layers for no reason&lt;/li&gt;
&lt;li&gt;Over-engineering small systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Abstraction is about &lt;strong&gt;managing volatility&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  ❌ The Problem: Concrete Coupling
&lt;/h2&gt;

&lt;p&gt;Let’s say we’re building a payment service.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;pay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$stripe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;StripePaymentGateway&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nv"&gt;$stripe&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;charge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What’s wrong?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OrderService depends directly on Stripe&lt;/li&gt;
&lt;li&gt;Impossible to switch provider without editing business logic&lt;/li&gt;
&lt;li&gt;Hard to test&lt;/li&gt;
&lt;li&gt;Violates dependency inversion&lt;/li&gt;
&lt;li&gt;Infrastructure leaks into domain logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is tight coupling.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Becomes Dangerous
&lt;/h2&gt;

&lt;p&gt;Imagine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stripe increases fees&lt;/li&gt;
&lt;li&gt;You must support PayPal&lt;/li&gt;
&lt;li&gt;A region requires a local provider&lt;/li&gt;
&lt;li&gt;Stripe API changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now you must modify core logic.&lt;/p&gt;

&lt;p&gt;Your domain is polluted by infrastructure decisions.&lt;/p&gt;

&lt;p&gt;That’s architectural fragility.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Introducing Abstraction
&lt;/h2&gt;

&lt;p&gt;We define a contract.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;PaymentGateway&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;charge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we create implementations.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;StripePaymentGateway&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;PaymentGateway&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;charge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Call Stripe API&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PaypalPaymentGateway&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;PaymentGateway&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;charge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Call PayPal API&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we depend on abstraction.&lt;/p&gt;




&lt;h2&gt;
  
  
  Refactoring the Service
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderService&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;PaymentGateway&lt;/span&gt; &lt;span class="nv"&gt;$paymentGateway&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;pay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;paymentGateway&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;charge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now:&lt;/p&gt;

&lt;p&gt;✔ OrderService does not know about Stripe&lt;br&gt;
✔ Infrastructure can change&lt;br&gt;
✔ Testing becomes trivial&lt;br&gt;
✔ Domain logic is protected&lt;/p&gt;

&lt;p&gt;This is abstraction.&lt;/p&gt;




&lt;h2&gt;
  
  
  Abstraction and Dependency Direction
&lt;/h2&gt;

&lt;p&gt;The critical rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;High-level modules should not depend on low-level modules.&lt;br&gt;
Both should depend on abstractions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the foundation of the Dependency Inversion Principle.&lt;/p&gt;

&lt;p&gt;Your domain should never depend on Stripe.&lt;/p&gt;

&lt;p&gt;Stripe should depend on your abstraction.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architectural Impact
&lt;/h2&gt;

&lt;p&gt;With abstraction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can switch providers&lt;/li&gt;
&lt;li&gt;You can mock dependencies&lt;/li&gt;
&lt;li&gt;You isolate external volatility&lt;/li&gt;
&lt;li&gt;You maintain stable core logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without abstraction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Refactoring becomes dangerous&lt;/li&gt;
&lt;li&gt;Tests require real infrastructure&lt;/li&gt;
&lt;li&gt;Every change ripples across the system&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Advanced Insight: Abstraction is About Volatility Isolation
&lt;/h2&gt;

&lt;p&gt;Ask yourself:&lt;/p&gt;

&lt;p&gt;What changes frequently?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;External APIs&lt;/li&gt;
&lt;li&gt;Databases&lt;/li&gt;
&lt;li&gt;Message brokers&lt;/li&gt;
&lt;li&gt;File storage&lt;/li&gt;
&lt;li&gt;Email providers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are volatile dependencies.&lt;/p&gt;

&lt;p&gt;Your core business rules are stable.&lt;/p&gt;

&lt;p&gt;Abstraction isolates stable from unstable.&lt;/p&gt;




&lt;h2&gt;
  
  
  When Abstraction Is Overkill
&lt;/h2&gt;

&lt;p&gt;Abstraction adds indirection.&lt;/p&gt;

&lt;p&gt;Do not abstract:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple scripts&lt;/li&gt;
&lt;li&gt;Tiny applications&lt;/li&gt;
&lt;li&gt;One-off utilities&lt;/li&gt;
&lt;li&gt;Stable internal code with no variability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Premature abstraction creates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Interface pollution&lt;/li&gt;
&lt;li&gt;Unnecessary complexity&lt;/li&gt;
&lt;li&gt;Cognitive overhead&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Abstraction should follow variability, not fear.&lt;/p&gt;




&lt;h2&gt;
  
  
  Abstraction vs Encapsulation
&lt;/h2&gt;

&lt;p&gt;Encapsulation protects internal state.&lt;/p&gt;

&lt;p&gt;Abstraction protects dependency boundaries.&lt;/p&gt;

&lt;p&gt;Encapsulation works inside the object.&lt;/p&gt;

&lt;p&gt;Abstraction works between objects.&lt;/p&gt;

&lt;p&gt;Together, they define structural integrity.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Anti-Patterns
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣ Interface Per Class
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;UserServiceInterface&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserService&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;UserServiceInterface&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No variability.&lt;/p&gt;

&lt;p&gt;No alternative implementation.&lt;/p&gt;

&lt;p&gt;Just noise.&lt;/p&gt;




&lt;h3&gt;
  
  
  2️⃣ Leaky Abstractions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;PaymentGateway&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;chargeWithStripeToken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$token&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stripe-specific logic inside abstraction.&lt;/p&gt;

&lt;p&gt;That defeats the purpose.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Insight
&lt;/h2&gt;

&lt;p&gt;Abstraction is not about hiding code.&lt;/p&gt;

&lt;p&gt;It is about controlling dependency direction.&lt;/p&gt;

&lt;p&gt;If encapsulation prevents internal chaos,&lt;br&gt;
abstraction prevents architectural collapse.&lt;/p&gt;

&lt;p&gt;Abstraction allows your system to evolve without rewriting its core.&lt;/p&gt;

&lt;p&gt;That is why it is the second pillar of OOP.&lt;/p&gt;




&lt;h2&gt;
  
  
  Thanks for reading!
&lt;/h2&gt;

&lt;p&gt;If you have any questions, complaints or tips, you can leave them here in the comments. I will be happy to answer!&lt;br&gt;
😊😊 See you! 😊😊&lt;/p&gt;




&lt;h2&gt;
  
  
  Support Me
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/channel/UCXm0xRtDRrdnvkW24WmkBqA" rel="noopener noreferrer"&gt;Youtube - WalterNascimentoBarroso&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/walternascimentobarroso" rel="noopener noreferrer"&gt;Github - WalterNascimentoBarroso&lt;/a&gt;&lt;br&gt;
&lt;a href="https://codepen.io" rel="noopener noreferrer"&gt;Codepen - WalterNascimentoBarroso&lt;/a&gt;&lt;/p&gt;

</description>
      <category>oop</category>
      <category>webdev</category>
      <category>programming</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Encapsulation: The Pillar That Protects Your Domain from Chaos</title>
      <dc:creator>Walter Nascimento</dc:creator>
      <pubDate>Wed, 25 Feb 2026 19:22:57 +0000</pubDate>
      <link>https://dev.to/walternascimentobarroso/encapsulation-the-pillar-that-protects-your-domain-from-chaos-4kfh</link>
      <guid>https://dev.to/walternascimentobarroso/encapsulation-the-pillar-that-protects-your-domain-from-chaos-4kfh</guid>
      <description>&lt;p&gt;Before SOLID.&lt;br&gt;
Before Clean Architecture.&lt;br&gt;
Before Design Patterns.&lt;/p&gt;

&lt;p&gt;There was one fundamental idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Objects must protect their own state.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Encapsulation is not about hiding properties.&lt;/p&gt;

&lt;p&gt;It is about &lt;strong&gt;preserving invariants and controlling state transitions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If your object can enter an invalid state,&lt;br&gt;
you don’t have encapsulation.&lt;/p&gt;

&lt;p&gt;You have a mutable data structure with methods attached.&lt;/p&gt;


&lt;h2&gt;
  
  
  A Brief Historical Context
&lt;/h2&gt;

&lt;p&gt;Encapsulation was formalized in the 1970s with Simula and later reinforced by Smalltalk.&lt;/p&gt;

&lt;p&gt;The motivation was simple:&lt;/p&gt;

&lt;p&gt;Procedural systems relied heavily on shared mutable state.&lt;br&gt;
That led to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hidden side effects&lt;/li&gt;
&lt;li&gt;Fragile code&lt;/li&gt;
&lt;li&gt;Tight coupling&lt;/li&gt;
&lt;li&gt;Hard-to-reason systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Object-Oriented Programming proposed a radical constraint:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Data should only be modified through behavior defined by the object itself.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Encapsulation was born as a protection mechanism.&lt;/p&gt;


&lt;h2&gt;
  
  
  What Encapsulation Actually Means
&lt;/h2&gt;

&lt;p&gt;Encapsulation is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Restricting direct access to internal state&lt;/li&gt;
&lt;li&gt;Exposing behavior instead of raw data&lt;/li&gt;
&lt;li&gt;Enforcing invariants at construction and mutation&lt;/li&gt;
&lt;li&gt;Preventing invalid state transitions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Encapsulation is &lt;strong&gt;not&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Just using &lt;code&gt;private&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Generating getters and setters for everything&lt;/li&gt;
&lt;li&gt;Hiding data without protecting it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Encapsulation is about &lt;strong&gt;control&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  ❌ The Illusion of Encapsulation
&lt;/h2&gt;

&lt;p&gt;Let’s look at a common example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BankAccount&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$balance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;deposit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;withdraw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What’s wrong?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Public mutable state&lt;/li&gt;
&lt;li&gt;No invariant protection&lt;/li&gt;
&lt;li&gt;Negative balances allowed&lt;/li&gt;
&lt;li&gt;Invalid transitions possible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not an object.&lt;/p&gt;

&lt;p&gt;It’s a struct with methods.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Problem: Broken Invariants
&lt;/h2&gt;

&lt;p&gt;An invariant is a condition that must always be true.&lt;/p&gt;

&lt;p&gt;For a bank account:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Balance cannot be negative&lt;/li&gt;
&lt;li&gt;Deposit must be positive&lt;/li&gt;
&lt;li&gt;Withdraw cannot exceed balance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With the previous implementation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$account&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;BankAccount&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nv"&gt;$account&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1_000_000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your domain is corrupted.&lt;/p&gt;

&lt;p&gt;Encapsulation failed.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Proper Encapsulation in PHP
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BankAccount&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$balance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$initialBalance&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$initialBalance&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;InvalidArgumentException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="s1"&gt;'Initial balance cannot be negative.'&lt;/span&gt;
            &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$initialBalance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;deposit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$amount&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;InvalidArgumentException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="s1"&gt;'Deposit amount must be positive.'&lt;/span&gt;
            &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;withdraw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$amount&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;InvalidArgumentException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="s1"&gt;'Withdraw amount must be positive.'&lt;/span&gt;
            &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$amount&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RuntimeException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="s1"&gt;'Insufficient funds.'&lt;/span&gt;
            &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice the structural improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;private&lt;/code&gt; state&lt;/li&gt;
&lt;li&gt;Guard clauses&lt;/li&gt;
&lt;li&gt;Controlled transitions&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;final&lt;/code&gt; class (prevent unsafe inheritance)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now the object:&lt;/p&gt;

&lt;p&gt;✔ Cannot be constructed invalid&lt;br&gt;
✔ Cannot transition to invalid state&lt;br&gt;
✔ Protects its invariants&lt;br&gt;
✔ Exposes behavior, not data&lt;/p&gt;

&lt;p&gt;This is encapsulation.&lt;/p&gt;


&lt;h2&gt;
  
  
  Encapsulation and State Transitions
&lt;/h2&gt;

&lt;p&gt;Encapsulation is fundamentally about controlling transitions.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$account&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We model domain behavior:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$account&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;deposit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why does this matter?&lt;/p&gt;

&lt;p&gt;Because behavior is extensible.&lt;/p&gt;

&lt;p&gt;Inside &lt;code&gt;deposit()&lt;/code&gt; we could later:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dispatch domain events&lt;/li&gt;
&lt;li&gt;Log transactions&lt;/li&gt;
&lt;li&gt;Validate limits&lt;/li&gt;
&lt;li&gt;Apply fees&lt;/li&gt;
&lt;li&gt;Trigger auditing&lt;/li&gt;
&lt;li&gt;Wrap in transaction boundaries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Encapsulation enables architectural evolution.&lt;/p&gt;

&lt;p&gt;Direct state mutation blocks it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Getter/Setter Trap
&lt;/h2&gt;

&lt;p&gt;Many developers think this is encapsulation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$balance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getBalance&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;setBalance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="nv"&gt;$balance&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$balance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not encapsulation.&lt;/p&gt;

&lt;p&gt;This is a public property with ceremony.&lt;/p&gt;

&lt;p&gt;The invariant is still unprotected.&lt;/p&gt;

&lt;p&gt;If you can arbitrarily set state,&lt;br&gt;
your object is still fragile.&lt;/p&gt;


&lt;h2&gt;
  
  
  Encapsulation in Domain-Driven Design
&lt;/h2&gt;

&lt;p&gt;In DDD, an Aggregate Root must:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Protect its invariants&lt;/li&gt;
&lt;li&gt;Control all state changes&lt;/li&gt;
&lt;li&gt;Prevent invalid operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example of what not to do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;setStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Better:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;approve&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="s1"&gt;'pending'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;DomainException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Only pending orders can be approved.'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'approved'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Behavior-driven transitions preserve consistency.&lt;/p&gt;

&lt;p&gt;Encapsulation is what makes aggregates reliable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Advanced Technique: Immutability with readonly
&lt;/h2&gt;

&lt;p&gt;PHP 8.1 introduced &lt;code&gt;readonly&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For value objects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Money&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$currency&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$amount&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;InvalidArgumentException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Amount cannot be negative.'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Immutable objects are the strongest form of encapsulation.&lt;/p&gt;

&lt;p&gt;They:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prevent mutation entirely&lt;/li&gt;
&lt;li&gt;Eliminate side effects&lt;/li&gt;
&lt;li&gt;Improve reasoning&lt;/li&gt;
&lt;li&gt;Reduce concurrency issues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Encapsulation + Immutability = Stability.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Anti-Patterns
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣ Anemic Domain Model
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$email&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$password&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All business logic lives in services.&lt;/p&gt;

&lt;p&gt;This is procedural code disguised as OOP.&lt;/p&gt;




&lt;h3&gt;
  
  
  2️⃣ Returning Internal Collections
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;External code can mutate internal state.&lt;/p&gt;

&lt;p&gt;Better:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Return copies&lt;/li&gt;
&lt;li&gt;Return iterators&lt;/li&gt;
&lt;li&gt;Provide &lt;code&gt;addItem()&lt;/code&gt; / &lt;code&gt;removeItem()&lt;/code&gt; methods&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Architectural Impact
&lt;/h2&gt;

&lt;p&gt;Without encapsulation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inheritance becomes dangerous&lt;/li&gt;
&lt;li&gt;Polymorphism becomes unpredictable&lt;/li&gt;
&lt;li&gt;Abstractions leak&lt;/li&gt;
&lt;li&gt;Concurrency issues increase&lt;/li&gt;
&lt;li&gt;Testing becomes harder&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Encapsulation is not a syntax feature.&lt;/p&gt;

&lt;p&gt;It is an architectural constraint.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Insight
&lt;/h2&gt;

&lt;p&gt;The goal of encapsulation is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Make invalid states unrepresentable.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If your object depends on external discipline to remain valid,&lt;br&gt;
it is not encapsulated.&lt;/p&gt;

&lt;p&gt;Encapsulation is the first pillar for a reason.&lt;/p&gt;

&lt;p&gt;It protects your domain from chaos.&lt;/p&gt;




&lt;h2&gt;
  
  
  Thanks for reading!
&lt;/h2&gt;

&lt;p&gt;If you have any questions, complaints or tips, you can leave them here in the comments. I will be happy to answer!&lt;br&gt;
😊😊 See you! 😊😊&lt;/p&gt;




&lt;h2&gt;
  
  
  Support Me
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/channel/UCXm0xRtDRrdnvkW24WmkBqA" rel="noopener noreferrer"&gt;Youtube - WalterNascimentoBarroso&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/walternascimentobarroso" rel="noopener noreferrer"&gt;Github - WalterNascimentoBarroso&lt;/a&gt;&lt;br&gt;
&lt;a href="https://codepen.io" rel="noopener noreferrer"&gt;Codepen - WalterNascimentoBarroso&lt;/a&gt;&lt;/p&gt;

</description>
      <category>oop</category>
      <category>webdev</category>
      <category>softwareengineering</category>
      <category>programming</category>
    </item>
    <item>
      <title>Binary: The Language Your Computer Actually Speaks</title>
      <dc:creator>Walter Nascimento</dc:creator>
      <pubDate>Mon, 23 Feb 2026 19:57:39 +0000</pubDate>
      <link>https://dev.to/walternascimentobarroso/binary-the-language-your-computer-actually-speaks-1ldk</link>
      <guid>https://dev.to/walternascimentobarroso/binary-the-language-your-computer-actually-speaks-1ldk</guid>
      <description>&lt;p&gt;Everything in software engineering eventually collapses into something extremely simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0 and 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not strings.&lt;br&gt;
Not objects.&lt;br&gt;
Not JSON.&lt;br&gt;
Not even machine instructions in the way we imagine them.&lt;/p&gt;

&lt;p&gt;Just electrical states.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you truly want to understand how computers work, you need to understand binary and how it eventually becomes text through something like ASCII.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let’s break it down from the absolute beginning.&lt;/p&gt;


&lt;h2&gt;
  
  
  What Is Binary?
&lt;/h2&gt;

&lt;p&gt;Binary is a &lt;strong&gt;base-2 number system&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;While humans use base-10 (0–9), computers use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0
1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because hardware operates on physical states:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Off / On&lt;/li&gt;
&lt;li&gt;Low voltage / High voltage&lt;/li&gt;
&lt;li&gt;False / True&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Transistors, the building blocks of CPUs can only represent two stable states. That maps perfectly to binary digits.&lt;/p&gt;

&lt;p&gt;That’s why computers don’t "prefer" binary.&lt;/p&gt;

&lt;p&gt;They are physically built around it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is a Bit?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;bit&lt;/strong&gt; (binary digit) is the smallest unit of information.&lt;/p&gt;

&lt;p&gt;It can only be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0
or
1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alone, a bit isn’t very useful.&lt;/p&gt;

&lt;p&gt;But when you combine them, something powerful happens.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is a Byte?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;byte&lt;/strong&gt; is a group of 8 bits.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;00000000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With 8 bits, we can represent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2^8 = 256 possible values
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That means:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0 to 255
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the first important turning point.&lt;/p&gt;

&lt;p&gt;Because now we can represent numbers.&lt;/p&gt;

&lt;p&gt;And once we can represent numbers, we can represent anything.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Binary Represents Numbers
&lt;/h2&gt;

&lt;p&gt;Binary works exactly like decimal except each position represents a power of 2 instead of 10.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1010₂
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each position means:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1×2³ + 0×2² + 1×2¹ + 0×2⁰
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which equals:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;8 + 0 + 2 + 0 = 10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1010₂ = 10₁₀
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It’s not magic.&lt;/p&gt;

&lt;p&gt;It’s just positional notation.&lt;/p&gt;




&lt;h2&gt;
  
  
  So How Do Numbers Become Letters?
&lt;/h2&gt;

&lt;p&gt;Here’s where things get interesting.&lt;/p&gt;

&lt;p&gt;Computers don’t understand letters.&lt;/p&gt;

&lt;p&gt;They understand numbers.&lt;/p&gt;

&lt;p&gt;So we need a mapping:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Number → Character
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That mapping is called &lt;strong&gt;ASCII&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is ASCII?
&lt;/h2&gt;

&lt;p&gt;ASCII stands for:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;American Standard Code for Information Interchange&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It’s simply a table that assigns numbers to characters.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Decimal&lt;/th&gt;
&lt;th&gt;Binary&lt;/th&gt;
&lt;th&gt;Character&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;01000001&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;66&lt;/td&gt;
&lt;td&gt;01000010&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;97&lt;/td&gt;
&lt;td&gt;01100001&lt;/td&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So when you type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The computer stores:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;65
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which in binary is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;01000001
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it.&lt;/p&gt;

&lt;p&gt;There is no “A” inside the computer.&lt;/p&gt;

&lt;p&gt;Only numbers.&lt;br&gt;
Only bits.&lt;/p&gt;


&lt;h2&gt;
  
  
  Let’s Decode a Real Example
&lt;/h2&gt;

&lt;p&gt;Take this binary sequence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;01001000 01101001
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Break it into bytes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;01001000 = 72
01101001 = 105
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now check ASCII:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;72  → H
105 → i
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s how text exists inside memory.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Full Journey: From Electricity to Text
&lt;/h2&gt;

&lt;p&gt;Let’s connect everything:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Electricity changes state (on/off).&lt;/li&gt;
&lt;li&gt;That becomes 0 or 1.&lt;/li&gt;
&lt;li&gt;Bits form bytes (8 bits).&lt;/li&gt;
&lt;li&gt;Bytes represent numbers (0–255).&lt;/li&gt;
&lt;li&gt;Numbers map to characters using ASCII.&lt;/li&gt;
&lt;li&gt;The operating system renders the character on your screen.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every string in your code follows this pipeline.&lt;/p&gt;

&lt;p&gt;Every log.&lt;br&gt;
Every API response.&lt;br&gt;
Every database record.&lt;/p&gt;

&lt;p&gt;Still just bits.&lt;/p&gt;


&lt;h2&gt;
  
  
  But ASCII Isn’t Enough
&lt;/h2&gt;

&lt;p&gt;The original ASCII uses &lt;strong&gt;7 bits&lt;/strong&gt; (128 characters).&lt;/p&gt;

&lt;p&gt;That works for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic English letters&lt;/li&gt;
&lt;li&gt;Numbers&lt;/li&gt;
&lt;li&gt;Symbols&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But it doesn’t support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accents (é, ç, ñ)&lt;/li&gt;
&lt;li&gt;Asian languages&lt;/li&gt;
&lt;li&gt;Emojis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s why modern systems use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unicode&lt;/li&gt;
&lt;li&gt;UTF-8&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But even UTF-8?&lt;/p&gt;

&lt;p&gt;Still binary underneath.&lt;/p&gt;

&lt;p&gt;Always binary.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why This Matters for Engineers
&lt;/h2&gt;

&lt;p&gt;Understanding binary is not about memorizing conversions.&lt;/p&gt;

&lt;p&gt;It’s about understanding abstraction layers.&lt;/p&gt;

&lt;p&gt;When something breaks due to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Encoding issues&lt;/li&gt;
&lt;li&gt;Corrupted data&lt;/li&gt;
&lt;li&gt;Serialization bugs&lt;/li&gt;
&lt;li&gt;“Invalid byte sequence” errors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You are no longer debugging strings.&lt;/p&gt;

&lt;p&gt;You are debugging binary representations.&lt;/p&gt;

&lt;p&gt;The engineer who understands the foundation solves problems faster.&lt;/p&gt;

&lt;p&gt;The one who ignores it stays confused at the surface.&lt;/p&gt;


&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;Computers don’t understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code&lt;/li&gt;
&lt;li&gt;APIs&lt;/li&gt;
&lt;li&gt;JSON&lt;/li&gt;
&lt;li&gt;Databases&lt;/li&gt;
&lt;li&gt;Frameworks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They understand:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0 and 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything else is abstraction.&lt;/p&gt;

&lt;p&gt;And the better you understand the bottom layer,&lt;br&gt;
the stronger your engineering intuition becomes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Thanks for reading!
&lt;/h2&gt;

&lt;p&gt;If you have any questions, complaints or tips, you can leave them here in the comments. I will be happy to answer!&lt;br&gt;
😊😊 See you! 😊😊&lt;/p&gt;




&lt;h2&gt;
  
  
  Support Me
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/channel/UCXm0xRtDRrdnvkW24WmkBqA" rel="noopener noreferrer"&gt;Youtube - WalterNascimentoBarroso&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/walternascimentobarroso" rel="noopener noreferrer"&gt;Github - WalterNascimentoBarroso&lt;/a&gt;&lt;br&gt;
&lt;a href="https://codepen.io" rel="noopener noreferrer"&gt;Codepen - WalterNascimentoBarroso&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>computerscience</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>YAGNI: The Principle That Protects You From Building the Future Too Early</title>
      <dc:creator>Walter Nascimento</dc:creator>
      <pubDate>Thu, 12 Feb 2026 18:42:30 +0000</pubDate>
      <link>https://dev.to/walternascimentobarroso/yagni-the-principle-that-protects-you-from-building-the-future-too-early-2o7d</link>
      <guid>https://dev.to/walternascimentobarroso/yagni-the-principle-that-protects-you-from-building-the-future-too-early-2o7d</guid>
      <description>&lt;p&gt;Most developers don’t struggle with laziness.&lt;/p&gt;

&lt;p&gt;They struggle with imagination.&lt;/p&gt;

&lt;p&gt;We imagine scale.&lt;br&gt;
We imagine new features.&lt;br&gt;
We imagine flexibility.&lt;br&gt;
We imagine “what if”.&lt;/p&gt;

&lt;p&gt;And that’s exactly where &lt;strong&gt;YAGNI&lt;/strong&gt; comes in.&lt;/p&gt;




&lt;h2&gt;
  
  
  What YAGNI Really Means
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;YAGNI&lt;/strong&gt; stands for:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;You Aren’t Gonna Need It&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The rule is brutally simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you don’t need it now, don’t build it now.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not “just in case”.&lt;br&gt;
Not because it looks architecturally elegant.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where YAGNI Came From
&lt;/h2&gt;

&lt;p&gt;YAGNI was introduced as part of &lt;strong&gt;Extreme Programming (XP)&lt;/strong&gt; in the late 1990s by &lt;strong&gt;Kent Beck&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Extreme Programming challenged traditional software thinking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deliver fast&lt;/li&gt;
&lt;li&gt;Iterate often&lt;/li&gt;
&lt;li&gt;Refactor constantly&lt;/li&gt;
&lt;li&gt;Avoid speculative design&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of predicting every future scenario, XP embraced incremental evolution.&lt;/p&gt;

&lt;p&gt;YAGNI became one of its core disciplines.&lt;/p&gt;

&lt;p&gt;Not because future-proofing is bad.&lt;/p&gt;

&lt;p&gt;But because speculative complexity is expensive.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Enemy: Speculative Engineering
&lt;/h2&gt;

&lt;p&gt;Most violations of YAGNI look intelligent.&lt;/p&gt;

&lt;p&gt;They look like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adding abstraction layers “for scalability”&lt;/li&gt;
&lt;li&gt;Creating interfaces for implementations that don’t exist&lt;/li&gt;
&lt;li&gt;Building configuration systems before variation is real&lt;/li&gt;
&lt;li&gt;Designing for multi-tenancy with a single client&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The reasoning is always the same:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“We might need this.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But most of the time?&lt;/p&gt;

&lt;p&gt;You won’t.&lt;/p&gt;

&lt;p&gt;And you just increased:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cognitive load&lt;/li&gt;
&lt;li&gt;Maintenance cost&lt;/li&gt;
&lt;li&gt;Bug surface area&lt;/li&gt;
&lt;li&gt;Onboarding friction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All for a future that never arrived.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Simple Example
&lt;/h2&gt;

&lt;p&gt;Let’s say you only use Stripe.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Overengineered version
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PaymentStrategy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;pass&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;StripeStrategy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PaymentStrategy&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Processing &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; with Stripe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PayPalStrategy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PaymentStrategy&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Processing &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; with PayPal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PaymentProcessor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PaymentStrategy&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strategy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;strategy&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looks clean.&lt;br&gt;
Looks extensible.&lt;br&gt;
Looks “architectural”.&lt;/p&gt;

&lt;p&gt;But there is no PayPal.&lt;br&gt;
There is no roadmap.&lt;br&gt;
There is no second gateway.&lt;/p&gt;

&lt;p&gt;You built optionality that does not exist.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ YAGNI version
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PaymentProcessor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Processing &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; with Stripe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple.&lt;br&gt;
Clear.&lt;br&gt;
Honest.&lt;/p&gt;

&lt;p&gt;If PayPal becomes real?&lt;/p&gt;

&lt;p&gt;You refactor.&lt;/p&gt;

&lt;p&gt;And refactoring is cheaper than maintaining imaginary flexibility.&lt;/p&gt;




&lt;h2&gt;
  
  
  “But What About Scaling?”
&lt;/h2&gt;

&lt;p&gt;This is where people panic.&lt;/p&gt;

&lt;p&gt;They think YAGNI means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ignore design&lt;/li&gt;
&lt;li&gt;Ignore growth&lt;/li&gt;
&lt;li&gt;Ignore architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It doesn’t.&lt;/p&gt;

&lt;p&gt;YAGNI doesn’t reject foresight.&lt;br&gt;
It rejects speculation without evidence.&lt;/p&gt;

&lt;p&gt;There’s a famous quote by &lt;strong&gt;Donald Knuth&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Premature optimization is the root of all evil.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;YAGNI applies the same logic to architecture.&lt;/p&gt;

&lt;p&gt;Premature abstraction is just optimization’s cousin.&lt;/p&gt;




&lt;h2&gt;
  
  
  YAGNI Is About Timing
&lt;/h2&gt;

&lt;p&gt;Engineering is not about building everything correctly on day one.&lt;/p&gt;

&lt;p&gt;It’s about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building what’s necessary&lt;/li&gt;
&lt;li&gt;Validating assumptions&lt;/li&gt;
&lt;li&gt;Refactoring when reality demands change&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not when imagination suggests it might.&lt;/p&gt;

&lt;p&gt;The best engineers don’t design for every possible future.&lt;/p&gt;

&lt;p&gt;They design for change.&lt;/p&gt;

&lt;p&gt;That’s different.&lt;/p&gt;




&lt;h2&gt;
  
  
  When YAGNI Does NOT Apply
&lt;/h2&gt;

&lt;p&gt;YAGNI is powerful.&lt;br&gt;
But not absolute.&lt;/p&gt;

&lt;p&gt;You should not apply YAGNI when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requirements are contractual and confirmed&lt;/li&gt;
&lt;li&gt;Multiple implementations are guaranteed&lt;/li&gt;
&lt;li&gt;Public APIs must remain stable&lt;/li&gt;
&lt;li&gt;The cost of change later is extremely high&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;YAGNI fights uncertainty-driven complexity.&lt;/p&gt;

&lt;p&gt;It does not fight clarity-driven design.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Psychological Side of YAGNI
&lt;/h2&gt;

&lt;p&gt;YAGNI is hard because it challenges ego.&lt;/p&gt;

&lt;p&gt;Developers often want to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prove architectural depth&lt;/li&gt;
&lt;li&gt;Demonstrate pattern knowledge&lt;/li&gt;
&lt;li&gt;Show foresight&lt;/li&gt;
&lt;li&gt;Avoid looking “unprepared”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But mature engineering is not about showing how much you know.&lt;/p&gt;

&lt;p&gt;It’s about delivering the simplest correct solution.&lt;/p&gt;

&lt;p&gt;Restraint is a skill.&lt;/p&gt;

&lt;p&gt;And YAGNI is discipline in action.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Question That Changes Everything
&lt;/h2&gt;

&lt;p&gt;Before adding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A new abstraction&lt;/li&gt;
&lt;li&gt;A new pattern&lt;/li&gt;
&lt;li&gt;A new configuration layer&lt;/li&gt;
&lt;li&gt;A new generic system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ask yourself:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is this solving a real, current problem?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If not…&lt;/p&gt;

&lt;p&gt;You probably aren’t gonna need it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;Software evolves.&lt;/p&gt;

&lt;p&gt;Your system will change.&lt;br&gt;
Requirements will shift.&lt;br&gt;
Users will surprise you.&lt;/p&gt;

&lt;p&gt;Trying to predict everything is not wisdom.&lt;/p&gt;

&lt;p&gt;It’s fear disguised as architecture.&lt;/p&gt;

&lt;p&gt;YAGNI reminds us:&lt;/p&gt;

&lt;p&gt;Build for now.&lt;br&gt;
Refactor when needed.&lt;br&gt;
Trust evolution.&lt;br&gt;
Respect simplicity.&lt;/p&gt;

&lt;p&gt;And most importantly:&lt;/p&gt;

&lt;p&gt;Don’t sacrifice today’s clarity for tomorrow’s imagination.&lt;/p&gt;




&lt;h2&gt;
  
  
  Thanks for reading!
&lt;/h2&gt;

&lt;p&gt;If you have any questions, complaints or tips, you can leave them here in the comments. I will be happy to answer!&lt;br&gt;
😊😊 See you! 😊😊&lt;/p&gt;




&lt;h2&gt;
  
  
  Support Me
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/channel/UCXm0xRtDRrdnvkW24WmkBqA" rel="noopener noreferrer"&gt;Youtube - WalterNascimentoBarroso&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/walternascimentobarroso" rel="noopener noreferrer"&gt;Github - WalterNascimentoBarroso&lt;/a&gt;&lt;br&gt;
&lt;a href="https://codepen.io" rel="noopener noreferrer"&gt;Codepen - WalterNascimentoBarroso&lt;/a&gt;&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>cleancode</category>
      <category>softwaredevelopment</category>
      <category>programming</category>
    </item>
    <item>
      <title>DRY: The Principle That Most Developers Misunderstand</title>
      <dc:creator>Walter Nascimento</dc:creator>
      <pubDate>Wed, 11 Feb 2026 20:15:55 +0000</pubDate>
      <link>https://dev.to/walternascimentobarroso/dry-the-principle-that-most-developers-misunderstand-5ef9</link>
      <guid>https://dev.to/walternascimentobarroso/dry-the-principle-that-most-developers-misunderstand-5ef9</guid>
      <description>&lt;p&gt;Most developers think &lt;strong&gt;DRY (Don’t Repeat Yourself)&lt;/strong&gt; is about avoiding duplicate code.&lt;/p&gt;

&lt;p&gt;It’s not.&lt;/p&gt;

&lt;p&gt;At least, not primarily.&lt;/p&gt;

&lt;p&gt;DRY is about protecting &lt;strong&gt;knowledge integrity inside a system&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And the difference between those two interpretations is what separates someone who “removes duplication” from someone who designs resilient systems.&lt;/p&gt;

&lt;p&gt;Let’s unpack this properly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where DRY Actually Came From
&lt;/h2&gt;

&lt;p&gt;The DRY principle was formally introduced in 1999 in the book &lt;em&gt;The Pragmatic Programmer&lt;/em&gt; by Andrew Hunt and David Thomas.&lt;/p&gt;

&lt;p&gt;But it didn’t emerge as a stylistic suggestion.&lt;/p&gt;

&lt;p&gt;It emerged as a response to a painful, recurring problem in software engineering:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Systems were breaking because knowledge was scattered.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The original formulation was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Every piece of knowledge must have a single, unambiguous, authoritative representation within a system.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Notice something important.&lt;/p&gt;

&lt;p&gt;It says &lt;strong&gt;knowledge&lt;/strong&gt;, not “lines of code.”&lt;/p&gt;

&lt;p&gt;At the end of the 90s, software systems were growing rapidly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Large monoliths&lt;/li&gt;
&lt;li&gt;Increasing web adoption&lt;/li&gt;
&lt;li&gt;Enterprise systems scaling fast&lt;/li&gt;
&lt;li&gt;Low discipline around refactoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When business rules were duplicated across modules, updating them required changing multiple places. Inevitably, someone forgot one.&lt;/p&gt;

&lt;p&gt;The result?&lt;/p&gt;

&lt;p&gt;Inconsistent behavior.&lt;br&gt;
Hidden bugs.&lt;br&gt;
Loss of trust.&lt;/p&gt;

&lt;p&gt;DRY was not about elegance.&lt;/p&gt;

&lt;p&gt;It was about survival.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Real Meaning of DRY
&lt;/h2&gt;

&lt;p&gt;If you reduce DRY to “don’t copy-paste code,” you are already misunderstanding it.&lt;/p&gt;

&lt;p&gt;DRY is about ensuring that &lt;strong&gt;a single business rule, assumption, or decision lives in one authoritative place&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;Bad (violates DRY at the knowledge level):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calculate_vat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.23&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calculate_invoice_total&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;vat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.23&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;vat&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If VAT changes to 21%, you must remember to update two places.&lt;/p&gt;

&lt;p&gt;That’s duplicated knowledge.&lt;/p&gt;

&lt;p&gt;Better:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;VAT_RATE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.23&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calculate_vat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;VAT_RATE&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calculate_invoice_total&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;vat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;calculate_vat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;vat&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the tax rule has a single authoritative representation.&lt;/p&gt;

&lt;p&gt;That’s DRY.&lt;/p&gt;

&lt;p&gt;But here’s where it gets interesting.&lt;/p&gt;




&lt;h2&gt;
  
  
  DRY Is Not About Removing All Repetition
&lt;/h2&gt;

&lt;p&gt;Many developers take DRY too far.&lt;/p&gt;

&lt;p&gt;They see similar-looking code and immediately try to abstract it.&lt;/p&gt;

&lt;p&gt;Two functions look 70% similar?&lt;br&gt;
“Let’s create a generic helper!”&lt;/p&gt;

&lt;p&gt;Three classes share some logic?&lt;br&gt;
“Let’s create a base class!”&lt;/p&gt;

&lt;p&gt;This is where DRY becomes dangerous.&lt;/p&gt;

&lt;p&gt;Because similarity is not identity.&lt;/p&gt;

&lt;p&gt;Two pieces of code can look similar but represent different knowledge.&lt;/p&gt;

&lt;p&gt;And if they evolve differently later, your shared abstraction becomes a liability.&lt;/p&gt;

&lt;p&gt;Experienced engineers ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Will these behaviors change together?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the answer is uncertain, duplication might be safer than premature abstraction.&lt;/p&gt;




&lt;h2&gt;
  
  
  DRY in Modern Architectures
&lt;/h2&gt;

&lt;p&gt;In monoliths, DRY is relatively straightforward.&lt;/p&gt;

&lt;p&gt;In distributed systems, it becomes more nuanced.&lt;/p&gt;

&lt;p&gt;Imagine two microservices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User Service&lt;/li&gt;
&lt;li&gt;Billing Service&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both define a &lt;code&gt;User&lt;/code&gt; model.&lt;/p&gt;

&lt;p&gt;Is that duplication?&lt;/p&gt;

&lt;p&gt;Technically yes.&lt;/p&gt;

&lt;p&gt;Architecturally? Not necessarily.&lt;/p&gt;

&lt;p&gt;If both services depend on a shared library for &lt;code&gt;User&lt;/code&gt;, you create:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Versioning complexity&lt;/li&gt;
&lt;li&gt;Coordinated deployments&lt;/li&gt;
&lt;li&gt;Cross-team coupling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sometimes duplicating the model protects service autonomy.&lt;/p&gt;

&lt;p&gt;In this case, duplication is intentional decoupling.&lt;/p&gt;

&lt;p&gt;That is mature DRY thinking.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why DRY Matters Even More Now
&lt;/h2&gt;

&lt;p&gt;Today software complexity is exploding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Distributed systems&lt;/li&gt;
&lt;li&gt;Cloud-native infrastructure&lt;/li&gt;
&lt;li&gt;CI/CD pipelines&lt;/li&gt;
&lt;li&gt;AI-generated code&lt;/li&gt;
&lt;li&gt;Rapid iteration cycles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI tools, in particular, tend to generate repetitive patterns.&lt;/p&gt;

&lt;p&gt;Without strong architectural discipline, systems accumulate silent duplication of knowledge.&lt;/p&gt;

&lt;p&gt;The consequences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Business rules drift apart&lt;/li&gt;
&lt;li&gt;Bugs appear inconsistently&lt;/li&gt;
&lt;li&gt;Teams lose confidence in behavior predictability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;DRY becomes less about code aesthetics and more about &lt;strong&gt;organizational coherence&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where DRY Fails in Practice
&lt;/h2&gt;

&lt;p&gt;There are common failure patterns:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Premature Abstraction
&lt;/h3&gt;

&lt;p&gt;Developers abstract after noticing two similar implementations.&lt;/p&gt;

&lt;p&gt;But two instances are not a pattern.&lt;/p&gt;

&lt;p&gt;The Rule of Three exists for a reason.&lt;/p&gt;

&lt;p&gt;Abstraction before stabilization creates rigid design.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Over-Centralization
&lt;/h3&gt;

&lt;p&gt;Putting too much logic in a single shared module.&lt;/p&gt;

&lt;p&gt;Now every change becomes high-risk.&lt;/p&gt;

&lt;p&gt;Instead of reducing complexity, you concentrate it.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Accidental Coupling
&lt;/h3&gt;

&lt;p&gt;Shared utility libraries across services.&lt;/p&gt;

&lt;p&gt;Seems efficient.&lt;/p&gt;

&lt;p&gt;But now one small change triggers a cascade of updates.&lt;/p&gt;

&lt;p&gt;DRY at the code level.&lt;br&gt;
Tight coupling at the system level.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Confusing DRY with Reusability
&lt;/h3&gt;

&lt;p&gt;Reusability is a possible outcome of DRY.&lt;/p&gt;

&lt;p&gt;It is not the definition.&lt;/p&gt;

&lt;p&gt;DRY is about knowledge consistency.&lt;br&gt;
Reusability is about convenience.&lt;/p&gt;

&lt;p&gt;They overlap, but they are not identical.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Practical Scenario
&lt;/h2&gt;

&lt;p&gt;Let’s say you’re building an e-commerce platform.&lt;/p&gt;

&lt;p&gt;You have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Checkout service&lt;/li&gt;
&lt;li&gt;Promotion engine&lt;/li&gt;
&lt;li&gt;Tax calculation module&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tax rule is identical across all flows.&lt;/p&gt;

&lt;p&gt;Should you duplicate the tax formula in each service?&lt;/p&gt;

&lt;p&gt;No.&lt;/p&gt;

&lt;p&gt;Because tax calculation is a business invariant.&lt;/p&gt;

&lt;p&gt;It must have one authoritative definition.&lt;/p&gt;

&lt;p&gt;Now consider discount logic.&lt;/p&gt;

&lt;p&gt;Promotions in checkout may differ from internal admin simulation tools.&lt;/p&gt;

&lt;p&gt;They look similar.&lt;/p&gt;

&lt;p&gt;But they evolve independently.&lt;/p&gt;

&lt;p&gt;Forcing them into a shared abstraction may slow down both teams.&lt;/p&gt;

&lt;p&gt;The correct DRY decision depends on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stability of the rule&lt;/li&gt;
&lt;li&gt;Frequency of change&lt;/li&gt;
&lt;li&gt;Organizational structure&lt;/li&gt;
&lt;li&gt;Risk tolerance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is engineering judgment.&lt;/p&gt;

&lt;p&gt;Not dogma.&lt;/p&gt;




&lt;h2&gt;
  
  
  DRY and Engineering Maturity
&lt;/h2&gt;

&lt;p&gt;DRY is not about writing less code.&lt;/p&gt;

&lt;p&gt;It’s about designing systems that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Avoid inconsistent behavior&lt;/li&gt;
&lt;li&gt;Protect business rules&lt;/li&gt;
&lt;li&gt;Scale without logical divergence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But it requires restraint.&lt;/p&gt;

&lt;p&gt;Blind DRY leads to over-engineering.&lt;br&gt;
Ignoring DRY leads to entropy.&lt;/p&gt;

&lt;p&gt;The real skill lies in balance.&lt;/p&gt;

&lt;p&gt;And that balance is what turns a developer into an engineer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;DRY is not a rule to apply mechanically.&lt;/p&gt;

&lt;p&gt;It is a lens to examine how knowledge flows through your system.&lt;/p&gt;

&lt;p&gt;When applied correctly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It reduces systemic fragility.&lt;/li&gt;
&lt;li&gt;It improves maintainability.&lt;/li&gt;
&lt;li&gt;It increases trust in behavior consistency.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When applied blindly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It creates tight coupling.&lt;/li&gt;
&lt;li&gt;It freezes evolution.&lt;/li&gt;
&lt;li&gt;It increases cognitive overhead.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So next time you see duplication, don’t rush to refactor.&lt;/p&gt;

&lt;p&gt;Pause.&lt;/p&gt;

&lt;p&gt;And ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Are these two pieces of code the same knowledge, or just similar shapes?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That answer will define the quality of your system.&lt;/p&gt;

&lt;p&gt;And your level as an engineer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Thanks for reading!
&lt;/h2&gt;

&lt;p&gt;If you have any questions, complaints or tips, you can leave them here in the comments. I will be happy to answer!&lt;br&gt;
😊😊 See you! 😊😊&lt;/p&gt;




&lt;h2&gt;
  
  
  Support Me
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/channel/UCXm0xRtDRrdnvkW24WmkBqA" rel="noopener noreferrer"&gt;Youtube - WalterNascimentoBarroso&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/walternascimentobarroso" rel="noopener noreferrer"&gt;Github - WalterNascimentoBarroso&lt;/a&gt;&lt;br&gt;
&lt;a href="https://codepen.io" rel="noopener noreferrer"&gt;Codepen - WalterNascimentoBarroso&lt;/a&gt;&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>cleancode</category>
      <category>softwaredevelopment</category>
      <category>programming</category>
    </item>
    <item>
      <title>KISS: The Principle That Turns a Junior into a Real Engineer</title>
      <dc:creator>Walter Nascimento</dc:creator>
      <pubDate>Wed, 11 Feb 2026 11:22:50 +0000</pubDate>
      <link>https://dev.to/walternascimentobarroso/kiss-the-principle-that-turns-a-junior-into-a-real-engineer-5eij</link>
      <guid>https://dev.to/walternascimentobarroso/kiss-the-principle-that-turns-a-junior-into-a-real-engineer-5eij</guid>
      <description>&lt;p&gt;If you're at that stage where you're no longer just “writing code” but starting to think about &lt;strong&gt;architecture, trade-offs, and maintainability&lt;/strong&gt;, this article is for you.&lt;/p&gt;

&lt;p&gt;KISS is not just a catchy acronym.&lt;br&gt;
It’s a maturity filter.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where Did KISS Come From?
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;KISS principle&lt;/strong&gt; emerged in the &lt;strong&gt;1960s&lt;/strong&gt;, in the context of aerospace and military engineering — not software.&lt;/p&gt;

&lt;p&gt;It is attributed to Kelly Johnson, the lead engineer at Lockheed Skunk Works, the division responsible for projects like the legendary SR-71 Blackbird.&lt;/p&gt;

&lt;p&gt;The original phrase:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Keep it simple, stupid.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The word “stupid” was not an insult.&lt;br&gt;
It was a design constraint.&lt;/p&gt;

&lt;p&gt;The idea was simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A system should be simple enough to be maintained by an average person, under pressure, in real-world conditions.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Real Problem He Was Solving
&lt;/h2&gt;

&lt;p&gt;The aircraft built by Skunk Works needed to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Be repaired &lt;strong&gt;in the field&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;With &lt;strong&gt;basic tools&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;By &lt;strong&gt;non-specialist technicians&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;hostile and urgent conditions&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kelly Johnson imposed a strict rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If it cannot be easily explained, maintained, and repaired, the design is wrong.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Complexity = risk.&lt;br&gt;
In aviation, risk = death.&lt;/p&gt;

&lt;p&gt;Now replace “aircraft” with “production system.”&lt;/p&gt;




&lt;h2&gt;
  
  
  How This Applies to Software
&lt;/h2&gt;

&lt;p&gt;Decades later, software engineers realized they were making the same mistake:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Brilliant” systems no one understands&lt;/li&gt;
&lt;li&gt;Beautiful architectures that collapse under change&lt;/li&gt;
&lt;li&gt;Codebases that become unmaintainable after 6 months&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;KISS became one of the foundational principles of software engineering.&lt;/p&gt;

&lt;p&gt;But here’s the key difference between a junior and someone becoming mid-level:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Juniors try to prove how much they know.&lt;/li&gt;
&lt;li&gt;Mid-level engineers try to reduce complexity.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  KISS in Practice (With Python Examples)
&lt;/h2&gt;

&lt;p&gt;Let’s move from theory to code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Example 1 — Premature Abstraction
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ❌ “Architectural” Solution
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PriceCalculatorStrategy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nb"&gt;NotImplementedError&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DefaultPriceCalculator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PriceCalculatorStrategy&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;1.2&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CheckoutService&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PriceCalculatorStrategy&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strategy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;strategy&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;final_price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looks clean.&lt;br&gt;
Feels “enterprise.”&lt;/p&gt;

&lt;p&gt;But what if the system only needs one tax rule?&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ KISS Version
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calculate_final_price&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;TAX_RATE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.2&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;TAX_RATE&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Until you actually need multiple strategies, this is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clearer&lt;/li&gt;
&lt;li&gt;Faster to modify&lt;/li&gt;
&lt;li&gt;Easier to debug&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;KISS doesn’t reject design patterns.&lt;/p&gt;

&lt;p&gt;It rejects &lt;strong&gt;patterns without problems&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Example 2 — Clever vs Clear
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ❌ Clever (but confusing)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compact? Yes.&lt;br&gt;
Readable? Debatable.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ KISS Version
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_valid_number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;is_valid_number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Logic is reusable&lt;/li&gt;
&lt;li&gt;Easier to test&lt;/li&gt;
&lt;li&gt;Easier to explain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;KISS often means naming things properly instead of compressing them.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Shift From Junior to Mid-Level
&lt;/h2&gt;

&lt;p&gt;Here’s what changes in your thinking:&lt;/p&gt;

&lt;h3&gt;
  
  
  Junior mindset:
&lt;/h3&gt;

&lt;p&gt;“How can I make this elegant?”&lt;/p&gt;

&lt;h3&gt;
  
  
  Growing engineer mindset:
&lt;/h3&gt;

&lt;p&gt;“How can I make this obvious?”&lt;/p&gt;

&lt;p&gt;You start asking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Will someone understand this at 3AM?&lt;/li&gt;
&lt;li&gt;Am I solving a real problem?&lt;/li&gt;
&lt;li&gt;Is this abstraction justified today?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s professional maturity.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Most Important Line
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Code is read far more often than it is written.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If your code is not obvious, it is expensive.&lt;/p&gt;

&lt;p&gt;Simple code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reduces onboarding time&lt;/li&gt;
&lt;li&gt;Reduces bugs&lt;/li&gt;
&lt;li&gt;Reduces cognitive load&lt;/li&gt;
&lt;li&gt;Reduces ego-driven architecture&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;Next time you are about to add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One more abstraction&lt;/li&gt;
&lt;li&gt;One more layer&lt;/li&gt;
&lt;li&gt;One more pattern&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Does this solve a real problem right now?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If not, you might be violating KISS.&lt;/p&gt;

&lt;p&gt;Simplicity is not lack of skill.&lt;br&gt;
It is controlled intelligence.&lt;/p&gt;

&lt;p&gt;And that is what separates someone who writes code&lt;br&gt;
from someone who builds systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Thanks for reading!
&lt;/h2&gt;

&lt;p&gt;If you have any questions, complaints or tips, you can leave them here in the comments. I will be happy to answer!&lt;br&gt;
😊😊 See you! 😊😊&lt;/p&gt;




&lt;h2&gt;
  
  
  Support Me
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/channel/UCXm0xRtDRrdnvkW24WmkBqA" rel="noopener noreferrer"&gt;Youtube - WalterNascimentoBarroso&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/walternascimentobarroso" rel="noopener noreferrer"&gt;Github - WalterNascimentoBarroso&lt;/a&gt;&lt;br&gt;
&lt;a href="https://codepen.io" rel="noopener noreferrer"&gt;Codepen - WalterNascimentoBarroso&lt;/a&gt;&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>cleancode</category>
      <category>softwaredevelopment</category>
      <category>programming</category>
    </item>
    <item>
      <title>What is an API? A Technical and Fun Explanation 🍽️🤖</title>
      <dc:creator>Walter Nascimento</dc:creator>
      <pubDate>Wed, 20 Nov 2024 12:37:16 +0000</pubDate>
      <link>https://dev.to/walternascimentobarroso/what-is-an-api-a-technical-and-fun-explanation-bp2</link>
      <guid>https://dev.to/walternascimentobarroso/what-is-an-api-a-technical-and-fun-explanation-bp2</guid>
      <description>&lt;p&gt;APIs are everywhere! Whether you're using apps to order food, watch videos, or check the weather, you're interacting with APIs, often without realizing it. But what exactly is an API? In this article, we’ll explain the concept technically and then illustrate it with simple and fun examples, like helper robots or waiters in a restaurant. Let’s dive in! 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  What is an API?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Technical Explanation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;API&lt;/strong&gt; stands for &lt;strong&gt;Application Programming Interface&lt;/strong&gt;. In technical terms, it is a set of rules that defines how different systems or applications can communicate and exchange information.&lt;/p&gt;

&lt;p&gt;APIs act as "bridges" between systems, enabling them to connect without needing to understand how the other works internally. They handle requests (data or action queries) and responses (data or confirmation results).&lt;/p&gt;

&lt;h4&gt;
  
  
  How Does it Work?
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;A system sends a request to the API.&lt;/li&gt;
&lt;li&gt;The API processes the request and responds with the data or the result of the action.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For example, when you want to see a random cat image, you can make a request to The Cat API:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Request:&lt;/strong&gt; &lt;code&gt;GET https://api.thecatapi.com/v1/images/search&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Response:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mtz9"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://cdn2.thecatapi.com/images/mtz9.jpg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"width"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"height"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;375&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This API call returns a random image of a cat, which the app can then display to you. This clear, standardized format allows the app to communicate with The Cat API to fetch data in a way that both systems understand.&lt;/p&gt;

&lt;h3&gt;
  
  
  Simplifying: How Does it Work in Real Life?
&lt;/h3&gt;

&lt;p&gt;Now that we’ve covered the basics, let’s imagine two simple scenarios to explain APIs in a more relatable way.&lt;/p&gt;

&lt;h4&gt;
  
  
  APIs as Helper Robots 🤖
&lt;/h4&gt;

&lt;p&gt;Imagine you’re playing with a friend and want a blue piece from their toy set. Instead of rummaging through their toy box, you ask a helper robot to get it for you.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You tell the robot: "Bring me a blue piece!"&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;robot&lt;/strong&gt; understands your request, goes to your friend's toy box, and brings the piece to you.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The &lt;strong&gt;robot&lt;/strong&gt; is the &lt;strong&gt;API&lt;/strong&gt;. It acts as a bridge between you and your friend’s toy box, fetching what you need without you having to dig through the box. Similarly, an API connects two systems and exchanges information without revealing how the other side works.&lt;/p&gt;

&lt;p&gt;A real-world example? When you log in to a website using your Google account, the site uses an API to ask Google for the information it needs to authenticate you.&lt;/p&gt;

&lt;h4&gt;
  
  
  APIs as Waiters in a Restaurant 🍴
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjeukxpakduwtobac4htg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjeukxpakduwtobac4htg.png" alt=" " width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, imagine you’re at a restaurant and want to order a pizza. You can’t go into the kitchen, so you talk to the waiter:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You say: "I’d like a pepperoni pizza, please!"&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;waiter&lt;/strong&gt; writes down your order and takes it to the kitchen.&lt;/li&gt;
&lt;li&gt;The kitchen prepares the pizza, and the waiter brings it to you.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The &lt;strong&gt;waiter&lt;/strong&gt; is like an &lt;strong&gt;API&lt;/strong&gt;. They are the intermediary that translates your request into something the kitchen (the system) understands and then brings the result back to you.&lt;/p&gt;

&lt;p&gt;This concept applies to any digital integration. For example, when you order food via a delivery app, it uses APIs to connect to restaurants and display your order on your screen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion 🎯
&lt;/h2&gt;

&lt;p&gt;APIs are essential in the digital world, connecting systems and applications efficiently. While they might seem complex from a technical perspective, their role is simple and straightforward: to act as an intermediary between systems, facilitating the exchange of information.&lt;/p&gt;

&lt;p&gt;Whether as a helper robot fetching toys or a waiter taking your order, APIs make digital interactions seamless and practical. Next time you use an app, remember—there’s an API working behind the scenes to make it all possible! 🌐&lt;/p&gt;




&lt;h2&gt;
  
  
  Thanks for reading!
&lt;/h2&gt;

&lt;p&gt;If you have any questions, complaints or tips, you can leave them here in the comments. I will be happy to answer!&lt;br&gt;
😊😊 See you! 😊😊&lt;/p&gt;




&lt;h2&gt;
  
  
  Support Me
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/channel/UCXm0xRtDRrdnvkW24WmkBqA" rel="noopener noreferrer"&gt;Youtube - WalterNascimentoBarroso&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/walternascimentobarroso" rel="noopener noreferrer"&gt;Github - WalterNascimentoBarroso&lt;/a&gt;&lt;br&gt;
&lt;a href="https://codepen.io" rel="noopener noreferrer"&gt;Codepen - WalterNascimentoBarroso&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>PHPStan: Improve the Quality of Your PHP Code</title>
      <dc:creator>Walter Nascimento</dc:creator>
      <pubDate>Mon, 09 Sep 2024 11:14:29 +0000</pubDate>
      <link>https://dev.to/walternascimentobarroso/phpstan-improve-the-quality-of-your-php-code-5f4h</link>
      <guid>https://dev.to/walternascimentobarroso/phpstan-improve-the-quality-of-your-php-code-5f4h</guid>
      <description>&lt;h2&gt;
  
  
  What is PHPStan?
&lt;/h2&gt;

&lt;p&gt;PHPStan (PHP Static Analysis Tool) is a tool that analyzes PHP code to find bugs and issues without executing it. It does this by examining the source code and checking for inconsistencies, such as incorrect variable types, method calls on null objects, and other common mistakes. This is done through static analysis, which is the examination of code without executing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing PHPStan
&lt;/h2&gt;

&lt;p&gt;To get started with PHPStan, you need to install it in your project. The most common way to install PHPStan is via Composer. Follow these steps to install it:&lt;/p&gt;

&lt;h3&gt;
  
  
  Install PHPStan via Composer
&lt;/h3&gt;

&lt;p&gt;Open a terminal and run the following command to add PHPStan as a development dependency to your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require &lt;span class="nt"&gt;--dev&lt;/span&gt; phpstan/phpstan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--dev&lt;/code&gt; flag ensures that PHPStan is installed as a development dependency only.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verify the Installation
&lt;/h3&gt;

&lt;p&gt;After installation, you can verify if PHPStan was installed correctly by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vendor/bin/phpstan &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This should display the installed version of PHPStan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuring PHPStan with &lt;code&gt;.neon&lt;/code&gt; File
&lt;/h2&gt;

&lt;p&gt;PHPStan can be configured using a &lt;code&gt;.neon&lt;/code&gt; configuration file. This file allows you to define rules, configure analysis levels, and tailor the analysis to your specific project needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Basic &lt;code&gt;.neon&lt;/code&gt; Configuration File
&lt;/h3&gt;

&lt;p&gt;Here is a basic example of PHPStan configuration using a &lt;code&gt;.neon&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;parameters:
    level: 7
    paths:
        - src
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Explanation of Configurations
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;level&lt;/strong&gt;: Defines the rigor level of the analysis. 7 is quite strict, but you can adjust it as needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;paths&lt;/strong&gt;: Defines the directories PHPStan should analyze. In the example, the src directory is analyzed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Creating Configuration Files for the Team and Ignoring Personal Configurations in Git
&lt;/h4&gt;

&lt;p&gt;It’s a good practice to create a general configuration file for the team and add a &lt;code&gt;.gitignore&lt;/code&gt; to avoid versioning personal configurations.&lt;/p&gt;

&lt;p&gt;Create a general project configuration file, for example, &lt;code&gt;phpstan.neon&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;includes:
    - phpstan.dist.neon

parameters:
    level: 6

    ignoreErrors:
        - '#Attribute class JetBrains\\PhpStorm\\Pure does not exist#'
        - '#Attribute class JetBrains\\PhpStorm\\NoReturn does not exist#'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And a team-specific configuration file, for example, &lt;code&gt;phpstan.dist.neon&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;parameters:
    level: max
    paths:
        - src
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add personal configuration files to &lt;code&gt;.gitignore&lt;/code&gt; to keep them out of version control:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;phpstan.neon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to Run PHPStan
&lt;/h2&gt;

&lt;p&gt;Once PHPStan is installed and configured, you can run it to analyze your code. Here are the basic commands to run PHPStan:&lt;/p&gt;

&lt;h3&gt;
  
  
  Run Analysis
&lt;/h3&gt;

&lt;p&gt;To run a basic analysis using the default configuration (your &lt;code&gt;phpstan.neon&lt;/code&gt; file), use the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vendor/bin/phpstan analyse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command performs static analysis of your PHP code as defined in the &lt;code&gt;.neon&lt;/code&gt; configuration file.&lt;/p&gt;

&lt;h3&gt;
  
  
  Run Analysis with Specific Configuration
&lt;/h3&gt;

&lt;p&gt;If you have multiple configuration files and want to specify which one to use, you can use the &lt;code&gt;--config&lt;/code&gt; option:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vendor/bin/phpstan analyse &lt;span class="nt"&gt;--config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;phpstan-team.neon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command allows you to choose which configuration to apply during the analysis.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check Analysis Levels
&lt;/h3&gt;

&lt;p&gt;PHPStan allows you to set rigor levels from 0 to 8. Higher levels provide more stringent analysis. To run the analysis with a specific level, you can set the level directly in the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vendor/bin/phpstan analyse &lt;span class="nt"&gt;--level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;max
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The max level is the most stringent, and you can replace max with a specific number as needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example of Before and After
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Original Code (Before)
&lt;/h3&gt;

&lt;p&gt;Consider the following PHP code that manipulates a user array:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getUserAge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'age'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'John Doe'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// 'age' is missing&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="nv"&gt;$age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getUserAge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"User age: &lt;/span&gt;&lt;span class="nv"&gt;$age&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  PHPStan Analysis
&lt;/h3&gt;

&lt;p&gt;When PHPStan analyzes the above code, it may point out that the age index is missing in the $user array, but the code tries to access it directly. This could lead to a runtime error if the age index is not present in the array.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adjusted Code (After)
&lt;/h3&gt;

&lt;p&gt;To fix this and meet PHPStan’s expectations, you can adjust the function to check if the age index is present before accessing it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getUserAge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'age'&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RuntimeException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Age is not set in the user array'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'age'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'John Doe'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;// 'age' is still missing, but now the code throws an exception if it’s missing&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getUserAge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"User age: &lt;/span&gt;&lt;span class="nv"&gt;$age&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;RuntimeException&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Error: "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getMessage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Explanation of Changes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Index Existence Check&lt;/strong&gt;: Adds a check to ensure the age index is present in the array before accessing it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exception Handling&lt;/strong&gt;: Throws an exception if the age index is missing and handles the exception when calling the function.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;PHPStan is a powerful tool for improving the quality of your PHP code through static analysis. Installing it is simple and quick with Composer. Configuring it correctly and adjusting its rules can help you find and fix issues before they become real bugs. Use the &lt;code&gt;.neon&lt;/code&gt; file to customize PHPStan’s configuration, and remember to add personal configuration files to &lt;code&gt;.gitignore&lt;/code&gt; to keep your repository clean and organized.&lt;/p&gt;




&lt;h2&gt;
  
  
  Thanks for reading!
&lt;/h2&gt;

&lt;p&gt;If you have any questions, complaints or tips, you can leave them here in the comments. I will be happy to answer!&lt;br&gt;
😊😊 See you! 😊😊&lt;/p&gt;




&lt;h2&gt;
  
  
  Support Me
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/channel/UCXm0xRtDRrdnvkW24WmkBqA" rel="noopener noreferrer"&gt;Youtube - WalterNascimentoBarroso&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/walternascimentobarroso" rel="noopener noreferrer"&gt;Github - WalterNascimentoBarroso&lt;/a&gt;&lt;br&gt;
&lt;a href="https://codepen.io" rel="noopener noreferrer"&gt;Codepen - WalterNascimentoBarroso&lt;/a&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>code</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>PHP_CodeSniffer: Detect code standards violations</title>
      <dc:creator>Walter Nascimento</dc:creator>
      <pubDate>Fri, 06 Sep 2024 08:20:28 +0000</pubDate>
      <link>https://dev.to/walternascimentobarroso/using-phpcodesniffer-installation-configuration-and-practical-examples-10nl</link>
      <guid>https://dev.to/walternascimentobarroso/using-phpcodesniffer-installation-configuration-and-practical-examples-10nl</guid>
      <description>&lt;p&gt;&lt;strong&gt;PHP_CodeSniffer (PHPCS)&lt;/strong&gt; is a widely used tool to ensure that PHP code follows coding standards like PSR-12, among others. In this article, learn how to install PHP_CodeSniffer locally, globally, and in Docker, set PSR-12 as the default, configure your project to report errors, automatically fix issues with PHPCBF, and use XML reports.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing PHP_CodeSniffer
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Local Installation via Composer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To install PHP_CodeSniffer for a specific project, run the following command in your project's root directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require &lt;span class="nt"&gt;--dev&lt;/span&gt; &lt;span class="s2"&gt;"squizlabs/php_codesniffer=*"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This installs PHP_CodeSniffer as a development dependency in your project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Global Installation via Composer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To use PHP_CodeSniffer across multiple projects, you can install it globally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer global require &lt;span class="s2"&gt;"squizlabs/php_codesniffer=*"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After global installation, ensure the directory &lt;code&gt;~/.composer/vendor/bin&lt;/code&gt; is in your PATH. Add the following line to your &lt;code&gt;~/.bashrc&lt;/code&gt; (or &lt;code&gt;~/.zshrc&lt;/code&gt; for Zsh users):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.composer/vendor/bin"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then reload your shell configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Installation with Docker&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're using Docker, you can include PHP_CodeSniffer in your image. Here's an example Dockerfile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; php:8.1-fpm&lt;/span&gt;

&lt;span class="c"&gt;# Install Composer and PHP_CodeSniffer&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=composer:2 /usr/bin/composer /usr/bin/composer&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;composer global require &lt;span class="s2"&gt;"squizlabs/php_codesniffer=*"&lt;/span&gt;

&lt;span class="c"&gt;# Configure the PATH&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export PATH="$PATH:$HOME/.composer/vendor/bin"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.bashrc

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["php-fpm"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This configuration ensures that PHP_CodeSniffer is globally available when you run the container.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting the PSR-12 Standard
&lt;/h2&gt;

&lt;p&gt;PSR-12 is the recommended coding standard by PHP-FIG for PHP code formatting. To set PHP_CodeSniffer to use PSR-12, run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;phpcs &lt;span class="nt"&gt;--standard&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;PSR12
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternatively, configure it in your &lt;code&gt;phpcs.xml&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;ruleset&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"PSR12 Coding Standard"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;rule&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;"PSR12"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;file&amp;gt;&lt;/span&gt;src/&lt;span class="nt"&gt;&amp;lt;/file&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ruleset&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Using the XML Configuration File
&lt;/h2&gt;

&lt;p&gt;You can customize PHP_CodeSniffer with an XML configuration file, allowing you to disable certain checks, add features like progress bars, and color output.&lt;br&gt;
Example of phpcs.xml:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;ruleset&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Custom Coding Standards"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;description&amp;gt;&lt;/span&gt;PHPCS Custom Ruleset Example&lt;span class="nt"&gt;&amp;lt;/description&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!-- PSR-12 Standard --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;rule&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;"PSR12"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!-- Color the result output --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;arg&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"colors"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!-- Show progress of the run --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;arg&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"ps"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!-- Code directory --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;file&amp;gt;&lt;/span&gt;src/&lt;span class="nt"&gt;&amp;lt;/file&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!-- Ignore file and class comment errors --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;rule&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;"Squiz.Commenting.FileComment.Missing"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;exclude-pattern&amp;gt;&lt;/span&gt;*/src/*&lt;span class="nt"&gt;&amp;lt;/exclude-pattern&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/rule&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;rule&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;"Squiz.Commenting.ClassComment.Missing"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;exclude-pattern&amp;gt;&lt;/span&gt;*/src/*&lt;span class="nt"&gt;&amp;lt;/exclude-pattern&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/rule&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ruleset&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, when you run the command, you'll see a progress bar and colored output in the terminal, along with using the PSR-12 standard.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Example: Before and After PHPCBF
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Original Code (Before)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;MyApp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyClass&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;myFunction&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Hello World!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$var&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After Running PHPCBF&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To automatically fix issues found by PHP_CodeSniffer, use the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;phpcbf &lt;span class="nt"&gt;--standard&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;PSR12 src/MyClass.php
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Corrected Code (After)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;MyApp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyClass&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;myFunction&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Hello World!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$var&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PHPCBF automatically corrects the formatting to conform with the PSR-12 standard by adjusting indentation, spacing, and proper bracket placement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generating a Summary XML Report
&lt;/h2&gt;

&lt;p&gt;PHP_CodeSniffer can generate a summary XML report, which is useful for CI/CD pipelines or automated code analysis.&lt;br&gt;
Configuring XML Summary Reports&lt;/p&gt;

&lt;p&gt;To configure PHP_CodeSniffer to generate a summary XML report, add the following configuration to your phpcs.xml file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;ruleset&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"Custom Coding Standards with Summary"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;rule&lt;/span&gt; &lt;span class="na"&gt;ref=&lt;/span&gt;&lt;span class="s"&gt;"PSR12"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

    &lt;span class="c"&gt;&amp;lt;!-- Generate a summarized XML report --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;arg&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"report"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"summary"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;arg&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"report-file"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"phpcs-summary.xml"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;file&amp;gt;&lt;/span&gt;src/&lt;span class="nt"&gt;&amp;lt;/file&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ruleset&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you run phpcs, it will generate a &lt;code&gt;phpcs-summary.xml&lt;/code&gt; file that contains a summary of the violations found.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;PHP_CodeSniffer is a powerful tool for ensuring PHP code quality, allowing you to follow coding standards like PSR-12 and customize your checks using an XML configuration file. With it, you can automate code style correction and generate useful reports for reviews and continuous integration.&lt;/p&gt;




&lt;h2&gt;
  
  
  Thanks for reading!
&lt;/h2&gt;

&lt;p&gt;If you have any questions, complaints or tips, you can leave them here in the comments. I will be happy to answer!&lt;br&gt;
😊😊 See you! 😊😊&lt;/p&gt;




&lt;h2&gt;
  
  
  Support Me
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/channel/UCXm0xRtDRrdnvkW24WmkBqA" rel="noopener noreferrer"&gt;Youtube - WalterNascimentoBarroso&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/walternascimentobarroso" rel="noopener noreferrer"&gt;Github - WalterNascimentoBarroso&lt;/a&gt;&lt;br&gt;
&lt;a href="https://codepen.io" rel="noopener noreferrer"&gt;Codepen - WalterNascimentoBarroso&lt;/a&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>code</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Code Improvements</title>
      <dc:creator>Walter Nascimento</dc:creator>
      <pubDate>Wed, 08 May 2024 22:30:19 +0000</pubDate>
      <link>https://dev.to/walternascimentobarroso/code-improvements-4fj3</link>
      <guid>https://dev.to/walternascimentobarroso/code-improvements-4fj3</guid>
      <description>&lt;p&gt;Code optimization is essential for maintaining efficient and manageable software projects. This article explores practical techniques for improving the readability and maintainability of PHP code, presenting concrete "before" and "after" examples for each technique discussed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Formatting Tools
&lt;/h2&gt;

&lt;p&gt;To ensure consistency in formatting, tools like &lt;code&gt;.editorconfig&lt;/code&gt; are essential.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Before:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;$y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$x&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nv"&gt;$y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;$y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Code Comment and Removal of Unused Items
&lt;/h2&gt;

&lt;p&gt;In addition to removing commented code, it is essential to eliminate unused variables and functions, which clarifies the purpose of the active code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Before:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Calculate the total &lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;calculateTotal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nv"&gt;$x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Old unused variable&lt;/span&gt;
 &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;array_sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;array_column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'price'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;calculateTotal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;array_sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;array_column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'price'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Implementation of "Early Return"
&lt;/h2&gt;

&lt;p&gt;Reduces complexity by avoiding excessive nesting, using early returns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Before:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;isEligible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$age&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;isEligible&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$age&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Use of the Ternary Operator
&lt;/h2&gt;

&lt;p&gt;The ternary operator allows you to write conditions more concisely and clearly, reducing the number of lines of code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Before:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;isActive&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;'Active'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;'Inactive'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;isActive&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s1"&gt;'Active'&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'Inactive'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Reducing the Use of "else"
&lt;/h2&gt;

&lt;p&gt;Eliminating "else" after "if" simplifies the logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Before:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$condition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nf"&gt;performAction&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nf"&gt;handleAlternative&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$condition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nf"&gt;performAction&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
 &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;handleAlternative&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Simplifying Nested Conditions
&lt;/h2&gt;

&lt;p&gt;Simplify nested conditions into a single expression.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Before:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;isActive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nf"&gt;approveUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;isActive&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nf"&gt;approveUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Efficient Use of Model Data
&lt;/h2&gt;

&lt;p&gt;Load only the necessary data from a model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Before:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$dataIni&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Yii&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nv"&gt;$app&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Banner'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="s1"&gt;'dataIni'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nv"&gt;$dataFim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Yii&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nv"&gt;$app&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Banner'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="s1"&gt;'dataFim'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$bannerPost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Yii&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nv"&gt;$app&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Banner'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$dataIni&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$bannerPost&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'dataIni'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nv"&gt;$dataEnd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$bannerPost&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'dataEnd'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Replacing Depreciated Items
&lt;/h2&gt;

&lt;p&gt;Update class or method references to avoid obsolescence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Before:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AccessControl&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;className&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AccessControl&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Avoid Magic Numbers
&lt;/h2&gt;

&lt;p&gt;Replace arbitrary numbers with named constants.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Before:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nf"&gt;approveUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="no"&gt;MIN_AGE_FOR_APPROVAL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="no"&gt;MIN_AGE_FOR_APPROVAL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nf"&gt;approveUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Preference for "foreach" over "for"
&lt;/h2&gt;

&lt;p&gt;Use simpler and clearer iteration structures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Before:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nb"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$users&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$users&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$users&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Modularization of Functions
&lt;/h2&gt;

&lt;p&gt;Break large functions into smaller functions to make it easier to understand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Correct Use of Private Functions
&lt;/h2&gt;

&lt;p&gt;Set internal-use functions to private to protect and organize code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Pass-by-Reference Where Appropriate
&lt;/h2&gt;

&lt;p&gt;Encourage the use of pass by reference in situations where large objects or collections of data are manipulated frequently. This can significantly reduce memory overhead and increase application performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Before:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;modifyItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$array&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$newValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nv"&gt;$array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$newValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Modification is local&lt;/span&gt;
 &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$array&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Need to return the modified array&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nv"&gt;$myArray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nv"&gt;$myArray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;modifyItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$myArray&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Reassignment required&lt;/span&gt;
&lt;span class="nb"&gt;print_r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$myArray&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;💡 NOTE: In this case, the modifyItem function needs to return the modified array, and then the original array must be reassigned with this new returned value, which implies more intensive memory management.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;modifyItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;$array&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$newValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="nv"&gt;$array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$newValue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// The modification affects the original array directly&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nv"&gt;$myArray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="nf"&gt;modifyItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$myArray&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// No reassignment required&lt;/span&gt;
&lt;span class="nb"&gt;print_r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$myArray&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;💡 NOTE: Here, the modifyItem function uses the &amp;amp; symbol in the $array parameter to indicate that the array is passed by reference. This means that any modification to the array within the function will directly affect the original array without the need to return and reassign it. The modification is done directly in the memory where the original array is stored, saving resources and simplifying the code.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Using the Null Coalesce Operator in PHP
&lt;/h2&gt;

&lt;p&gt;The null coalesce operator (??) is a useful addition to PHP that helps you write cleaner, more efficient code when dealing with values ​​that can be null. This operator is especially useful for simplifying the assignment of default values ​​to variables that may not be defined or that may contain a null value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Before:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_GET&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'username'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="nv"&gt;$_GET&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'username'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'guest'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$_GET&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'username'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="s1"&gt;'guest'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;By implementing these practices, developers ensure that code is clean, efficient, and easy to understand, making both maintenance and collaboration on software projects easier.&lt;/p&gt;




&lt;h2&gt;
  
  
  Thanks for reading!
&lt;/h2&gt;

&lt;p&gt;If you have any questions, complaints or tips, you can leave them here in the comments. I will be happy to answer!&lt;/p&gt;

&lt;p&gt;😊😊 See you later! 😊😊&lt;/p&gt;




&lt;h2&gt;
  
  
  Support Me
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/channel/UCXm0xRtDRrdnvkW24WmkBqA" rel="noopener noreferrer"&gt;Youtube - WalterNascimentoBarroso&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/walternascimentobarroso" rel="noopener noreferrer"&gt;Github - WalterNascimentoBarroso&lt;/a&gt;&lt;br&gt;
&lt;a href="https://codepen.io" rel="noopener noreferrer"&gt;Codepen - WalterNascimentoBarroso&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>webdev</category>
      <category>php</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
