<?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: Charles Koffler</title>
    <description>The latest articles on DEV Community by Charles Koffler (@charles_koffler_bcabc582b).</description>
    <link>https://dev.to/charles_koffler_bcabc582b</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%2F3217531%2F9cf9858a-92c1-4615-840f-3e8b88dabc3b.jpg</url>
      <title>DEV Community: Charles Koffler</title>
      <link>https://dev.to/charles_koffler_bcabc582b</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/charles_koffler_bcabc582b"/>
    <language>en</language>
    <item>
      <title>Introducing Flexibility Without Losing Structure in Clprolf</title>
      <dc:creator>Charles Koffler</dc:creator>
      <pubDate>Fri, 27 Mar 2026 20:12:58 +0000</pubDate>
      <link>https://dev.to/charles_koffler_bcabc582b/introducing-flexibility-without-losing-structure-in-clprolf-17m8</link>
      <guid>https://dev.to/charles_koffler_bcabc582b/introducing-flexibility-without-losing-structure-in-clprolf-17m8</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Why a structured approach doesn’t have to be a barrier to entry.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;When introducing a structured approach like Clprolf, a common concern appears quickly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Do I have to rewrite everything?”&lt;/li&gt;
&lt;li&gt;“Does this change how I usually code?”&lt;/li&gt;
&lt;li&gt;“Is this too strict for real-world usage?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These concerns are legitimate.&lt;/p&gt;

&lt;p&gt;Most real-world codebases are not perfectly structured.&lt;br&gt;
They mix domain logic and technical details.&lt;br&gt;
They evolve under constraints.&lt;/p&gt;

&lt;p&gt;So the question becomes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Can Clprolf exist without forcing a complete rewrite?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Starting From Existing Code
&lt;/h2&gt;

&lt;p&gt;Clprolf is based on two simple principles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a class is either technical or organized around a well-defined domain&lt;/li&gt;
&lt;li&gt;inheritance must preserve that domain — otherwise, composition is used&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These principles provide structure.&lt;/p&gt;

&lt;p&gt;But they do not require starting from scratch.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;You can start from existing code.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Even when a class mixes concerns,&lt;br&gt;
it still has a primary role.&lt;/p&gt;

&lt;p&gt;That role defines its nature.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Flexible Entry Point
&lt;/h2&gt;

&lt;p&gt;Clprolf can be used in a more flexible way by default, as the compiler operates in this mode.&lt;/p&gt;

&lt;p&gt;In this mode:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;existing code remains valid&lt;/li&gt;
&lt;li&gt;no immediate refactoring is required&lt;/li&gt;
&lt;li&gt;no additional annotations are necessary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not to enforce structure immediately,&lt;br&gt;
but to make it available.&lt;/p&gt;




&lt;h2&gt;
  
  
  Structure Still Exists
&lt;/h2&gt;

&lt;p&gt;Flexibility does not remove the model.&lt;/p&gt;

&lt;p&gt;The same principles still apply.&lt;/p&gt;

&lt;p&gt;Even in mixed code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the primary role of a class remains identifiable&lt;/li&gt;
&lt;li&gt;domain and technical concerns are still distinct in nature&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clprolf does not ignore structure.&lt;br&gt;
It simply does not force it upfront.&lt;/p&gt;




&lt;h2&gt;
  
  
  Strict and Flexible Clprolf
&lt;/h2&gt;

&lt;p&gt;This leads to two ways of using Clprolf:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;strong&gt;flexible usage&lt;/strong&gt;, closer to common practices&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;strict usage&lt;/strong&gt;, with stronger structural guarantees&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The difference is not in the model itself,&lt;br&gt;
but in how strictly it is applied.&lt;/p&gt;

&lt;p&gt;Strict Clprolf makes the separation explicit.&lt;br&gt;
Flexible Clprolf allows it to remain implicit.&lt;/p&gt;




&lt;h2&gt;
  
  
  Compatibility Between Both
&lt;/h2&gt;

&lt;p&gt;Both approaches are fully compatible.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;strict code works in all cases&lt;/li&gt;
&lt;li&gt;flexible code integrates without issue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is no fragmentation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Clprolf remains a single model,&lt;br&gt;
regardless of how strictly it is applied.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Gradual Evolution
&lt;/h2&gt;

&lt;p&gt;In practice, adoption becomes natural.&lt;/p&gt;

&lt;p&gt;Developers can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;start with their existing code&lt;/li&gt;
&lt;li&gt;observe where responsibilities become unclear&lt;/li&gt;
&lt;li&gt;introduce structure where it brings value&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No forced transition is required.&lt;/p&gt;

&lt;p&gt;Clprolf can be adopted progressively.&lt;/p&gt;




&lt;h2&gt;
  
  
  Working With Existing Libraries
&lt;/h2&gt;

&lt;p&gt;Clprolf does not require external code to follow its model.&lt;/p&gt;

&lt;p&gt;Libraries, frameworks, and APIs can be used as they are.&lt;/p&gt;

&lt;p&gt;What matters is how they are integrated.&lt;/p&gt;

&lt;p&gt;The structure lives in your code,&lt;br&gt;
not in the code you depend on.&lt;/p&gt;




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

&lt;p&gt;Clprolf is not about forcing a new way of coding.&lt;/p&gt;

&lt;p&gt;It is about providing a clearer structure&lt;br&gt;
that can be applied when needed.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You don’t need to change everything to start.&lt;br&gt;
You can start where you are —&lt;br&gt;
and move toward more structure when it makes sense.&lt;/p&gt;
&lt;/blockquote&gt;




</description>
      <category>oop</category>
      <category>java</category>
      <category>designpatterns</category>
      <category>architecture</category>
    </item>
    <item>
      <title>🧱 Two Structural Principles behind Clprolf</title>
      <dc:creator>Charles Koffler</dc:creator>
      <pubDate>Tue, 24 Feb 2026 12:48:40 +0000</pubDate>
      <link>https://dev.to/charles_koffler_bcabc582b/two-structural-principles-behind-clprolf-1kg5</link>
      <guid>https://dev.to/charles_koffler_bcabc582b/two-structural-principles-behind-clprolf-1kg5</guid>
      <description>&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Clprolf builds upon classical Object-Oriented Programming.&lt;/p&gt;

&lt;p&gt;To fully follow this article, readers should already be familiar with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the fundamentals of OOP,&lt;/li&gt;
&lt;li&gt;inheritance and composition,&lt;/li&gt;
&lt;li&gt;common design principles such as SRP,&lt;/li&gt;
&lt;li&gt;the guideline “favor composition over inheritance”.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Foundational Principles of Clprolf
&lt;/h2&gt;

&lt;p&gt;Clprolf is based on two core principles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A class is either technical or organized around a well-defined class domain.&lt;/li&gt;
&lt;li&gt;Inheritance must preserve the class domain; if it does not, composition is used instead.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These principles define how Clprolf structures components and relationships.&lt;/p&gt;




&lt;p&gt;The class domain is the central subject around which a class is organized.&lt;br&gt;
It defines what the class fundamentally represents and what it is responsible for.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;A &lt;code&gt;File&lt;/code&gt; class has a class domain related to file handling.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;Random&lt;/code&gt; class has a class domain related to random generation.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;Connection&lt;/code&gt; class has a class domain related to connection management.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;PdfGenerator&lt;/code&gt; class has a class domain related to PDF generation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A technical class, by contrast, does not represent a conceptual domain.&lt;br&gt;
It provides technical support (e.g., logging, parsing, low-level utilities).&lt;/p&gt;




&lt;h2&gt;
  
  
  Relation to SRP
&lt;/h2&gt;

&lt;p&gt;The Single Responsibility Principle (SRP) states that a class should have only one reason to change.&lt;/p&gt;

&lt;p&gt;The concept of class domain provides a structural way to think about responsibility:&lt;/p&gt;

&lt;p&gt;If a class is organized around a single domain,&lt;br&gt;
its evolution tends to follow that domain.&lt;/p&gt;

&lt;p&gt;The two principles do not replace SRP.&lt;br&gt;
They offer a way to reason about responsibility in terms of domain coherence.&lt;/p&gt;




&lt;h2&gt;
  
  
  Relation to “Favor Composition Over Inheritance”
&lt;/h2&gt;

&lt;p&gt;The common guideline “favor composition over inheritance” is widely accepted.&lt;/p&gt;

&lt;p&gt;The second principle provides a decision criterion:&lt;/p&gt;

&lt;p&gt;If inheritance would introduce a different class domain,&lt;br&gt;
then composition is used instead.&lt;/p&gt;

&lt;p&gt;This does not remove judgment.&lt;br&gt;
It clarifies how inheritance relates to the continuity of the class domain.&lt;/p&gt;




&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;These two principles form the foundation of Clprolf.&lt;/p&gt;

&lt;p&gt;They define how class roles are interpreted and how inheritance is understood within the language.&lt;/p&gt;

&lt;p&gt;From them follow the structural distinctions and rules that Clprolf makes explicit.&lt;/p&gt;




</description>
      <category>java</category>
      <category>oop</category>
      <category>architecture</category>
      <category>programming</category>
    </item>
    <item>
      <title>Preventing Architectural Drift in Object-Oriented Systems — A Structural Approach with Clprolf</title>
      <dc:creator>Charles Koffler</dc:creator>
      <pubDate>Sun, 15 Feb 2026 12:32:55 +0000</pubDate>
      <link>https://dev.to/charles_koffler_bcabc582b/preventing-architectural-drift-in-object-oriented-systems-a-structural-approach-with-clprolf-360h</link>
      <guid>https://dev.to/charles_koffler_bcabc582b/preventing-architectural-drift-in-object-oriented-systems-a-structural-approach-with-clprolf-360h</guid>
      <description>&lt;h3&gt;
  
  
  A Structural Locking Approach
&lt;/h3&gt;

&lt;p&gt;Most large object-oriented systems do not collapse because of lack of expressiveness.&lt;/p&gt;

&lt;p&gt;They collapse because of &lt;strong&gt;architectural drift&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Classes are created with clear intentions.&lt;br&gt;
Over time, responsibilities expand.&lt;br&gt;
Boundaries blur.&lt;br&gt;
Layers mix.&lt;/p&gt;

&lt;p&gt;The name remains.&lt;br&gt;
The nature changes.&lt;/p&gt;

&lt;p&gt;This is not a failure of developers.&lt;br&gt;
It is a structural weakness of unconstrained class design.&lt;/p&gt;


&lt;h2&gt;
  
  
  Locking the Nature at Creation Time
&lt;/h2&gt;

&lt;p&gt;What if the nature of a component had to be declared — and respected — from the start?&lt;/p&gt;

&lt;p&gt;Clprolf enforces a simple but powerful rule:&lt;/p&gt;

&lt;p&gt;Every component must explicitly belong to one of two ontological categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Domain (agent / model / abstraction)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Technical (worker_agent / infrastructure layer)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not a naming convention.&lt;br&gt;
It is a structural constraint.&lt;/p&gt;

&lt;p&gt;Once declared, a component cannot silently migrate across layers.&lt;br&gt;
Inheritance must respect ontological boundaries.&lt;/p&gt;

&lt;p&gt;Responsibility is not only described.&lt;br&gt;
It is positioned.&lt;/p&gt;


&lt;h2&gt;
  
  
  From Description to Commitment
&lt;/h2&gt;

&lt;p&gt;Traditional OOP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Sorter&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class_for agent Sorter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The keyword &lt;code&gt;for&lt;/code&gt; changes the mindset.&lt;/p&gt;

&lt;p&gt;A class is no longer just a named container.&lt;br&gt;
It is a construct &lt;strong&gt;for&lt;/strong&gt; a declared ontological role.&lt;/p&gt;

&lt;p&gt;This small syntactic shift forces a conceptual commitment.&lt;/p&gt;




&lt;h2&gt;
  
  
  Structural Discipline, Not Convention
&lt;/h2&gt;

&lt;p&gt;Many architectural principles exist as guidelines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;separate concerns&lt;/li&gt;
&lt;li&gt;avoid God Objects&lt;/li&gt;
&lt;li&gt;respect layers&lt;/li&gt;
&lt;li&gt;apply SOLID&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clprolf encodes part of this discipline directly into the language.&lt;/p&gt;

&lt;p&gt;It does not rely only on human vigilance.&lt;/p&gt;

&lt;p&gt;It reduces the surface for structural drift.&lt;/p&gt;




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

&lt;p&gt;In small systems, discipline is enough.&lt;/p&gt;

&lt;p&gt;In large, long-lived systems, discipline erodes.&lt;/p&gt;

&lt;p&gt;Clprolf introduces a structural locking mechanism that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stabilizes ontological boundaries,&lt;/li&gt;
&lt;li&gt;constrains illegitimate inheritance,&lt;/li&gt;
&lt;li&gt;clarifies the meaning of a class from the start.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It does not reduce what can be built.&lt;/p&gt;

&lt;p&gt;It changes how responsibility evolves.&lt;/p&gt;

&lt;p&gt;And that difference can be decisive.&lt;/p&gt;




</description>
      <category>java</category>
      <category>architecture</category>
      <category>cleancode</category>
      <category>designpatterns</category>
    </item>
    <item>
      <title>Getting Started with Clprolf: Structuring Responsibilities in OOP</title>
      <dc:creator>Charles Koffler</dc:creator>
      <pubDate>Fri, 06 Feb 2026 17:35:37 +0000</pubDate>
      <link>https://dev.to/charles_koffler_bcabc582b/getting-started-with-clprolf-structuring-responsibilities-in-oop-5doe</link>
      <guid>https://dev.to/charles_koffler_bcabc582b/getting-started-with-clprolf-structuring-responsibilities-in-oop-5doe</guid>
      <description>&lt;h1&gt;
  
  
  📘 Getting Started with Clprolf
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Clprolf builds upon classical Object-Oriented Programming.&lt;/p&gt;

&lt;p&gt;To fully benefit from this guide, readers should already be familiar with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the fundamentals of OOP,&lt;/li&gt;
&lt;li&gt;inheritance and composition,&lt;/li&gt;
&lt;li&gt;basic design principles and common patterns.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Making Responsibilities Explicit
&lt;/h2&gt;

&lt;p&gt;Clprolf is a language and framework designed to make architectural roles explicit.&lt;/p&gt;

&lt;p&gt;In most object-oriented systems, separation of responsibilities relies on discipline.&lt;/p&gt;

&lt;p&gt;Clprolf encodes that discipline structurally.&lt;/p&gt;

&lt;p&gt;Every class declares what it is.&lt;/p&gt;




&lt;h2&gt;
  
  
  Foundational Principles of Clprolf
&lt;/h2&gt;

&lt;p&gt;Clprolf is based on two core principles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A class is either technical or organized around a well-defined class domain.&lt;/li&gt;
&lt;li&gt;Inheritance must preserve the class domain; if it does not, composition is used instead.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These principles define how Clprolf structures components and relationships.&lt;/p&gt;




&lt;p&gt;The class domain is the central subject around which a class is organized.&lt;br&gt;
It defines what the class fundamentally represents and what it is responsible for.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;code&gt;File&lt;/code&gt; class has a class domain related to file handling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A technical class, by contrast, does not represent a conceptual domain.&lt;br&gt;
It provides technical support (e.g., logging, parsing, low-level utilities).&lt;/p&gt;


&lt;h2&gt;
  
  
  1️⃣ Declaring a Role
&lt;/h2&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderManager&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Clprolf you declare the role:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class_for agent OrderProcessor { }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class_for worker_agent OrderRepository { }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each class has a &lt;strong&gt;declension&lt;/strong&gt; (its architectural nature).&lt;/p&gt;

&lt;p&gt;The core declensions are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;agent&lt;/code&gt; → business responsibility&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;worker_agent&lt;/code&gt; → technical execution&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;model&lt;/code&gt; → passive domain entity&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;information&lt;/code&gt; → technical data container&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;indef_obj&lt;/code&gt; → transitional, undefined role&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2️⃣ Start Flexible: &lt;code&gt;indef_obj&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Clprolf does not require architectural clarity upfront.&lt;/p&gt;

&lt;p&gt;You can begin with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class_for indef_obj OrderManager {
    public void process(Order order) {
        validate(order);
        save(order);
        notify(order);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;indef_obj&lt;/code&gt; represents a temporary state.&lt;/p&gt;

&lt;p&gt;Refactoring can happen later.&lt;/p&gt;




&lt;h2&gt;
  
  
  3️⃣ Making Responsibilities Explicit
&lt;/h2&gt;

&lt;p&gt;After identifying responsibilities:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concern&lt;/th&gt;
&lt;th&gt;Nature&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Business validation&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Persistence&lt;/td&gt;
&lt;td&gt;Technical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notification&lt;/td&gt;
&lt;td&gt;Technical&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You refactor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class_for agent OrderProcessor {
    private OrderRepository repository;
    private OrderNotifier notifier;

    public void process(Order order) {
        validate(order);
        repository.save(order);
        notifier.notify(order);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class_for worker_agent OrderRepository { ... }
public class_for worker_agent OrderNotifier { ... }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The behavior is unchanged.&lt;br&gt;
The architecture becomes explicit.&lt;/p&gt;


&lt;h2&gt;
  
  
  4️⃣ Structural Rules Are Enforced
&lt;/h2&gt;

&lt;p&gt;Clprolf does not only suggest discipline.&lt;/p&gt;

&lt;p&gt;It enforces structural coherence.&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;public class_for agent A1AnimalImpl nature AnimalWorker { }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This attempts to inherit a &lt;code&gt;worker_agent&lt;/code&gt; from an &lt;code&gt;agent&lt;/code&gt;.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ARCH-A1 =&amp;gt; Class A1AnimalImpl:
the parent class should be an agent (AnimalWorker)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The equivalent Java code would compile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;A1AnimalImpl&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;AnimalWorker&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clprolf rejects it as architecturally inconsistent.&lt;/p&gt;




&lt;h2&gt;
  
  
  6️⃣ What Clprolf Changes
&lt;/h2&gt;

&lt;p&gt;Clprolf does not change:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;algorithms&lt;/li&gt;
&lt;li&gt;execution flow&lt;/li&gt;
&lt;li&gt;runtime model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;role visibility&lt;/li&gt;
&lt;li&gt;inheritance coherence&lt;/li&gt;
&lt;li&gt;architectural guarantees&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  7️⃣ Philosophy in One Sentence
&lt;/h2&gt;

&lt;p&gt;Clprolf encodes architectural responsibility at the language level&lt;br&gt;
instead of leaving it to convention.&lt;/p&gt;




</description>
      <category>java</category>
      <category>architecture</category>
      <category>refactoring</category>
      <category>programming</category>
    </item>
    <item>
      <title>Refactoring Your Classes with Clprolf and `indef_obj`</title>
      <dc:creator>Charles Koffler</dc:creator>
      <pubDate>Thu, 25 Dec 2025 14:51:46 +0000</pubDate>
      <link>https://dev.to/charles_koffler_bcabc582b/refactoring-your-classes-with-clprolf-and-indefobj-3j8k</link>
      <guid>https://dev.to/charles_koffler_bcabc582b/refactoring-your-classes-with-clprolf-and-indefobj-3j8k</guid>
      <description>&lt;p&gt;Most developers agree on the &lt;strong&gt;Single Responsibility Principle (SRP)&lt;/strong&gt;.&lt;br&gt;
The real difficulty is not &lt;em&gt;what&lt;/em&gt; to do — it’s &lt;strong&gt;when&lt;/strong&gt; to do it.&lt;/p&gt;

&lt;p&gt;In real projects, we usually:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;write code that works,&lt;/li&gt;
&lt;li&gt;understand it better over time,&lt;/li&gt;
&lt;li&gt;refactor when responsibilities become clearer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Clprolf fits naturally into this workflow&lt;/strong&gt; by supporting postponed architectural decisions through refactoring.&lt;/p&gt;


&lt;h2&gt;
  
  
  1️⃣ Starting from a Classic OOP Class
&lt;/h2&gt;

&lt;p&gt;Let’s start with a very common example.&lt;br&gt;
Nothing exotic. Just a class that &lt;em&gt;works&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderManager&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;processOrder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Order&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getTotal&lt;/span&gt;&lt;span class="o"&gt;()&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="o"&gt;)&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="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Invalid order"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;saveToDatabase&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;logOrder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;formatConfirmation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;sendEmail&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;saveToDatabase&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Order&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Saving order "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getId&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;logOrder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Order&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Order processed: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getId&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;formatConfirmation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Order&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Order #"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getId&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" confirmed"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;sendEmail&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Sending email: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This class:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;contains &lt;strong&gt;business rules&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;handles &lt;strong&gt;persistence&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;performs &lt;strong&gt;logging&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;formats messages,&lt;/li&gt;
&lt;li&gt;sends emails.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everyone has written something like this.&lt;/p&gt;




&lt;h2&gt;
  
  
  2️⃣ Using Clprolf Without Thinking About Roles
&lt;/h2&gt;

&lt;p&gt;In Clprolf, you can start &lt;strong&gt;exactly the same way&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;No need to decide anything upfront.&lt;br&gt;
You simply acknowledge that the architectural role is &lt;strong&gt;not yet clear&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public indef_obj OrderManager {

    public void processOrder(Order order) {
        if (order.getTotal() &amp;lt;= 0) {
            throw new IllegalArgumentException("Invalid order");
        }

        saveToDatabase(order);
        logOrder(order);

        String message = formatConfirmation(order);
        sendEmail(message);
    }

    private void saveToDatabase(Order order) { }
    private void logOrder(Order order) { }
    private String formatConfirmation(Order order) { return ""; }
    private void sendEmail(String message) { }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this stage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nothing is forced,&lt;/li&gt;
&lt;li&gt;no architectural commitment is made,&lt;/li&gt;
&lt;li&gt;the code can remain like this for a while.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;indef_obj&lt;/code&gt; behaves like classic OOP — &lt;strong&gt;but consciously&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  3️⃣ Applying SRP After Understanding the Code
&lt;/h2&gt;

&lt;p&gt;Later — exactly like in a classic SRP refactoring — you realize that this class mixes different responsibilities.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concern&lt;/th&gt;
&lt;th&gt;Nature&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Business decision&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Persistence&lt;/td&gt;
&lt;td&gt;Technical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logging&lt;/td&gt;
&lt;td&gt;Technical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Formatting / I/O&lt;/td&gt;
&lt;td&gt;Technical&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is where &lt;strong&gt;Clprolf becomes useful&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  4️⃣ Refactoring into Explicit Responsibilities
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Before (indef_obj)

OrderManager
 ├─ business rule
 ├─ persistence
 ├─ logging
 └─ notification


After (SRP made explicit)

OrderProcessor (agent)
 ├─ business decision

OrderRepository (worker_agent)
 └─ persistence

OrderNotifier (worker_agent)
 ├─ logging
 └─ messaging
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🎯 Business Responsibility → &lt;code&gt;agent&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public agent OrderProcessor {

    private final OrderRepository repository;
    private final OrderNotifier notifier;

    public OrderProcessor(OrderRepository repository,
                          OrderNotifier notifier) {
        this.repository = repository;
        this.notifier = notifier;
    }

    public void process(Order order) {
        if (order.getTotal() &amp;lt;= 0) {
            throw new IllegalArgumentException("Invalid order");
        }

        repository.save(order);
        notifier.notify(order);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;agent&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;expresses &lt;strong&gt;business intent&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;coordinates actions,&lt;/li&gt;
&lt;li&gt;contains &lt;strong&gt;no technical details&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  ⚙️ Technical Responsibilities → &lt;code&gt;worker_agent&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public worker_agent OrderRepository {

    public void save(Order order) {
        System.out.println("Saving order " + order.getId());
    }
}

public worker_agent OrderNotifier {

    public void notify(Order order) {
        log(order);
        String message = format(order);
        send(message);
    }

    private void log(Order order) {
        System.out.println("Order processed: " + order.getId());
    }

    private String format(Order order) {
        return "Order #" + order.getId() + " confirmed";
    }

    private void send(String message) {
        System.out.println("Sending email: " + message);
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Workers may mix technical concerns freely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I/O,&lt;/li&gt;
&lt;li&gt;formatting,&lt;/li&gt;
&lt;li&gt;logging,&lt;/li&gt;
&lt;li&gt;infrastructure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is &lt;strong&gt;acceptable&lt;/strong&gt; because business meaning remains in the agent.&lt;/p&gt;




&lt;h2&gt;
  
  
  5️⃣ What Changed — and What Didn’t
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ❌ What did &lt;strong&gt;not&lt;/strong&gt; change
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;algorithms,&lt;/li&gt;
&lt;li&gt;behavior,&lt;/li&gt;
&lt;li&gt;performance,&lt;/li&gt;
&lt;li&gt;expressivity.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ What &lt;strong&gt;did&lt;/strong&gt; change
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;responsibilities became explicit,&lt;/li&gt;
&lt;li&gt;architectural intent became visible,&lt;/li&gt;
&lt;li&gt;future evolution became easier.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is simply &lt;strong&gt;SRP applied structurally&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Conclusion
&lt;/h2&gt;

&lt;p&gt;Clprolf does &lt;strong&gt;not&lt;/strong&gt; ask developers to think harder —&lt;br&gt;
and certainly not earlier.&lt;/p&gt;

&lt;p&gt;It allows them to think &lt;strong&gt;when they are ready&lt;/strong&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;write code first,&lt;/li&gt;
&lt;li&gt;understand it later,&lt;/li&gt;
&lt;li&gt;refactor responsibilities when needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;indef_obj&lt;/code&gt; is &lt;strong&gt;not a goal&lt;/strong&gt; —&lt;br&gt;
it is a &lt;strong&gt;temporary state&lt;/strong&gt; that supports real-world development.&lt;/p&gt;

&lt;p&gt;In that sense, &lt;strong&gt;Clprolf is not just a language&lt;/strong&gt;.&lt;br&gt;
It is a &lt;strong&gt;refactoring tool for architectural clarity&lt;/strong&gt;.&lt;/p&gt;




</description>
      <category>java</category>
      <category>oop</category>
      <category>productivity</category>
      <category>architecture</category>
    </item>
    <item>
      <title>A Global Model of How Classes Relate to Each Other in Clprolf</title>
      <dc:creator>Charles Koffler</dc:creator>
      <pubDate>Sat, 06 Dec 2025 15:55:51 +0000</pubDate>
      <link>https://dev.to/charles_koffler_bcabc582b/a-global-model-of-how-classes-relate-to-each-other-in-clprolf-2igk</link>
      <guid>https://dev.to/charles_koffler_bcabc582b/a-global-model-of-how-classes-relate-to-each-other-in-clprolf-2igk</guid>
      <description>&lt;p&gt;Clprolf introduces simple declensions (Agent, Worker, Abstraction…) that clarify &lt;strong&gt;the natural place of each class in a project&lt;/strong&gt;.&lt;br&gt;
Many developers asked for a &lt;strong&gt;global picture&lt;/strong&gt; showing how these classes interact, how they depend on each other, and how domain-level classes stay cleanly separated from technical ones.&lt;/p&gt;

&lt;p&gt;This article presents &lt;strong&gt;a conceptual model&lt;/strong&gt; that explains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how each &lt;strong&gt;class type&lt;/strong&gt; fits into the architecture,&lt;/li&gt;
&lt;li&gt;how domain classes interact with technical classes,&lt;/li&gt;
&lt;li&gt;how pure abstractions differ from system abstractions,&lt;/li&gt;
&lt;li&gt;and where &lt;code&gt;@Forc_pract_code&lt;/code&gt; is used when crossing boundaries.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not a compiler rule-set.&lt;br&gt;
It is simply a &lt;strong&gt;mental model&lt;/strong&gt; that makes Clprolf’s design easier to understand and that helps classify new classes intuitively.&lt;/p&gt;

&lt;p&gt;Below is the complete model, with diagram and detailed explanations.&lt;/p&gt;



&lt;p&gt;This document provides a conceptual overview of how the main Clprolf declensions relate to each other in practice.&lt;br&gt;
It is &lt;strong&gt;not a formal set of compiler rules&lt;/strong&gt;, but a conceptual guide that helps developers understand how each declension fits into a coherent architectural model.&lt;/p&gt;

&lt;p&gt;The goal is simple:&lt;br&gt;
&lt;strong&gt;clarify the natural relationships between Agents, Abstractions, Workers, and System Abstractions&lt;/strong&gt;,&lt;br&gt;
and indicate where exceptions must be explicitly acknowledged through &lt;code&gt;@Forc_pract_code&lt;/code&gt;.&lt;/p&gt;




&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                         ┌──────────────────────────────────────────┐
                         │              PURE ABSTRACTION            │
                         │ (concepts usable by ALL other roles)     │
                         │   - no workers                           │
                         │   - no system calls                      │
                         └───────────────────────┬──────────────────┘
                                                 │  used by anyone
                                                 ▼
                  ┌──────────────────────────────────────────────────┐
                  │                       AGENT                      │
                  │        (domain-level behavior &amp;amp; logic)           │
                  │                                                  │
                  │      [Optionally: simu_real_obj available]       │
                  └───────────────────────────┬──────────────────────┘
                                              │
                                              │ uses
                                              ▼
                 ┌──────────────────────────────────────────────────┐
                 │                   WORKER_AGENT                   │
                 │   (technical realization serving an Agent)       │
                 │                                                  │
                 │                                                  │
                 └──────────────────────────┬───────────────────────┘
                                             │
                                             │ calls
                                             ▼
         ┌────────────────────────────────────────────────────────────────┐
         │                        SYSTEM ABSTRACTION                      │
         │      (agent-like, system domain; may call workers or           │
         │       other system abstractions; uses @Forc_pract_code as      │
         │       declaration when needed)                                 │
         └────────────────────────────────┬───────────────────────────────┘
                                          │
                                          │ calls
                                          ▼
                   ┌──────────────────────────────────────────────────┐
                   │                        WORKER                    │
                   │   (low-level technical or native operations)     │
                   └──────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;1. Agent&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;An &lt;strong&gt;Agent&lt;/strong&gt; represents a meaningful domain object.&lt;br&gt;
It carries intention, behavior, and domain responsibility.&lt;/p&gt;
&lt;h5&gt;
  
  
  &lt;strong&gt;Agent rules&lt;/strong&gt;
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;An Agent &lt;strong&gt;may call its Worker&lt;/strong&gt; (its technical realization).&lt;/li&gt;
&lt;li&gt;An Agent &lt;strong&gt;may call other Agents&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;An Agent &lt;strong&gt;may use pure Abstractions&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;An Agent &lt;strong&gt;must not directly use System Abstractions&lt;/strong&gt;.
If a domain object needs access to a system feature, &lt;strong&gt;its Worker handles it&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;
  
  
  &lt;strong&gt;2. Worker&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;A &lt;strong&gt;Worker&lt;/strong&gt; performs technical tasks on behalf of its Agent.&lt;/p&gt;

&lt;p&gt;Typical examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;network senders/receivers,&lt;/li&gt;
&lt;li&gt;file or database handlers,&lt;/li&gt;
&lt;li&gt;UI adapters.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;
  
  
  &lt;strong&gt;Worker rules&lt;/strong&gt;
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;A Worker &lt;strong&gt;may call other Workers&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;A Worker &lt;strong&gt;may use System Abstractions&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;A Worker &lt;strong&gt;may use pure Abstractions&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;A Worker &lt;strong&gt;may call its Agent&lt;/strong&gt; to trigger domain operations (UI events, callbacks, etc.).&lt;/li&gt;
&lt;li&gt;A Worker &lt;strong&gt;must not expose domain intelligence&lt;/strong&gt;: its responsibility is purely technical.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Workers are the only declension allowed to bridge the domain world and system-level operations.&lt;/p&gt;


&lt;h4&gt;
  
  
  &lt;strong&gt;3. Pure Abstraction&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;A &lt;strong&gt;pure Abstraction&lt;/strong&gt; is a conceptual type with no system interaction.&lt;br&gt;
Its behavior is fully defined by logic, data, or mathematical structure.&lt;/p&gt;

&lt;p&gt;Examples: collections, geometry, colors, numeric models, conceptual structures.&lt;/p&gt;
&lt;h5&gt;
  
  
  &lt;strong&gt;Pure Abstraction rules&lt;/strong&gt;
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;It &lt;strong&gt;may call other pure Abstractions&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;It &lt;strong&gt;may call Agents&lt;/strong&gt; (same declension family).&lt;/li&gt;
&lt;li&gt;It &lt;strong&gt;must not use System Abstractions&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;It &lt;strong&gt;must not use Workers&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;It normally &lt;strong&gt;does not have a Worker&lt;/strong&gt;: memory itself provides the “technical realization”.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pure Abstractions represent stable logic that does not depend on the environment.&lt;/p&gt;


&lt;h4&gt;
  
  
  &lt;strong&gt;4. System Abstraction&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;A &lt;strong&gt;System Abstraction&lt;/strong&gt; is an abstraction that &lt;em&gt;simulates&lt;/em&gt; a system resource or capability.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Streams&lt;/li&gt;
&lt;li&gt;Channels&lt;/li&gt;
&lt;li&gt;Sockets&lt;/li&gt;
&lt;li&gt;Threads&lt;/li&gt;
&lt;li&gt;File abstractions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These objects have conceptual methods (e.g., read, write, open) but &lt;strong&gt;their internal realization requires system-level operations&lt;/strong&gt; provided by a Worker.&lt;/p&gt;
&lt;h5&gt;
  
  
  &lt;strong&gt;System Abstraction rules&lt;/strong&gt;
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;A System Abstraction &lt;strong&gt;may use its Worker&lt;/strong&gt; for technical realization.&lt;/li&gt;
&lt;li&gt;A System Abstraction &lt;strong&gt;may call other System Abstractions&lt;/strong&gt; only when they belong to the same underlying domain of functionality.&lt;/li&gt;
&lt;li&gt;A System Abstraction &lt;strong&gt;may not call Agents&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Any usage of external system abstractions or utilities must be annotated with &lt;code&gt;@Forc_pract_code&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The annotation confirms that the developer intentionally breaks the purity of the abstraction for practical reasons.&lt;/p&gt;


&lt;h4&gt;
  
  
  &lt;strong&gt;5. Exceptions with &lt;code&gt;@Forc_pract_code&lt;/code&gt;&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Whenever a class must call an element that normally belongs outside its allowed scope, the developer must explicitly annotate the class or method with:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;This annotation expresses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“I acknowledge that I am breaking the usual boundaries.”&lt;/li&gt;
&lt;li&gt;“This is done for practical, controlled reasons.”&lt;/li&gt;
&lt;li&gt;“This code is still correct within the intended model.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Typical cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A System Abstraction relying on a helper System Abstraction indirectly.&lt;/li&gt;
&lt;li&gt;A System Abstraction using a utility normally reserved to another domain.&lt;/li&gt;
&lt;li&gt;Exceptional bridging between system-level abstractions.&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;6. Summary Table&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Here is a simplified summary of allowed direct usage:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;From / To&lt;/th&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Worker&lt;/th&gt;
&lt;th&gt;Pure Abstraction&lt;/th&gt;
&lt;th&gt;System Abstraction&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✘&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Worker&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✔ (its Agent)&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pure Abstraction&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✘&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✘&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;System Abstraction&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✘&lt;/td&gt;
&lt;td&gt;✔ (its Worker)&lt;/td&gt;
&lt;td&gt;✔&lt;/td&gt;
&lt;td&gt;✔ (same domain)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;@Forc_pract_code&lt;/code&gt; may be added where exceptions are intentional and justified.&lt;/p&gt;




&lt;h4&gt;
  
  
  &lt;strong&gt;7. Purpose of This Model&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;This article does not add rules to the compiler.&lt;br&gt;
It simply clarifies the &lt;strong&gt;intuitive structure&lt;/strong&gt; that naturally emerges from Clprolf:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agents = meaning&lt;/li&gt;
&lt;li&gt;Workers = execution&lt;/li&gt;
&lt;li&gt;Pure Abstractions = logic&lt;/li&gt;
&lt;li&gt;System Abstractions = simulated system capabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This model helps developers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;classify new classes correctly,&lt;/li&gt;
&lt;li&gt;avoid mixing concerns accidentally,&lt;/li&gt;
&lt;li&gt;navigate and design complex systems more safely,&lt;/li&gt;
&lt;li&gt;recognize patterns inside existing codebases (e.g., Java libraries),&lt;/li&gt;
&lt;li&gt;understand how system-oriented classes are structured internally.&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>java</category>
      <category>designpatterns</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>Separating Class Responsibilities with Clprolf</title>
      <dc:creator>Charles Koffler</dc:creator>
      <pubDate>Thu, 04 Dec 2025 18:06:42 +0000</pubDate>
      <link>https://dev.to/charles_koffler_bcabc582b/separating-class-responsibilities-with-clprolf-7f</link>
      <guid>https://dev.to/charles_koffler_bcabc582b/separating-class-responsibilities-with-clprolf-7f</guid>
      <description>&lt;p&gt;Designing clean, well-structured classes is a central challenge in object-oriented programming.&lt;br&gt;
Clprolf addresses this by introducing &lt;strong&gt;declensions&lt;/strong&gt; — a simple way to express the nature of a class and the domain it belongs to.&lt;/p&gt;

&lt;p&gt;Rather than replacing your existing architecture, Clprolf integrates naturally with it.&lt;br&gt;
Your &lt;strong&gt;repositories, services, controllers, entities, abstractions&lt;/strong&gt; all stay where they are.&lt;br&gt;
You simply add a declension to each class, and Clprolf helps maintain a clear separation between domains.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌐 Why the term “declension”?
&lt;/h2&gt;

&lt;p&gt;The word &lt;em&gt;declension&lt;/em&gt; is borrowed from languages, where a word changes form depending on its use while keeping the same core identity.&lt;br&gt;
Clprolf applies the idea to objects: a &lt;strong&gt;declension&lt;/strong&gt; tells whether a class belongs to the &lt;strong&gt;business/domain layer&lt;/strong&gt; (&lt;code&gt;agent&lt;/code&gt;) or the &lt;strong&gt;technical layer&lt;/strong&gt; (&lt;code&gt;worker_agent&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Within a declension, synonyms simply refine the intention without changing the domain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;agent&lt;/strong&gt; → active business element&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;abstraction&lt;/strong&gt; → conceptual domain element&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;simu_real_obj&lt;/strong&gt; → active entity in a simulation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s a compact way to express:&lt;br&gt;
&lt;strong&gt;one architectural identity, several possible nuances — just like in natural languages.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  1) Two main declensions for two domains
&lt;/h2&gt;

&lt;p&gt;Every class with methods must declare its domain through one of two declensions:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;🔹 agent&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Business logic, domain concepts, abstractions, simulation entities.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;🔹 worker_agent&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Technical components: repositories, display logic, file operations, system interactions, launchers.&lt;/p&gt;

&lt;p&gt;This approach keeps the &lt;strong&gt;business layer&lt;/strong&gt; and the &lt;strong&gt;technical layer&lt;/strong&gt; cleanly separated.&lt;/p&gt;




&lt;h2&gt;
  
  
  2) Synonyms to express different perspectives
&lt;/h2&gt;

&lt;p&gt;Declensions also have synonyms, allowing the developer to choose the term that best reflects the class’s intention.&lt;/p&gt;

&lt;h3&gt;
  
  
  For the &lt;strong&gt;agent&lt;/strong&gt; declension:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;agent&lt;/strong&gt; — main, general-purpose synonym&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;abstraction&lt;/strong&gt; — for conceptual or structural elements (&lt;code&gt;List&lt;/code&gt;, &lt;code&gt;Button&lt;/code&gt;, &lt;code&gt;Color&lt;/code&gt;, &lt;code&gt;Connection&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;A &lt;code&gt;List&lt;/code&gt; &lt;strong&gt;is an abstraction&lt;/strong&gt;, not a technical component.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;simu_real_obj&lt;/strong&gt; — for objects inside a simulation&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  For &lt;strong&gt;worker_agent&lt;/strong&gt;:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;worker_agent&lt;/strong&gt; — main synonym&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;comp_as_worker&lt;/strong&gt; — same meaning, with a simulation nuance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These synonyms do not change the actual domain; they simply refine how the developer describes their component.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;One nice effect of the system is that developers rarely disagree on which synonym to use.&lt;br&gt;
The distinctions are natural, non-overlapping, and easy to recognize: “this is an abstraction”, “this is a business agent”, “this belongs to a simulation”.&lt;br&gt;
The result is both expressive and stable — a balance that many object-oriented developers appreciate.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  3) Declensions work &lt;em&gt;with&lt;/em&gt; your existing components
&lt;/h2&gt;

&lt;p&gt;Clprolf does &lt;strong&gt;not&lt;/strong&gt; replace Service, Repository, or Controller roles.&lt;br&gt;
It &lt;strong&gt;adds&lt;/strong&gt; a declension on top of them to ensure consistency.&lt;/p&gt;

&lt;p&gt;A typical mapping is:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component type&lt;/th&gt;
&lt;th&gt;Declension&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Repository / DAO&lt;/td&gt;
&lt;td&gt;worker_agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service&lt;/td&gt;
&lt;td&gt;agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Controller&lt;/td&gt;
&lt;td&gt;agent&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Clprolf then supervises inheritance between these components &lt;strong&gt;indirectly&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;code&gt;worker_agent&lt;/code&gt; &lt;strong&gt;cannot&lt;/strong&gt; inherit from an &lt;code&gt;agent&lt;/code&gt;
→ a Repository cannot inherit from a Service&lt;/li&gt;
&lt;li&gt;An &lt;code&gt;agent&lt;/code&gt; cannot inherit from a technical class&lt;/li&gt;
&lt;li&gt;Two synonyms of the same declension may inherit, but a warning indicates differing perspectives&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach ensures that &lt;strong&gt;your components remain clean and simple&lt;/strong&gt;, and remain in their intended domain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Different teams may interpret controllers differently.&lt;br&gt;
Clprolf maps them to &lt;code&gt;agent&lt;/code&gt; because they coordinate domain behavior rather than executing technical work. Still, if a particular architecture treats controllers as purely technical endpoints, using &lt;code&gt;worker_agent&lt;/code&gt; is acceptable as long as the choice remains consistent across the application.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4) Domain consistency through inheritance rules
&lt;/h2&gt;

&lt;p&gt;Because the domain is declared in the class, inheritance remains coherent.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✔ Allowed
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;abstraction&lt;/code&gt; → &lt;code&gt;agent&lt;/code&gt; (same declension, different synonym → warning)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ❌ Not allowed
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;worker_agent&lt;/code&gt; → &lt;code&gt;agent&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;DAO → Service&lt;/li&gt;
&lt;li&gt;Technical → Business&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This prevents accidental cross-domain inheritance and avoids mixing responsibilities over time.&lt;/p&gt;

&lt;p&gt;Clprolf does not redefine object-oriented programming — it simply guides component relationships so domain boundaries remain intact.&lt;/p&gt;




&lt;h2&gt;
  
  
  5) Why this is useful in practice
&lt;/h2&gt;

&lt;p&gt;With Clprolf declensions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;your business logic and technical logic stay separated,&lt;/li&gt;
&lt;li&gt;your class hierarchy cannot drift into inconsistent states,&lt;/li&gt;
&lt;li&gt;abstraction objects stay abstractions,&lt;/li&gt;
&lt;li&gt;technical classes cannot absorb business code,&lt;/li&gt;
&lt;li&gt;and domain organization becomes clearer for any developer joining the project.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clprolf keeps your components &lt;strong&gt;predictable, readable, and consistent&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  6) Class declensions and SOLID
&lt;/h2&gt;

&lt;p&gt;Declensions are only one part of Clprolf, but they support a powerful idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Each object expresses a unique and well-defined kind of work.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This aligns naturally with the &lt;strong&gt;Single Responsibility Principle&lt;/strong&gt;.&lt;br&gt;
A class belongs to exactly one domain, expressed through its declension.&lt;br&gt;
Its methods then follow that domain.&lt;/p&gt;

&lt;p&gt;Furthermore, &lt;strong&gt;Clprolf interfaces can target these class roles&lt;/strong&gt;, allowing version and capacity interfaces to match the intended domain of the classes that implement them.&lt;/p&gt;

&lt;p&gt;This gives developers a clear, structured way to define both &lt;strong&gt;what an object is&lt;/strong&gt; and &lt;strong&gt;what kind of work it performs&lt;/strong&gt;, while remaining fully compatible with established SOLID principles.&lt;/p&gt;




&lt;h2&gt;
  
  
  📌 How does this relate to DDD or Clean Architecture?
&lt;/h2&gt;

&lt;p&gt;Clprolf does not replace DDD or Clean Architecture — it works alongside them.&lt;br&gt;
DDD focuses on how to &lt;em&gt;model&lt;/em&gt; the domain, while Clean Architecture defines how to &lt;em&gt;separate&lt;/em&gt; the domain from technical concerns.&lt;/p&gt;

&lt;p&gt;Clprolf is closest to Clean Architecture in spirit, but with a key difference:&lt;br&gt;
&lt;strong&gt;it enforces architecturally clean boundaries at the language level.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Domain classes (&lt;code&gt;agent&lt;/code&gt;) and technical classes (&lt;code&gt;worker_agent&lt;/code&gt;) cannot be mixed through inheritance.&lt;/li&gt;
&lt;li&gt;Abstractions (&lt;code&gt;abstraction&lt;/code&gt;) remain structural domain concepts, never technical utilities.&lt;/li&gt;
&lt;li&gt;Technical components cannot “leak” into domain logic by accident.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where DDD and Clean Architecture rely on discipline and conventions,&lt;br&gt;
&lt;strong&gt;Clprolf turns those boundaries into compiler-checked guarantees&lt;/strong&gt;, ensuring that domain and technical layers stay clean over time — without additional frameworks or architectural policing.&lt;/p&gt;

&lt;h3&gt;
  
  
  📌 Summary comparison
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Main focus&lt;/th&gt;
&lt;th&gt;Boundary enforcement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DDD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Domain modelling, ubiquitous language&lt;/td&gt;
&lt;td&gt;By conventions and team discipline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Clean Architecture&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Separation of domain vs technical layers&lt;/td&gt;
&lt;td&gt;By guidelines, patterns, and project structure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Clprolf&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Declensions: domain vs technical roles&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Compiler-checked, enforced by the language&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  📌 Is Clprolf too rigid?
&lt;/h2&gt;

&lt;p&gt;Clprolf may appear strict at first because it enforces a clear boundary between domain classes (&lt;code&gt;agent&lt;/code&gt;) and technical classes (&lt;code&gt;worker_agent&lt;/code&gt;).&lt;br&gt;
But this strictness is no greater than what developers already follow with the Single Responsibility Principle.&lt;/p&gt;

&lt;p&gt;In practice, Clprolf simply makes explicit what good design requires anyway:&lt;br&gt;
a class should have one kind of responsibility, and belong to one area of the architecture.&lt;br&gt;
Declensions formalize this separation so it remains consistent over time — without adding more constraints than SRP itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  Examples with the Clprolf Java Framework (one-to-one with the Clprolf language declensions)
&lt;/h2&gt;

&lt;p&gt;Below are a few simple examples using the Clprolf Java framework. They demonstrate how declensions integrate naturally into everyday classes.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Example 1 — A simple Service using a Repository
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Agent&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;OrderRepository&lt;/span&gt; &lt;span class="n"&gt;repository&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;OrderRepository&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;validateAndStore&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;orderId&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Business logic&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Validating order "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;orderId&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Technical operation delegated to a worker_agent&lt;/span&gt;
        &lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;save&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orderId&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;➡️ &lt;code&gt;OrderService&lt;/code&gt; is &lt;strong&gt;pure business logic&lt;/strong&gt;&lt;br&gt;
➡️ The service uses a technical component, not the other way around&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Example 2 — A simple Repository (technical layer)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Worker_agent&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderRepository&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;orderId&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Saving order "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;orderId&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;➡️ &lt;code&gt;OrderRepository&lt;/code&gt; is &lt;strong&gt;technical work&lt;/strong&gt;&lt;br&gt;
➡️ No business rules inside&lt;/p&gt;




&lt;h3&gt;
  
  
  ❌ Example 3 — Forbidden inheritance (Repository → Service)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Worker_agent&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;WrongRepo&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;OrderService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ❌ Compilation error:&lt;/span&gt;
    &lt;span class="c1"&gt;// A worker_agent cannot inherit from an agent.&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clprolf prevents mixing domains through inheritance.&lt;br&gt;
A technical class cannot extend a business class.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Example 4 — A simple real Agent (clean example)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Agent&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Animal&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;eat&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;food&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"The animal eats "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;food&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;➡️ A real domain object&lt;br&gt;
➡️ No abstraction tricks, no simulation complexity&lt;br&gt;
➡️ Just a clean agent example&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Example 5 - A Checkout service
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Agent&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CheckoutService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;OrderRepository&lt;/span&gt; &lt;span class="n"&gt;orders&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;OrderRepository&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;PaymentRepository&lt;/span&gt; &lt;span class="n"&gt;payments&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;PaymentRepository&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;checkout&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;orderId&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;save&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orderId&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;payments&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;process&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orderId&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Another technical operation&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🟦 What these examples demonstrate
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You keep your usual components: &lt;strong&gt;Service, Repository, Controller…&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Clprolf adds &lt;strong&gt;&lt;a class="mentioned-user" href="https://dev.to/agent"&gt;@agent&lt;/a&gt;&lt;/strong&gt; or &lt;strong&gt;@Worker_agent&lt;/strong&gt; on top&lt;/li&gt;
&lt;li&gt;The service naturally &lt;em&gt;contains&lt;/em&gt; its technical worker (Repository)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inheritance stays clean&lt;/strong&gt;: business ←→ technical separation is preserved&lt;/li&gt;
&lt;li&gt;The domain is easier to maintain and reason about&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🟩 Final line
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Declensions are one part of Clprolf: they define objects with a single, clear type of work, support solid domain separation, remain compatible with SOLID, and can even be targeted by Clprolf interfaces.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📚 Official documentation
&lt;/h2&gt;

&lt;p&gt;Full Clprolf manual, specs, and framework:&lt;br&gt;
&lt;a href="https://github.com/charleskoffler/clprolf" rel="noopener noreferrer"&gt;https://github.com/charleskoffler/clprolf&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>oop</category>
      <category>designpatterns</category>
      <category>architecture</category>
    </item>
    <item>
      <title>“One Reason to Change” — The Forgotten Logic Behind the SRP (and How Clprolf Completes It)</title>
      <dc:creator>Charles Koffler</dc:creator>
      <pubDate>Thu, 13 Nov 2025 15:26:48 +0000</pubDate>
      <link>https://dev.to/charles_koffler_bcabc582b/one-reason-to-change-the-forgotten-logic-behind-the-srp-and-how-clprolf-completes-it-1n5o</link>
      <guid>https://dev.to/charles_koffler_bcabc582b/one-reason-to-change-the-forgotten-logic-behind-the-srp-and-how-clprolf-completes-it-1n5o</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;1. The SRP is not wrong, just incomplete&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The &lt;em&gt;Single Responsibility Principle&lt;/em&gt; (SRP) is quoted everywhere.&lt;br&gt;
But behind its mythical sentence —&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“A class should have only one reason to change.”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;— lies a deep ambiguity.&lt;br&gt;
What is a &lt;em&gt;reason&lt;/em&gt;? Whose responsibility are we talking about?&lt;br&gt;
And why &lt;em&gt;one&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;The SRP was never false — it was simply unfinished.&lt;br&gt;
It sensed a truth, but never named it.&lt;br&gt;
That’s where &lt;strong&gt;Clprolf&lt;/strong&gt; steps in: not to oppose, but to complete the story.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;2. What the SRP really implies (if we take it seriously)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If all methods of a class must change for the same reason,&lt;br&gt;
then they all participate in the &lt;strong&gt;same work&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That alone leads to two clear consequences:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Technical and business layers must be separated.&lt;/strong&gt;&lt;br&gt;
A technical change (like a database driver) shouldn’t affect business rules.&lt;br&gt;
A business rule shouldn’t require refactoring a technical class.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Each class must have a unique theme — its own nature.&lt;/strong&gt;&lt;br&gt;
That theme unites all methods, gives the class its identity,&lt;br&gt;
and defines its natural scope.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;In other words: respecting SRP means respecting both&lt;br&gt;
&lt;em&gt;layer separation&lt;/em&gt; and &lt;em&gt;nature unity.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;3. Responsibility belongs to the class, not to its methods&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Responsibility doesn’t live in methods.&lt;br&gt;
Each method performs a specific action —&lt;br&gt;
but the &lt;em&gt;class itself&lt;/em&gt; carries a single overarching responsibility.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Example:&lt;br&gt;
A &lt;strong&gt;Doctor&lt;/strong&gt; class has one responsibility — the health of its patients.&lt;br&gt;
Its methods (&lt;em&gt;takeBloodPressure()&lt;/em&gt;, &lt;em&gt;prescribeTreatment()&lt;/em&gt;, &lt;em&gt;analyzeResults()&lt;/em&gt;)&lt;br&gt;
each do something different,&lt;br&gt;
but they all serve the same responsibility.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Methods &lt;strong&gt;express&lt;/strong&gt; the responsibility — they don’t define it.&lt;br&gt;
They are the visible forms of a single coherent duty.&lt;/p&gt;

&lt;p&gt;Confusing method-level actions with class-level responsibility&lt;br&gt;
is what leads to fragmentation, over-engineering, and endless SRP debates.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;⚠️ Misinterpretation Alert — SRP ≠ “one method per class”&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A widespread misunderstanding asserts that obeying the SRP means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“A class should do only one thing, so it should have only one method.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is a &lt;strong&gt;complete misunderstanding&lt;/strong&gt; of the principle.&lt;br&gt;
An object is defined by a set of related operations belonging to the same domain.&lt;br&gt;
A class may (and should) have many methods —&lt;br&gt;
&lt;strong&gt;as long as they all serve the same nature.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SRP is violated when a class mixes &lt;em&gt;domains&lt;/em&gt;,&lt;br&gt;
not when it has multiple methods within the same one.&lt;/p&gt;

&lt;p&gt;This confusion came from treating “responsibility” as an action,&lt;br&gt;
instead of what it truly is:&lt;br&gt;
&lt;strong&gt;a conceptual duty flowing from the class’s nature.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;4. The chain of meaning: Change → Responsibility → Nature&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A class doesn’t change for arbitrary reasons.&lt;br&gt;
It changes because its &lt;strong&gt;responsibility&lt;/strong&gt; evolves.&lt;br&gt;
And that responsibility exists only as an expression of the class’s &lt;strong&gt;nature&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Example:&lt;br&gt;
The way a doctor takes blood pressure might change —&lt;br&gt;
a new device, a new procedure —&lt;br&gt;
but the &lt;em&gt;reason&lt;/em&gt; stays the same: maintaining the patient’s health.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The technical details evolve,&lt;br&gt;
but the &lt;strong&gt;responsibility&lt;/strong&gt; remains constant,&lt;br&gt;
because it’s rooted in the same &lt;strong&gt;nature&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So when we say &lt;em&gt;“one reason to change”&lt;/em&gt;,&lt;br&gt;
we are really saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Change belongs to responsibility, and responsibility belongs to nature.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When that hierarchy is respected,&lt;br&gt;
evolution no longer breaks coherence — it confirms it.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;5. Where Clprolf brings clarity&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This is exactly where &lt;strong&gt;Clprolf&lt;/strong&gt; goes beyond discussion.&lt;br&gt;
Clprolf doesn’t &lt;em&gt;interpret&lt;/em&gt; the SRP — it &lt;strong&gt;makes it concrete&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In Clprolf:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;every class explicitly declares its &lt;strong&gt;nature&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;its &lt;strong&gt;responsibility&lt;/strong&gt; flows directly from that nature;&lt;/li&gt;
&lt;li&gt;and its methods remain coherent by design.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don’t &lt;em&gt;try&lt;/em&gt; to obey the SRP —&lt;br&gt;
you &lt;strong&gt;can’t violate it&lt;/strong&gt; anymore.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In Clprolf, the SRP stops being a principle.&lt;br&gt;
It becomes a &lt;strong&gt;structural fact of the language&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By grounding responsibility in nature, Clprolf turns moral advice into measurable architecture.&lt;br&gt;
It brings peace where other frameworks bring anxiety —&lt;br&gt;
and replaces “clean code” slogans with genuine clarity.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;6. Conclusion — From principle to clarity&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The SRP was never the enemy.&lt;br&gt;
It simply stopped halfway.&lt;/p&gt;

&lt;p&gt;It pointed toward the need for a single reason to change,&lt;br&gt;
but never defined where that reason comes from.&lt;/p&gt;

&lt;p&gt;Today, with Clprolf, we can finally complete the sentence:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“A class should have only one reason to change —&lt;br&gt;
&lt;strong&gt;because it has only one nature.&lt;/strong&gt;”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And at last, the debate can end.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 &lt;strong&gt;Summary Table&lt;/strong&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nature&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What the class &lt;em&gt;is&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Doctor&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Responsibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;What the class &lt;em&gt;does&lt;/em&gt; as a whole&lt;/td&gt;
&lt;td&gt;Health of patients&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Method&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How it does it concretely&lt;/td&gt;
&lt;td&gt;&lt;code&gt;takeBloodPressure()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When &lt;strong&gt;nature&lt;/strong&gt;, &lt;strong&gt;responsibility&lt;/strong&gt;, and &lt;strong&gt;methods&lt;/strong&gt; stay aligned,&lt;br&gt;
change becomes natural, predictable, and never chaotic.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔎 &lt;strong&gt;Bonus — What SRP &lt;em&gt;really&lt;/em&gt; means at the method level&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;SRP &lt;em&gt;does&lt;/em&gt; have a meaningful application at the &lt;strong&gt;method&lt;/strong&gt; level —&lt;br&gt;
but almost never in the way people describe it.&lt;/p&gt;

&lt;p&gt;The most important rule is the simplest one:&lt;/p&gt;

&lt;p&gt;⭐ **A business method must never contain technical code.&lt;/p&gt;

&lt;p&gt;A technical method must never contain business logic.**&lt;/p&gt;

&lt;p&gt;This is the &lt;em&gt;real&lt;/em&gt; source of method-level SRP violations.&lt;/p&gt;

&lt;p&gt;When a method mixes domain logic with infrastructure logic,&lt;br&gt;
it immediately acquires &lt;strong&gt;two distinct reasons to change&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the domain rules may evolve independently,&lt;/li&gt;
&lt;li&gt;the technical concerns (I/O, persistence, networking…) may evolve independently.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a textbook SRP violation —&lt;br&gt;
and the most dangerous and common one.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✔ What does &lt;em&gt;not&lt;/em&gt; violate SRP
&lt;/h3&gt;

&lt;p&gt;Most of what people call “SRP violations” are &lt;em&gt;not&lt;/em&gt; violations at all:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a method that is long,&lt;/li&gt;
&lt;li&gt;a method with several internal steps,&lt;/li&gt;
&lt;li&gt;a method that has sub-operations,&lt;/li&gt;
&lt;li&gt;a method that has an inline algorithm.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All these cases are simply the decomposition&lt;br&gt;
of &lt;strong&gt;one single algorithmic intention&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Algorithmic steps do &lt;strong&gt;not&lt;/strong&gt; create multiple responsibilities.&lt;br&gt;
They are not “reasons to change” — they are &lt;em&gt;implementation detail&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;SRP is about &lt;strong&gt;cross-domain evolution&lt;/strong&gt;, not&lt;br&gt;
micro-method minimalism.&lt;/p&gt;




&lt;h3&gt;
  
  
  ⭐ Clprolf makes method-level SRP &lt;em&gt;automatic&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;In Clprolf, method-level SRP is guaranteed structurally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An &lt;strong&gt;agent&lt;/strong&gt; may contain &lt;strong&gt;only business logic&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;worker_agent&lt;/strong&gt; may contain &lt;strong&gt;only technical logic&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;model&lt;/strong&gt; contains no logic at all.&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;abstraction&lt;/strong&gt; has no domain-specific code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because a class has &lt;strong&gt;one nature&lt;/strong&gt;,&lt;br&gt;
its methods cannot cross boundaries.&lt;/p&gt;

&lt;h4&gt;
  
  
  ✔ No business logic in technical methods
&lt;/h4&gt;

&lt;h4&gt;
  
  
  ✔ No technical logic in business methods
&lt;/h4&gt;

&lt;h4&gt;
  
  
  ✔ No cross-layer pollution
&lt;/h4&gt;

&lt;h4&gt;
  
  
  ✔ No accidental reasons to change
&lt;/h4&gt;

&lt;p&gt;The only remaining “method-level SRP” cases are pure algorithmic ones —&lt;br&gt;
and these are naturally handled by regular refactoring:&lt;br&gt;
extracting a method when internal parts evolve independently.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧭 Summary
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Method-level SRP = prevent cross-domain mixing.&lt;br&gt;
Algorithmic decomposition is not a responsibility issue.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Clprolf enforces domain purity by design,&lt;br&gt;
so method-level SRP becomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;objective,&lt;/li&gt;
&lt;li&gt;structural,&lt;/li&gt;
&lt;li&gt;automatic,&lt;/li&gt;
&lt;li&gt;and no longer a subjective stylistic debate.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🧠 &lt;em&gt;About Clprolf&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Clprolf (Clear Programming Language &amp;amp; Framework)&lt;/strong&gt; is a Java-compatible language that brings semantic clarity to software design.&lt;br&gt;
It redefines classes through &lt;strong&gt;declared roles and natures&lt;/strong&gt;,&lt;br&gt;
bridging the gap between &lt;strong&gt;human meaning&lt;/strong&gt; and &lt;strong&gt;technical structure&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Learn more: &lt;a href="https://github.com/charleskoffler/clprolf" rel="noopener noreferrer"&gt;github.com/charleskoffler/clprolf&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Final note – Change as a Sign of Duty&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Change, in the end, is not a sign of instability.&lt;br&gt;
It is the quiet proof that the class takes its duty seriously.&lt;br&gt;
A class evolves not because it is flawed,&lt;br&gt;
but because it remains faithful to its responsibility —&lt;br&gt;
and to the mission that gives it meaning.&lt;/p&gt;




&lt;p&gt;In the end, what the SRP truly meant was simple:&lt;br&gt;
no mixing of layers,&lt;br&gt;
no multiple inheritance,&lt;br&gt;
and a clear, single meaning given to each class.&lt;/p&gt;




</description>
      <category>designpatterns</category>
      <category>java</category>
      <category>development</category>
    </item>
    <item>
      <title>🗂️ Clprolf Directory Explorer — When Breadth-First Becomes Intuitive</title>
      <dc:creator>Charles Koffler</dc:creator>
      <pubDate>Sun, 19 Oct 2025 21:24:37 +0000</pubDate>
      <link>https://dev.to/charles_koffler_bcabc582b/clprolf-directory-explorer-when-breadth-first-becomes-intuitive-5a0f</link>
      <guid>https://dev.to/charles_koffler_bcabc582b/clprolf-directory-explorer-when-breadth-first-becomes-intuitive-5a0f</guid>
      <description>&lt;p&gt;Everyone knows that exploring directories can quickly turn into a messy technical exercise:&lt;br&gt;
loops, recursion, stacks, file filters… and code that loses all readability.&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;Clprolf&lt;/strong&gt;, clarity is built-in.&lt;br&gt;
You don’t just write &lt;em&gt;code&lt;/em&gt; — you design &lt;strong&gt;agents&lt;/strong&gt;, &lt;strong&gt;workers&lt;/strong&gt;, and &lt;strong&gt;models&lt;/strong&gt; that reflect what really happens.&lt;br&gt;
Let’s see how a simple &lt;em&gt;directory explorer&lt;/em&gt; can become a beautifully structured program.&lt;/p&gt;


&lt;h3&gt;
  
  
  💡 1. The Concept
&lt;/h3&gt;

&lt;p&gt;We want to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;explore all subdirectories of a given folder,&lt;/li&gt;
&lt;li&gt;in &lt;strong&gt;breadth-first&lt;/strong&gt; order (level by level),&lt;/li&gt;
&lt;li&gt;assign each directory a hierarchical ID,&lt;/li&gt;
&lt;li&gt;and display the results cleanly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of mixing logic, display, and data handling,&lt;br&gt;
Clprolf invites us to split them into &lt;strong&gt;roles&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Declension&lt;/th&gt;
&lt;th&gt;Responsibility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Launcher&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@Worker_agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Starts the exploration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DirectoryExplorerImpl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@Agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Performs the exploration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DirectoryExplorerWorkerImpl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@Worker_agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Displays results&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Directory&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@Model&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Represents one directory node&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;DirectoryExplorer&lt;/code&gt; / &lt;code&gt;DirectoryExplorerWorker&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@Version_inh&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Define contracts between roles&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h3&gt;
  
  
  ⚙️ 2. The Launcher
&lt;/h3&gt;

&lt;p&gt;The entry point is as simple as it looks.&lt;br&gt;
It prepares the environment and delegates the job to the proper agent.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Worker_agent&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Launcher&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nd"&gt;@With_compat&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Paths&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"user.home"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toRealPath&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;LinkOption&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;NOFOLLOW_LINKS&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;ignored&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="nc"&gt;Files&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isDirectory&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;err&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Not a directory: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exit&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="nd"&gt;@With_compat&lt;/span&gt; &lt;span class="nc"&gt;DirectoryExplorer&lt;/span&gt; &lt;span class="n"&gt;explorer&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;DirectoryExplorerImpl&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;explorer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;breadthFirstFolders&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It’s clear who does what:&lt;br&gt;
this worker doesn’t explore — it simply &lt;em&gt;launches the agent&lt;/em&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  🧭 3. The Agent — &lt;code&gt;DirectoryExplorerImpl&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Here lies the real exploration logic.&lt;br&gt;
The agent collaborates with a worker, manipulates a model, and manages a queue.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Agent&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DirectoryExplorerImpl&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nd"&gt;@Contracts&lt;/span&gt; &lt;span class="nc"&gt;DirectoryExplorer&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nd"&gt;@With_compat&lt;/span&gt; &lt;span class="nc"&gt;DirectoryExplorerWorker&lt;/span&gt; &lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;DirectoryExplorerImpl&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;worker&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;DirectoryExplorerWorkerImpl&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;breadthFirstFolders&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@With_compat&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt; &lt;span class="n"&gt;directoryPath&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;directoryPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;directoryPath&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;normalize&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;toAbsolutePath&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="nd"&gt;@With_compat&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Directory&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;foldersList&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;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
        &lt;span class="nd"&gt;@With_compat&lt;/span&gt; &lt;span class="nc"&gt;Queue&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Directory&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;directoryToExplore&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;LinkedList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;

        &lt;span class="n"&gt;directoryToExplore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&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;Directory&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;directoryPath&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)));&lt;/span&gt;

        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;directoryToExplore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;Directory&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;directoryToExplore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;poll&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;foldersList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

            &lt;span class="nc"&gt;File&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getPath&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;toFile&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;listFiles&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;File&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isDirectory&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                        &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;newId&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;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getHierarchicalId&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
                        &lt;span class="n"&gt;newId&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
                        &lt;span class="n"&gt;directoryToExplore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&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;Directory&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toPath&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;normalize&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;toAbsolutePath&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;newId&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
                        &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;++;&lt;/span&gt;
                    &lt;span class="o"&gt;}&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;displayResult&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;foldersList&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every part is crystal clear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The queue defines a &lt;strong&gt;breadth-first traversal&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Each directory receives its own &lt;strong&gt;hierarchical ID&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;worker&lt;/strong&gt; takes care of presentation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No recursion, no confusion.&lt;/p&gt;




&lt;h3&gt;
  
  
  👷 4. The Worker Agent
&lt;/h3&gt;

&lt;p&gt;Responsible for showing the result, not for computing it.&lt;br&gt;
Again, we separate &lt;em&gt;doing&lt;/em&gt; from &lt;em&gt;showing&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Worker_agent&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DirectoryExplorerWorkerImpl&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nd"&gt;@Contracts&lt;/span&gt; &lt;span class="nc"&gt;DirectoryExplorerWorker&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;displayResult&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Directory&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;foldersList&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Directory&lt;/span&gt; &lt;span class="n"&gt;dir&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;foldersList&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;display&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;formatId&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getHierarchicalId&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" : "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getPath&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;formatId&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"("&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;", "&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;String:&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;valueOf&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;toArray&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]::&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;")"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple, explicit, human-readable.&lt;/p&gt;




&lt;h3&gt;
  
  
  📦 5. The Model
&lt;/h3&gt;

&lt;p&gt;A &lt;code&gt;@Model&lt;/code&gt; in Clprolf is always clear:&lt;br&gt;
it represents data, and nothing more.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Model&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Directory&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;hierarchicalId&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Directory&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hierarchicalId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt; &lt;span class="nf"&gt;getPath&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;getHierarchicalId&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;hierarchicalId&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No logic, no side effects. Just structure.&lt;/p&gt;




&lt;h3&gt;
  
  
  🤝 6. The Contracts
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Agent&lt;/span&gt;
&lt;span class="nd"&gt;@Version_inh&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;DirectoryExplorer&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;breadthFirstFolders&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Path&lt;/span&gt; &lt;span class="n"&gt;directoryPath&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@Worker_agent&lt;/span&gt;
&lt;span class="nd"&gt;@Version_inh&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;DirectoryExplorerWorker&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;displayResult&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Directory&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;foldersList&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contracts make the collaboration explicit.&lt;br&gt;
No hidden dependencies, no tight coupling — just clear communication.&lt;/p&gt;




&lt;h3&gt;
  
  
  🪶 7. Why it matters
&lt;/h3&gt;

&lt;p&gt;Breadth-first exploration is only the example.&lt;br&gt;
What matters here is &lt;strong&gt;how naturally the architecture expresses itself&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The launcher launches.&lt;/li&gt;
&lt;li&gt;The agent explores.&lt;/li&gt;
&lt;li&gt;The worker displays.&lt;/li&gt;
&lt;li&gt;The model represents.&lt;/li&gt;
&lt;li&gt;The contract binds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clprolf doesn’t just help you code — it helps you &lt;strong&gt;think&lt;/strong&gt;.&lt;br&gt;
The structure emerges from the intention.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✨ Final Thoughts
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;In classical Java, you might have written a single class doing everything.&lt;/p&gt;

&lt;p&gt;In Clprolf, each role finds its natural place.&lt;br&gt;
The result is simple, explicit, and readable — even for someone who never wrote Java before.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Clprolf brings &lt;strong&gt;clarity back into architecture&lt;/strong&gt;,&lt;br&gt;
and even the smallest utilities become examples of well-designed software.&lt;/p&gt;




</description>
      <category>programming</category>
      <category>architecture</category>
      <category>java</category>
    </item>
    <item>
      <title>☀️ WeatherApp MVC — When Clprolf Meets Spring MVC Philosophy</title>
      <dc:creator>Charles Koffler</dc:creator>
      <pubDate>Sun, 05 Oct 2025 21:57:51 +0000</pubDate>
      <link>https://dev.to/charles_koffler_bcabc582b/weatherapp-mvc-when-clprolf-meets-spring-mvc-philosophy-22j0</link>
      <guid>https://dev.to/charles_koffler_bcabc582b/weatherapp-mvc-when-clprolf-meets-spring-mvc-philosophy-22j0</guid>
      <description>&lt;p&gt;Everyone knows the &lt;strong&gt;MVC pattern&lt;/strong&gt;.&lt;br&gt;
But what if you could make it &lt;strong&gt;even clearer&lt;/strong&gt;, more &lt;strong&gt;structurally explicit&lt;/strong&gt;, and &lt;strong&gt;compatible&lt;/strong&gt; with both &lt;em&gt;desktop&lt;/em&gt; and &lt;em&gt;web&lt;/em&gt; architectures?&lt;/p&gt;

&lt;p&gt;That’s what &lt;strong&gt;Clprolf&lt;/strong&gt; does —&lt;br&gt;
it turns the philosophy of &lt;strong&gt;clarity-oriented programming&lt;/strong&gt; into real, verifiable structure.&lt;/p&gt;

&lt;p&gt;Let’s look at a simple example:&lt;br&gt;
a &lt;em&gt;WeatherApp&lt;/em&gt; written in Java + Clprolf annotations —&lt;br&gt;
which behaves like a &lt;strong&gt;Spring MVC&lt;/strong&gt; application,&lt;br&gt;
but runs locally in Swing.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 1. The Idea Behind It
&lt;/h2&gt;

&lt;p&gt;In Spring MVC, a &lt;code&gt;Controller&lt;/code&gt; receives a request,&lt;br&gt;
calls a &lt;code&gt;Repository&lt;/code&gt; or &lt;code&gt;Service&lt;/code&gt;,&lt;br&gt;
and returns a &lt;code&gt;View&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;Clprolf&lt;/strong&gt;, we do exactly the same —&lt;br&gt;
but we &lt;strong&gt;explicitly declare the roles&lt;/strong&gt; of each component.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Clprolf Role&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;WeatherApp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@Worker_agent(Gender.STATIC)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The system launcher (like Spring Boot main)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;WeatherController&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@Agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The “brain” that coordinates the logic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;WeatherRepository&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@Worker_agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Technical layer fetching data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;WeatherRenderer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@Worker_agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The View layer (UI and user input)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🏗️ 2. The Complete Code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;org.clprolf.examples.design_patterns.mvc&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.clprolf.framework.java.Gender&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.clprolf.framework.java.Worker_agent&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Worker_agent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Gender&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;STATIC&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;WeatherApp&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;WeatherController&lt;/span&gt; &lt;span class="n"&gt;controller&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;WeatherController&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🧩 Controller (Agent Layer)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;org.clprolf.examples.design_patterns.mvc&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.clprolf.framework.java.Agent&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.clprolf.framework.java.Gender&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Agent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Gender&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;EXPERT_COMPONENT&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;WeatherController&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;WeatherRepository&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;WeatherRenderer&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;WeatherController&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;model&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;WeatherRepository&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;view&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;WeatherRenderer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;giveTheWeather&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setLocation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fetchWeather&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;forecast&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getForecast&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;displayForecast&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forecast&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This class acts like a &lt;strong&gt;Spring &lt;code&gt;@Controller&lt;/code&gt;&lt;/strong&gt;:&lt;br&gt;
it receives a request (&lt;code&gt;giveTheWeather&lt;/code&gt;),&lt;br&gt;
calls the &lt;strong&gt;repository&lt;/strong&gt;,&lt;br&gt;
and updates the &lt;strong&gt;view&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  🎨 View (Worker Layer)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;org.clprolf.examples.design_patterns.mvc&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.awt.BorderLayout&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.awt.event.ActionEvent&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.awt.event.ActionListener&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.swing.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.clprolf.framework.java.Agent&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.clprolf.framework.java.Contracts&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.clprolf.framework.java.Nature&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.clprolf.framework.java.Worker_agent&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.clprolf.framework.java.Advice&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Worker_agent&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;WeatherRenderer&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;JFrame&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;JTextField&lt;/span&gt; &lt;span class="n"&gt;locationField&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;JTextArea&lt;/span&gt; &lt;span class="n"&gt;forecastArea&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;WeatherController&lt;/span&gt; &lt;span class="n"&gt;expert&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Agent&lt;/span&gt;
    &lt;span class="nd"&gt;@Version_inh&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;WindowObserver&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nd"&gt;@Nature&lt;/span&gt; &lt;span class="nc"&gt;ActionListener&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Agent&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;WindowObserverImpl&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nd"&gt;@Contracts&lt;/span&gt; &lt;span class="nc"&gt;WindowObserver&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="nd"&gt;@Override&lt;/span&gt;
        &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;actionPerformed&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ActionEvent&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getLocationInput&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;expert&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;giveTheWeather&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;WeatherRenderer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;WeatherController&lt;/span&gt; &lt;span class="n"&gt;expert&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;expert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;expert&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;prepareViewObjects&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;prepareViewObjects&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;frame&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;JFrame&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Weather Forecast"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setDefaultCloseOperation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;JFrame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;EXIT_ON_CLOSE&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setSize&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="nc"&gt;JPanel&lt;/span&gt; &lt;span class="n"&gt;panel&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;JPanel&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;BorderLayout&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="nc"&gt;JLabel&lt;/span&gt; &lt;span class="n"&gt;locationLabel&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;JLabel&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Enter Location:"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;locationField&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;JTextField&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;locationField&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addActionListener&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;WindowObserverImpl&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;

        &lt;span class="n"&gt;forecastArea&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;JTextArea&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;forecastArea&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setEditable&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;panel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;locationLabel&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;BorderLayout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;NORTH&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;panel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;locationField&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;BorderLayout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CENTER&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;panel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&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;JScrollPane&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forecastArea&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;BorderLayout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SOUTH&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getContentPane&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;panel&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setVisible&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getLocationInput&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;locationField&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getText&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;displayForecast&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;forecast&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;forecastArea&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forecast&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, the &lt;strong&gt;view&lt;/strong&gt; acts like a web frontend.&lt;br&gt;
It observes user input (capacity-inherited &lt;code&gt;ActionListener&lt;/code&gt;)&lt;br&gt;
and sends the event to the &lt;strong&gt;controller agent&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You could almost replace Swing with HTML/JavaScript&lt;br&gt;
and it would behave the same way!&lt;/p&gt;




&lt;h3&gt;
  
  
  ☁️ Repository (Technical Worker)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;org.clprolf.examples.design_patterns.mvc&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.clprolf.framework.java.Worker_agent&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Worker_agent&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;WeatherRepository&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;forecast&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setLocation&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;fetchWeather&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;forecast&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Sunny with a chance of clouds"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getForecast&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;forecast&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A pure worker: no intelligence, no UI — just technical work.&lt;br&gt;
That’s exactly what a &lt;code&gt;Repository&lt;/code&gt; or &lt;code&gt;Service&lt;/code&gt; does in Spring MVC.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔄 3. The MVC Flow
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User (View) → WeatherRenderer (worker_agent)
             → WeatherController (agent)
             → WeatherRepository (worker_agent)
             → back to WeatherRenderer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;same logical flow&lt;/strong&gt; as Spring MVC —&lt;br&gt;
but here, everything runs locally and instantly.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 4. Why It Matters
&lt;/h2&gt;

&lt;p&gt;This example shows that &lt;strong&gt;Clprolf integrates seamlessly&lt;/strong&gt; with existing patterns.&lt;br&gt;
It doesn’t replace MVC, Spring, or OOP —&lt;br&gt;
it simply &lt;strong&gt;clarifies and strengthens&lt;/strong&gt; them.&lt;/p&gt;

&lt;p&gt;In a Spring app, you’d just change the way communication happens&lt;br&gt;
(HTTP + &lt;code&gt;@GetMapping&lt;/code&gt; instead of direct calls) —&lt;br&gt;
but your &lt;em&gt;roles&lt;/em&gt;, &lt;em&gt;responsibilities&lt;/em&gt;, and &lt;em&gt;architecture&lt;/em&gt; remain identical.&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 5. Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Clprolf makes &lt;strong&gt;architecture visible&lt;/strong&gt;.&lt;br&gt;
You no longer guess what a class &lt;em&gt;is supposed to be&lt;/em&gt;:&lt;br&gt;
you &lt;em&gt;declare it&lt;/em&gt; — explicitly.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A &lt;code&gt;Controller&lt;/code&gt; is an &lt;strong&gt;Agent&lt;/strong&gt;.&lt;br&gt;
A &lt;code&gt;Repository&lt;/code&gt; is a &lt;strong&gt;Worker_agent&lt;/strong&gt;.&lt;br&gt;
A &lt;code&gt;Launcher&lt;/code&gt; is a &lt;strong&gt;Static Worker_agent&lt;/strong&gt;.&lt;br&gt;
A &lt;code&gt;View&lt;/code&gt; is also a &lt;strong&gt;Worker_agent&lt;/strong&gt; — the interface between human and machine.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In short:&lt;br&gt;
Clprolf doesn’t reinvent MVC — it &lt;strong&gt;makes it self-explanatory&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧡 Summary
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Traditional Role&lt;/th&gt;
&lt;th&gt;Clprolf Equivalent&lt;/th&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Controller&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@Agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Logic / Domain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repository&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@Worker_agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Data / Technical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;View&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@Worker_agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Presentation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Launcher&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@Worker_agent(Gender.STATIC)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;System entry&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;blockquote&gt;
&lt;p&gt;🌤️ &lt;em&gt;“It acts as a living interface between human and machine —&lt;br&gt;
the very essence of the worker_agent.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s the clarity and beauty of Clprolf.&lt;/p&gt;




</description>
      <category>programming</category>
      <category>oop</category>
      <category>designpatterns</category>
      <category>architecture</category>
    </item>
    <item>
      <title>🐍 Revisiting Snake in Java with Clprolf — From Clear Code to Clear Game</title>
      <dc:creator>Charles Koffler</dc:creator>
      <pubDate>Sat, 04 Oct 2025 18:23:40 +0000</pubDate>
      <link>https://dev.to/charles_koffler_bcabc582b/revisiting-snake-in-java-with-clprolf-from-clear-code-to-clear-game-2336</link>
      <guid>https://dev.to/charles_koffler_bcabc582b/revisiting-snake-in-java-with-clprolf-from-clear-code-to-clear-game-2336</guid>
      <description>&lt;p&gt;What if writing a small game could prove that architecture can be both &lt;strong&gt;clean&lt;/strong&gt; and &lt;strong&gt;alive&lt;/strong&gt;?&lt;br&gt;
Let’s revisit the classic &lt;strong&gt;Snake&lt;/strong&gt; game — but built with &lt;strong&gt;Clprolf&lt;/strong&gt;,&lt;br&gt;
a paradigm that turns &lt;em&gt;clarity&lt;/em&gt; into a coding language.&lt;/p&gt;


&lt;h3&gt;
  
  
  🧠 1. From OOP to Clarity-Oriented Programming
&lt;/h3&gt;

&lt;p&gt;Clprolf isn’t a framework. It’s a &lt;strong&gt;language layer + methodology&lt;/strong&gt;&lt;br&gt;
that builds &lt;strong&gt;architectural meaning&lt;/strong&gt; into Java itself.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Annotation&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@Agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Domain logic — active and autonomous components&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@Worker_agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Technical performer (I/O, UI, OS, rendering)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@Abstraction&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Conceptual contract or system-level interface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@Model&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Passive structure, pure data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@Underst&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A “thinking” method — where reasoning matters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@Long_action&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A time-based or continuous process&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@With_compat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Declares a safe compatibility link between agents&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When you read Clprolf code, you see &lt;strong&gt;intent&lt;/strong&gt;, not just syntax.&lt;/p&gt;


&lt;h3&gt;
  
  
  ⚙️ 2. The Architecture of the Snake Game
&lt;/h3&gt;

&lt;p&gt;The game has five layers — all explicit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SnakeGameScene (Abstraction)
 ├── SnakeImpl (Agent)
 ├── FoodExpertImpl (Agent)
 ├── SnakeGameSceneRendererImpl (Worker_agent)
 ├── SnakeWindowImpl (Abstraction)
 └── SnakeGamePanelImpl (Abstraction + Swing Nature)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each one knows &lt;strong&gt;exactly what it should know&lt;/strong&gt;, and &lt;strong&gt;nothing more&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For instance, the &lt;code&gt;FoodExpert&lt;/code&gt; agent handles food positions —&lt;br&gt;
but knows nothing about the UI, keyboard, or rendering:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Agent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Gender&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;EXPERT_COMPONENT&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FoodExpertImpl&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nd"&gt;@Contracts&lt;/span&gt; &lt;span class="nc"&gt;FoodExpert&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nd"&gt;@With_compat&lt;/span&gt; &lt;span class="nc"&gt;SnakeGameScene&lt;/span&gt; &lt;span class="n"&gt;scene&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;positionFood&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Random&lt;/span&gt; &lt;span class="n"&gt;random&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;Random&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;
        &lt;span class="n"&gt;food&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setType&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nextBoolean&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="nc"&gt;FoodType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;APPLE&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;FoodType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ORANGE&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;foodList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;food&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Meanwhile, the &lt;strong&gt;Worker Agent&lt;/strong&gt; handles technical events and visual updates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Worker_agent&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SnakeGameSceneRendererImpl&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nd"&gt;@Contracts&lt;/span&gt; &lt;span class="nc"&gt;SnakeGameSceneRenderer&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nd"&gt;@With_compat&lt;/span&gt; &lt;span class="nc"&gt;SnakeGameScene&lt;/span&gt; &lt;span class="n"&gt;scene&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;SnakeGameSceneRendererImpl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;@With_compat&lt;/span&gt; &lt;span class="nc"&gt;SnakeGameScene&lt;/span&gt; &lt;span class="n"&gt;scene&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scene&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;scene&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="nc"&gt;EventQueue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;invokeLater&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Executed in AWT thread&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;window&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;SnakeWindowImpl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// creates and starts rendering&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🔁 3. Understanding the Flow of Life — The Snake Logic
&lt;/h3&gt;

&lt;p&gt;The magic happens in &lt;code&gt;SnakeImpl&lt;/code&gt;.&lt;br&gt;
It shows how &lt;strong&gt;Clprolf models living behavior&lt;/strong&gt;:&lt;br&gt;
sliding, growing, interacting — without spaghetti code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Underst&lt;/span&gt;
&lt;span class="nd"&gt;@Long_action&lt;/span&gt;
&lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;continueSliding&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lastSlidingType&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nc"&gt;SlidingType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;STOPPED&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nc"&gt;SnakeLink&lt;/span&gt; &lt;span class="n"&gt;newHeadLink&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;computeHeadLink&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;links&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="n"&gt;checkCollisionsForNewHead&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newHeadLink&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="nc"&gt;Food&lt;/span&gt; &lt;span class="n"&gt;foodAtNewHeadPlace&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scene&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getFoodExpert&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getFoodAt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newHeadLink&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newHeadLink&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;updateBodyForSliding&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;foodAtNewHeadPlace&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newHeadLink&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;@Underst&lt;/code&gt; annotation reminds that the logic involves &lt;strong&gt;reasoning&lt;/strong&gt; —&lt;br&gt;
not just a trivial mechanical step.&lt;br&gt;
Each call represents an &lt;em&gt;intention&lt;/em&gt; (“continue sliding”, “handle food”, “grow body”).&lt;br&gt;
The structure itself communicates &lt;strong&gt;meaning&lt;/strong&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  🎨 4. Rendering Without Losing the Model
&lt;/h3&gt;

&lt;p&gt;The UI never controls the game directly.&lt;br&gt;
The window only refreshes every 20 ms —&lt;br&gt;
and triggers the next logic step &lt;strong&gt;inside the paint cycle&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Override&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;paintComponent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Graphics&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;paintComponent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;drawSnakes&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;drawFood&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// End of long actions — one physics step every few frames&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;gameWindow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getReal&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getScene&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getSnake&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;endLongActions&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;gameWindow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getReal&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getScene&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getSnake_two&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;endLongActions&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So the &lt;strong&gt;render loop and game loop are naturally synchronized&lt;/strong&gt; —&lt;br&gt;
without timers, threads, or complicated scheduling.&lt;/p&gt;


&lt;h3&gt;
  
  
  🪢 5. Loose Coupling by Design — Not by Effort
&lt;/h3&gt;

&lt;p&gt;With &lt;code&gt;@With_compat&lt;/code&gt;, compatibility is both explicit and enforced:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SnakeImpl&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nd"&gt;@Contracts&lt;/span&gt; &lt;span class="nc"&gt;Snake&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="nd"&gt;@With_compat&lt;/span&gt; &lt;span class="nc"&gt;SnakeGameScene&lt;/span&gt; &lt;span class="n"&gt;scene&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a component tries to depend on something it shouldn’t —&lt;br&gt;
Clprolf makes it visible, conceptually and syntactically.&lt;br&gt;
You see the architecture &lt;em&gt;as you read the code.&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  💡 6. What We Learn from This Example
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You can build a &lt;strong&gt;complete game architecture&lt;/strong&gt; without losing clarity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Long actions&lt;/strong&gt; and &lt;strong&gt;reasoning methods&lt;/strong&gt; bring life-like modeling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workers&lt;/strong&gt; act as true performers, keeping the domain clean.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compatibility links&lt;/strong&gt; replace DI frameworks and reflection.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;render loop&lt;/strong&gt; stays synchronous, transparent, and elegant.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;The result? A Snake that’s both fun and architecturally flawless.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  🏁 Conclusion
&lt;/h3&gt;

&lt;p&gt;Clprolf isn’t about writing fancy syntax.&lt;br&gt;
It’s about making &lt;strong&gt;clarity a property of the codebase itself.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;From &lt;strong&gt;clear code&lt;/strong&gt; to &lt;strong&gt;clear game&lt;/strong&gt;,&lt;br&gt;
we didn’t just rewrite Snake — we &lt;strong&gt;understood it&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;🧩 &lt;strong&gt;Full source code available here:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
👉 &lt;a href="https://github.com/charleskoffler/clprolf/tree/main/clprolf_games_examples/snake-game" rel="noopener noreferrer"&gt;GitHub — Clprolf Snake Game&lt;/a&gt;&lt;/p&gt;




</description>
      <category>programming</category>
      <category>java</category>
      <category>designpatterns</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Composite Pattern in Clprolf — Example with Files and Folders</title>
      <dc:creator>Charles Koffler</dc:creator>
      <pubDate>Thu, 02 Oct 2025 19:29:32 +0000</pubDate>
      <link>https://dev.to/charles_koffler_bcabc582b/composite-pattern-in-clprolf-example-with-files-and-folders-45a7</link>
      <guid>https://dev.to/charles_koffler_bcabc582b/composite-pattern-in-clprolf-example-with-files-and-folders-45a7</guid>
      <description>&lt;p&gt;The &lt;strong&gt;Composite pattern&lt;/strong&gt; solves a classic problem:&lt;br&gt;
👉 &lt;em&gt;How to treat simple objects (“leaves”) and groups of objects (“composites”) in the same way?&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  In Traditional OOP
&lt;/h2&gt;

&lt;p&gt;In OOP, we usually create:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;strong&gt;Component&lt;/strong&gt; interface,&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;Leaf&lt;/strong&gt; class (e.g., a &lt;code&gt;File&lt;/code&gt;) with no children,&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;Composite&lt;/strong&gt; class (e.g., a &lt;code&gt;Folder&lt;/code&gt;) that contains other components.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It works, but the design often feels implicit: we must &lt;em&gt;know&lt;/em&gt; by convention that &lt;code&gt;File&lt;/code&gt; is a leaf and &lt;code&gt;Folder&lt;/code&gt; is a composite.&lt;/p&gt;




&lt;h2&gt;
  
  
  In Clprolf
&lt;/h2&gt;

&lt;p&gt;With &lt;strong&gt;Clprolf&lt;/strong&gt;, roles and contracts make the Composite &lt;strong&gt;explicit&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;FileSystemComponent&lt;/code&gt; is the contract for all components.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;File&lt;/code&gt; is a &lt;strong&gt;Leaf&lt;/strong&gt;: an &lt;code&gt;abstraction&lt;/code&gt; with no extra methods.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Folder&lt;/code&gt; is a &lt;strong&gt;Composite&lt;/strong&gt;: an &lt;code&gt;abstraction&lt;/code&gt; with &lt;code&gt;add()&lt;/code&gt; / &lt;code&gt;remove()&lt;/code&gt; methods for direct children.&lt;/li&gt;
&lt;li&gt;Implementations (&lt;code&gt;FileImpl&lt;/code&gt;, &lt;code&gt;FolderImpl&lt;/code&gt;) respect these roles with &lt;code&gt;contracts&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;worker_agent&lt;/code&gt; launcher builds the tree and calls &lt;code&gt;done()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result: we can read the &lt;strong&gt;roles and hierarchy&lt;/strong&gt; directly in the contracts — no ambiguity.&lt;/p&gt;




&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;version_inh&lt;/span&gt; &lt;span class="nc"&gt;FileSystemComponent&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;done&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;version_inh&lt;/span&gt; &lt;span class="n"&gt;abstraction&lt;/span&gt; &lt;span class="nc"&gt;File&lt;/span&gt; &lt;span class="n"&gt;nature&lt;/span&gt; &lt;span class="nc"&gt;FileSystemComponent&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt;  &lt;span class="n"&gt;version_inh&lt;/span&gt; &lt;span class="n"&gt;abstraction&lt;/span&gt;  &lt;span class="nc"&gt;Folder&lt;/span&gt; &lt;span class="n"&gt;nature&lt;/span&gt; &lt;span class="nc"&gt;FileSystemComponent&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;with_compat&lt;/span&gt; &lt;span class="nc"&gt;FileSystemComponent&lt;/span&gt; &lt;span class="n"&gt;component&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;with_compat&lt;/span&gt; &lt;span class="nc"&gt;FileSystemComponent&lt;/span&gt; &lt;span class="n"&gt;component&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Leaf
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Forced_pract_code&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;abstraction&lt;/span&gt; &lt;span class="nc"&gt;FileImpl&lt;/span&gt; &lt;span class="n"&gt;contracts&lt;/span&gt; &lt;span class="nc"&gt;File&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;FileImpl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;done&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Leaf File: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Composite
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Forced_pract_code&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;abstraction&lt;/span&gt; &lt;span class="nc"&gt;FolderImpl&lt;/span&gt; &lt;span class="n"&gt;contracts&lt;/span&gt; &lt;span class="nc"&gt;Folder&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;FileSystemComponent&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;children&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;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;FolderImpl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;with_compat&lt;/span&gt; &lt;span class="nc"&gt;FileSystemComponent&lt;/span&gt; &lt;span class="n"&gt;component&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;component&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;with_compat&lt;/span&gt; &lt;span class="nc"&gt;FileSystemComponent&lt;/span&gt; &lt;span class="n"&gt;component&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;remove&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;component&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;done&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Composite Folder: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;with_compat&lt;/span&gt; &lt;span class="nc"&gt;FileSystemComponent&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Launcher
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;worker_agent&lt;/span&gt; &lt;span class="nc"&gt;CompositePatternLauncher&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;FolderImpl&lt;/span&gt; &lt;span class="n"&gt;root&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;FolderImpl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Root"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;FolderImpl&lt;/span&gt; &lt;span class="n"&gt;documents&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;FolderImpl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Documents"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;FileImpl&lt;/span&gt; &lt;span class="n"&gt;file1&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;FileImpl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"File1.txt"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Output
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Composite Folder: Root
Composite Folder: Documents
Leaf File: File1.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Why Clprolf Makes Composite Clear
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Contracts show everything&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;File&lt;/code&gt; is a Leaf (no extra methods).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Folder&lt;/code&gt; is a Composite (can add/remove children).&lt;/li&gt;
&lt;li&gt;Both are &lt;code&gt;FileSystemComponent&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Each composite is simple&lt;/strong&gt;&lt;br&gt;
A &lt;code&gt;Folder&lt;/code&gt; only knows its &lt;strong&gt;direct children&lt;/strong&gt;.&lt;br&gt;
The global hierarchy comes from recursion, not from extra complexity.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Roles prevent ambiguity&lt;/strong&gt;&lt;br&gt;
Implementations respect exactly the declared role — no mix-up between leaf and composite.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In OOP, the Composite is often taught as a trick with interfaces and polymorphism.&lt;br&gt;
In &lt;strong&gt;Clprolf&lt;/strong&gt;, it becomes obvious:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;Leaf&lt;/strong&gt; is an &lt;code&gt;abstraction&lt;/code&gt; without children.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Composite&lt;/strong&gt; is an &lt;code&gt;abstraction&lt;/code&gt; with children of type &lt;code&gt;FileSystemComponent&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 The pattern is no longer something to memorize, but something you can &lt;strong&gt;read directly in the contracts&lt;/strong&gt;.&lt;/p&gt;




</description>
      <category>programming</category>
      <category>design</category>
      <category>softwaredevelopment</category>
      <category>coding</category>
    </item>
  </channel>
</rss>
