<?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.us-east-2.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>Clprolf — Official Documentation</title>
      <dc:creator>Charles Koffler</dc:creator>
      <pubDate>Mon, 25 May 2026 16:47:03 +0000</pubDate>
      <link>https://dev.to/charles_koffler_bcabc582b/clprolf-minimalist-mf8</link>
      <guid>https://dev.to/charles_koffler_bcabc582b/clprolf-minimalist-mf8</guid>
      <description>&lt;h1&gt;
  
  
  Clprolf Framework — Official Documentation
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Target Uses and Prerequisites
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Clprolf&lt;/strong&gt; ("Clear PROgramming Language and Framework") is an standalone, lightweight architectural framework for Java or C# .NET.&lt;/p&gt;

&lt;p&gt;It is a specialized framework designed for the following scenarios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A pedagogical framework designed to teach Object-Oriented Programming (OOP), interfaces, and even immutability.&lt;/li&gt;
&lt;li&gt;scientific applications&lt;/li&gt;
&lt;li&gt;simulations&lt;/li&gt;
&lt;li&gt;Enterprise applications looking to adopt Clprolf alongside standard architectures&lt;/li&gt;
&lt;li&gt;highly complex applications with a large number of classes or interfaces&lt;/li&gt;
&lt;li&gt;major refactoring required on a large existing application&lt;/li&gt;
&lt;li&gt;or simply for those who enjoy this style of programming guided by an architectural checker for classes and interfaces.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It requires a basic knowledge of OOP and object-oriented design principles. The framework does not claim to be indispensable, and naturally, alternative solutions exist. The resulting code can easily revert to pure Java or C# simply by removing or ignoring the annotations.&lt;/p&gt;

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

&lt;p&gt;Its goal is to make certain object-oriented programming best practices explicit, without introducing heavy architecture or a steep learning curve.&lt;br&gt;
Thus, the framework helps adhere to the well-known SOLID principles.&lt;/p&gt;

&lt;p&gt;Clprolf is based on a simple idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A class should clearly express its primary role.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The framework helps to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;separate business logic from technical code,&lt;/li&gt;
&lt;li&gt;limit architectural drift,&lt;/li&gt;
&lt;li&gt;make inheritance more coherent,&lt;/li&gt;
&lt;li&gt;improve system readability.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  In Java (ArchUnit)
&lt;/h3&gt;

&lt;p&gt;In the Java ecosystem, components are marked using annotations:&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="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.clprolf.framework.ClAgent&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@ClAgent&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;CarImpl&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Agent logic...&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  In C# (ArchUnitNET)
&lt;/h3&gt;

&lt;p&gt;In the .NET ecosystem, the strict equivalent uses &lt;strong&gt;C# Attributes&lt;/strong&gt; enclosed in brackets &lt;code&gt;[...]&lt;/code&gt; placed directly above the class:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Clprolf.ArchUnitNet.Attributes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;MyApp.Agents&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ClAgent&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ICar&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Agent logic...&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  💡 Note for Framework Users (.NET vs Java)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Syntax:&lt;/strong&gt; Java's &lt;code&gt;@Annotation&lt;/code&gt; becomes &lt;code&gt;[Attribute]&lt;/code&gt; in C#.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  I) The Two Fundamental Principles
&lt;/h1&gt;

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




&lt;h2&gt;
  
  
  1. A class is either business/conceptual or technical
&lt;/h2&gt;

&lt;p&gt;Every class belongs to one of the following two worlds:&lt;/p&gt;

&lt;h3&gt;
  
  
  Business / Domain World
&lt;/h3&gt;

&lt;p&gt;The class represents a business or conceptual responsibility.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;order management,&lt;/li&gt;
&lt;li&gt;business logic,&lt;/li&gt;
&lt;li&gt;simulation,&lt;/li&gt;
&lt;li&gt;functional orchestration,&lt;/li&gt;
&lt;li&gt;but also system-oriented agents.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These classes are declared with:&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;@ClAgent&lt;/span&gt;

&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 java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@ClSystem&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Technical World
&lt;/h3&gt;

&lt;p&gt;The class performs technical work executed by the system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;database access (via system agents),&lt;/li&gt;
&lt;li&gt;network (often using low-level agents),&lt;/li&gt;
&lt;li&gt;usage of system abstractions such as files,&lt;/li&gt;
&lt;li&gt;UI / rendering,&lt;/li&gt;
&lt;li&gt;infrastructure,&lt;/li&gt;
&lt;li&gt;no conceptual domain, just the system executing technical agents or bootstrapping an application,&lt;/li&gt;
&lt;li&gt;typically a system technical service associated with an agent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These classes are declared with:&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;@ClWorker&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Inheritance must preserve the domain
&lt;/h2&gt;

&lt;p&gt;A class must only inherit from a class belonging to the same conceptual domain.&lt;/p&gt;

&lt;p&gt;Otherwise:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;composition should be used instead.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This principle prevents incoherent hierarchies and mixed responsibilities.&lt;/p&gt;




&lt;h1&gt;
  
  
  II) Progressive Adoption, Customization and Automatic Detection
&lt;/h1&gt;

&lt;p&gt;The framework offers total flexibility in both its deployment strategy and its terminology.&lt;/p&gt;




&lt;h2&gt;
  
  
  II.1) Step-by-Step Adoption
&lt;/h2&gt;

&lt;p&gt;Integrating Clprolf into a project can be done incrementally. There is no need to enforce every rule from day one.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Step 1: Classes First.&lt;/strong&gt; You can focus exclusively on the core separation between &lt;code&gt;@ClAgent&lt;/code&gt; (or &lt;code&gt;ClSystem&lt;/code&gt;) and &lt;code&gt;@ClWorker&lt;/code&gt;. This allows the team to master the class splitting without initial friction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step 2: Interfaces Later (Optional).&lt;/strong&gt; The interface model (&lt;code&gt;ClFamily&lt;/code&gt;, &lt;code&gt;ClTrait&lt;/code&gt;) can be introduced at a later stage.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;If you find the Clprolf interface system too disruptive compared to your habits or traditional OOP practices, you can choose to ignore it entirely. The framework remains fully functional and highly effective just for your classes.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  II.2) Tailoring the Terminology (Built-in Aliases)
&lt;/h2&gt;

&lt;p&gt;Does Clprolf's default vocabulary not quite match your team's nomenclature?&lt;br&gt;
The framework provides &lt;strong&gt;built-in equivalent annotations/attributes&lt;/strong&gt; to naturally fit your team's culture.&lt;br&gt;
The ArchUnit/ArchUnitNET checker treats these aliases as completely equivalent to the reference keywords during automated validations:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Default Role&lt;/th&gt;
&lt;th&gt;Conceptual Alternative&lt;/th&gt;
&lt;th&gt;DDD Alternative&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;@ClAgent&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@ClConcept&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@ClDomain&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;@ClWorker&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@ClMechanism&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@ClInfrastructure&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;@ClSystem&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@ClBridge&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@ClLowLevel&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Notes: You are free to use the aliases that resonate most with your architecture, or even extend the checker to register your team's custom annotations.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;The checker treats all aliases as strictly equivalent. You can use whichever vocabulary you prefer on a project without risking incompatibility, as the checker guarantees the exact same underlying architectural consistency.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  II.3) Automatic Detection and Seamless Integration
&lt;/h2&gt;

&lt;p&gt;To ease adoption and prevent visual clutter in the code, the Clprolf ArchUnit checker centralizes role qualification through its predicate methods (&lt;code&gt;isAgent()&lt;/code&gt;, &lt;code&gt;isWorker()&lt;/code&gt;, &lt;code&gt;isSystem()&lt;/code&gt;).&lt;br&gt;
This allows the framework to automatically map native annotations and attributes from your standard ecosystems (such as Spring or ASP.NET Core) to Clprolf roles. For example, a &lt;code&gt;@RestController&lt;/code&gt; or an &lt;code&gt;[ApiController]&lt;/code&gt; will be instantly recognized as a &lt;code&gt;@ClSystem&lt;/code&gt;, without requiring any additional Clprolf annotations on your classes.&lt;br&gt;
This approach delivers the full enforcement power of the framework in a completely invisible and progressive manner, without affecting the readability of your day-to-day code. As a result, your existing applications can benefit from the Clprolf checker's controls straight away, without adding a single annotation to your existing codebase.&lt;/p&gt;
&lt;h1&gt;
  
  
  III) Hexagonal, DDD &amp;amp; Clprolf Alignment
&lt;/h1&gt;

&lt;p&gt;Clprolf formalizes the main principles of &lt;strong&gt;Hexagonal Architecture&lt;/strong&gt; and &lt;strong&gt;Domain-Driven Design (DDD)&lt;/strong&gt; through explicit OOP constraints and annotations.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. The Equivalence Matrix
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hexa / DDD / Clean Concept&lt;/th&gt;
&lt;th&gt;Role &amp;amp; Responsibility&lt;/th&gt;
&lt;th&gt;Clprolf Role&lt;/th&gt;
&lt;th&gt;Typing &amp;amp; Annotations&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Aggregate / Entity&lt;/strong&gt; &lt;em&gt;(DDD)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;Business core, state, invariants, and pure domain rules.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;Agent&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@ClAgent&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Domain Service&lt;/strong&gt; &lt;em&gt;(DDD)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;Orchestration of business rules combining multiple aggregates.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;Agent&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@ClAgent&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Use Case&lt;/strong&gt; &lt;em&gt;(Clean)&lt;/em&gt; / &lt;strong&gt;Application Service&lt;/strong&gt; &lt;em&gt;(DDD)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;Functional scenario expressing business intent &lt;em&gt;(e.g., &lt;code&gt;RegisterCustomer&lt;/code&gt;)&lt;/em&gt;.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;Agent&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@ClAgent&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Primary Ports&lt;/strong&gt; &lt;em&gt;(Driving)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;Interfaces exposed by the domain to be driven from the outside.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;Family&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@ClAgent @ClFamily&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Secondary Ports&lt;/strong&gt; &lt;em&gt;(Driven)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;Interfaces required by the domain to communicate with the outside.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;Family&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@ClWorker @ClFamily&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Inbound Adapters&lt;/strong&gt; &lt;em&gt;(Hexa)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;System entry points &lt;em&gt;(REST Controllers, CLI Handlers, Consumers)&lt;/em&gt;.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;System&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@ClSystem&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Outbound Adapters&lt;/strong&gt; &lt;em&gt;(Hexa)&lt;/em&gt; / &lt;strong&gt;Infrastructure Service&lt;/strong&gt; &lt;em&gt;(DDD)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;Technical executors &lt;em&gt;(Repository implementations, API clients, Senders)&lt;/em&gt;.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;Worker&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@ClWorker&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Value Objects / DTOs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Immutable, behaviorless data objects.&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Pure Data&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Unannotated&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  2. Canonical Execution Flow
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Note: A flow is called **canonical&lt;/em&gt;* because it represents the official, standard reference execution model.*&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; ┌──────────────────────────────────────────────────────────────────┐
 │ INBOUND ADAPTERS (Driving)                                       │
 │                                                                  │
 │   ┌─────────────┐                                                │
 │   │  @ClSystem  │  (REST Controller, CLI, Kafka Consumer)          │
 │   └──────┬──────┘                                                │
 └──────────┼───────────────────────────────────────────────────────┘
            │
            │ Calls via Primary Port (@ClAgent @ClFamily)
            ▼
 ┌──────────────────────────────────────────────────────────────────┐
 │ DOMAIN CORE / USE CASES &amp;amp; AGGREGATES                             │
 │                                                                  │
 │   ┌─────────────┐  Orchestrates &amp;amp;  ┌─────────────┐               │
 │   │  @ClAgent   │ ───────────────&amp;gt; │  @ClAgent   │               │
 │   │ (Use Case)  │    manipulates   │ (Aggregate) │               │
 │   └──────┬──────┘                  └─────────────┘               │
 └──────────┼───────────────────────────────────────────────────────┘
            │
            │ Calls via Secondary Port (@ClWorker @ClFamily)
            ▼
 ┌──────────────────────────────────────────────────────────────────┐
 │ OUTBOUND ADAPTERS (Driven)                                       │
 │                                                                  │
 │   ┌─────────────┐                                                │
 │   │  @ClWorker  │  (JpaRepository, StripeClient, EmailSender)    │
 │   └─────────────┘                                                │
 └──────────────────────────────────────────────────────────────────┘

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. The 3 Golden Rules of Clprolf
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Dependencies point inward:&lt;/strong&gt; &lt;code&gt;@ClSystem&lt;/code&gt; depends on &lt;code&gt;@ClAgent&lt;/code&gt;. &lt;code&gt;@ClAgent&lt;/code&gt; NEVER depends directly on &lt;code&gt;@ClWorker&lt;/code&gt;, but solely on its contract &lt;code&gt;@ClWorker @ClFamily&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The entire Domain is &lt;code&gt;@ClAgent&lt;/code&gt;:&lt;/strong&gt; Whether it is the Use Case (the scenario orchestrator) or the Aggregate (the core state and business rules), both are &lt;strong&gt;&lt;code&gt;@ClAgent&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total domain isolation:&lt;/strong&gt; Agents handle pure business logic, completely decoupled from infrastructure frameworks (JPA, HTTP, Messaging).&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  IV) Class Types
&lt;/h1&gt;

&lt;p&gt;Clprolf contains only four class types. Classes without methods (entities, DTOs, etc.) are not annotated.&lt;/p&gt;




&lt;h2&gt;
  
  
  IV.1) &lt;code&gt;ClAgent&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Represents a business or conceptual class.&lt;/p&gt;

&lt;p&gt;An &lt;code&gt;agent&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;contains business or conceptual logic,&lt;/li&gt;
&lt;li&gt;orchestrates processes,&lt;/li&gt;
&lt;li&gt;makes decisions,&lt;/li&gt;
&lt;li&gt;avoids heavy technical code, which is often delegated to an associated worker,&lt;/li&gt;
&lt;li&gt;can be system-oriented like Connection or Socket (in which case &lt;code&gt;ClSystem&lt;/code&gt; is used).&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@ClAgent&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;OrderProcessor&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;OrderRepository&lt;/span&gt; &lt;span class="n"&gt;repository&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;process&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;total&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;Error&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&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;order&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;
  
  
  IV.2) &lt;code&gt;ClWorker&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Represents a system service.&lt;/p&gt;

&lt;p&gt;A worker class is primarily intended to support agent classes rather than be organized around a class domain.&lt;/p&gt;

&lt;p&gt;Workers provide technical and infrastructure services. They may coordinate or use low-level agents (system agents) such as &lt;code&gt;File&lt;/code&gt;, &lt;code&gt;Connection&lt;/code&gt;, &lt;code&gt;Random&lt;/code&gt;, &lt;code&gt;Logger&lt;/code&gt;, or &lt;code&gt;Parser&lt;/code&gt;, but unlike those classes, a worker is not organized around a class domain of its own.&lt;/p&gt;

&lt;p&gt;Instead, it exists to support other components through technical mechanisms, infrastructure access, application startup, operating-system interaction, or similar responsibilities.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;worker&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is a system service;&lt;/li&gt;
&lt;li&gt;Provides technical support;&lt;/li&gt;
&lt;li&gt;Manages infrastructure and execution mechanisms;&lt;/li&gt;
&lt;li&gt;Contains technical code;&lt;/li&gt;
&lt;li&gt;Uses system abstractions, but is not one itself;&lt;/li&gt;
&lt;li&gt;Is often there to assist an agent class (including system agents) with rendering/display, direct database access, etc.;&lt;/li&gt;
&lt;li&gt;Allows for the separation of domain/functional code from purely technical code.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  IV.3) The &lt;code&gt;ClSystem&lt;/code&gt; Role
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;@ClSystem&lt;/code&gt; annotation (or &lt;code&gt;[ClSystem]&lt;/code&gt; attribute in C#) must be used for system-oriented agents.&lt;br&gt;
Inheritance cannot be mixed between standard agents and system-oriented agents. They are thus treated by the checker as an independent role.&lt;br&gt;
System abstractions (such as &lt;code&gt;File&lt;/code&gt;) are therefore annotated with &lt;code&gt;@ClSystem&lt;/code&gt; instead of &lt;code&gt;@ClAgent&lt;/code&gt;.&lt;br&gt;
Note that classes imposed by third-party frameworks, such as Controllers, Routing, or Middlewares (Filters/Interceptors in Java), are treated as &lt;code&gt;ClSystem&lt;/code&gt; classes.&lt;br&gt;
&lt;code&gt;ClSystem&lt;/code&gt; provides a more technical perspective while preserving the concept of domain.&lt;/p&gt;
&lt;h3&gt;
  
  
  Clarifications
&lt;/h3&gt;

&lt;p&gt;For example, a connection is represented in Clprolf as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;code&gt;ClSystem&lt;/code&gt; system abstraction,&lt;/li&gt;
&lt;li&gt;its domain being the connection domain.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This results in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;code&gt;ClSystem&lt;/code&gt; to represent the connection,&lt;/li&gt;
&lt;li&gt;purely technical code delegated to one or more &lt;code&gt;worker&lt;/code&gt; classes,&lt;/li&gt;
&lt;li&gt;the ability to change the technical implementation if needed without modifying the conceptual code (see the Java &lt;code&gt;File&lt;/code&gt; example).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Java Example Illustrating &lt;code&gt;ClSystem&lt;/code&gt;: &lt;code&gt;java.io.File&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The recent OpenJDK implementation of &lt;code&gt;java.io.File&lt;/code&gt; reveals a class of roughly 2,000 lines. The class delegates all purely technical, non-domain work to a field serving as a worker equivalent (&lt;code&gt;FileSystem&lt;/code&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;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;FileSystem&lt;/span&gt; &lt;span class="no"&gt;FS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;DefaultFileSystem&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getFileSystem&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;delete&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;isInvalid&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="kc"&gt;false&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="no"&gt;FS&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;delete&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;/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;CLPROLF CONCEPT                    JAVA SOURCE CODE (OpenJDK)
┌──────────────────────────┐            ┌──────────────────────────┐
│         @ClSystem        │            │       java.io.File       │
│    (System Abstraction)  │            │                          │
│ Represents the concept   │            │ Manages the file         │
│ of a file and its path.  │            │ abstraction and status.  │
│ Conceptual methods       │            │ Conceptual methods       │
└────────────┬─────────────┘            └────────────┬─────────────┘
             │                                       │
             │ delegates to                          │ calls
             ▼                                       ▼
┌──────────────────────────┐            ┌──────────────────────────┐
│         @ClWorker        │            │    java.io.FileSystem    │
│    (Low-Level Worker)    │            │       (FS variable)      │
│ Performs OS-specific     │            │ OS-dependent impl.,      │
│ access and validation    │            │ WinNT/UnixFileSystem.    │
└──────────────────────────┘            └──────────────────────────┘

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: &lt;code&gt;java.io.UnixFileSystem&lt;/code&gt; and &lt;code&gt;WinNTFileSystem&lt;/code&gt; contain many &lt;code&gt;native&lt;/code&gt; methods.&lt;/p&gt;




&lt;h2&gt;
  
  
  IV.4) &lt;code&gt;ClDraft&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;An object without a defined role. Normally, it shouldn't be essential.&lt;/p&gt;

&lt;p&gt;Used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;during prototyping,&lt;/li&gt;
&lt;li&gt;during refactoring,&lt;/li&gt;
&lt;li&gt;when the role is not yet clear.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@ClDraft&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;TemporaryManager&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;ClDraft&lt;/code&gt; enables a flexible approach similar to classical OOP.&lt;/p&gt;




&lt;h2&gt;
  
  
  IV.5) Primary Domain and Technical Code
&lt;/h2&gt;

&lt;p&gt;Clprolf encourages moving as much technical code as possible from &lt;code&gt;agent&lt;/code&gt; classes into &lt;code&gt;worker&lt;/code&gt; classes.&lt;/p&gt;

&lt;p&gt;However, an &lt;code&gt;agent&lt;/code&gt; may contain a reasonable amount of technical code when doing so improves simplicity or readability.&lt;/p&gt;

&lt;p&gt;An &lt;code&gt;agent&lt;/code&gt; always has a primary domain representing its central responsibility.&lt;/p&gt;

&lt;p&gt;Secondary responsibilities may exist as long as they remain consistent with that primary domain.&lt;/p&gt;




&lt;h1&gt;
  
  
  V) Inheritance
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Class inheritance can be forced using &lt;code&gt;@ClBypass&lt;/code&gt; above the class, but this should be rare.&lt;/p&gt;
&lt;/blockquote&gt;




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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@ClAgent&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="o"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@ClAgent&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;Dog&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Animal&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;
  
  
  Discouraged Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@ClWorker&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;ClientRepository&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@ClAgent&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;Dog&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;ClientRepository&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 domains are incompatible.&lt;/p&gt;

&lt;p&gt;Composition should be used instead.&lt;/p&gt;

&lt;p&gt;Inheritance can be forced using &lt;code&gt;@ClBypass&lt;/code&gt; above the class.&lt;/p&gt;




&lt;h1&gt;
  
  
  VI) Flexibility
&lt;/h1&gt;

&lt;p&gt;Clprolf is flexible.&lt;/p&gt;

&lt;p&gt;The developer therefore keeps their freedom:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mixing responsibilities when necessary,&lt;/li&gt;
&lt;li&gt;progressive migration,&lt;/li&gt;
&lt;li&gt;compatibility with existing code,&lt;/li&gt;
&lt;li&gt;while always maintaining a primary domain.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The framework mainly acts as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;a structural guide.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  VII) Interfaces
&lt;/h1&gt;

&lt;p&gt;In Clprolf, interfaces are viewed as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;abstract forms of inheritance.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They therefore participate in the structural continuity of the system.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ClFamily = primary family interface
ClTrait  = trait, shared capability between families
ClFree = unrestricted interface
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Clprolf, interfaces are not viewed as simple technical contracts.&lt;/p&gt;

&lt;p&gt;Both &lt;code&gt;extends&lt;/code&gt; and &lt;code&gt;implements&lt;/code&gt; relationships are considered genuine conceptual inheritance relationships.&lt;/p&gt;




&lt;h2&gt;
  
  
  VII.1) &lt;code&gt;ClFamily&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;An interface representing an abstract family.&lt;/p&gt;

&lt;p&gt;Used for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;polymorphism,&lt;/li&gt;
&lt;li&gt;decoupling,&lt;/li&gt;
&lt;li&gt;implementation variants.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Family interfaces also have a target role:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ClAgent&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;or &lt;code&gt;ClWorker&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&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="nd"&gt;@ClAgent&lt;/span&gt;
&lt;span class="nd"&gt;@ClFamily&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;Animal&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;eat&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;quantity&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 hierarchy of &lt;code&gt;ClFamily&lt;/code&gt; interfaces naturally reflects the hierarchy of concrete classes.&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;@ClAgent&lt;/span&gt;
&lt;span class="nd"&gt;@ClFamily&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;Horse&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Animal&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;jump&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;height&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;Which may lead to:&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;@ClAgent&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;AnimalImpl&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Animal&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@ClAgent&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;HorseImpl&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;AnimalImpl&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Horse&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;
  
  
  VII.2) &lt;code&gt;ClTrait&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;An interface representing a shared capability across multiple &lt;code&gt;ClFamily&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Traits also use a target role:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ClAgent&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ClWorker&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note: a &lt;code&gt;@ClTrait&lt;/code&gt; may be annotated with both &lt;code&gt;@ClAgent&lt;/code&gt; and &lt;code&gt;@ClWorker&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This exception is reserved for genuinely cross-cutting traits that can be used by both agents and workers.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Business 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;@ClAgent&lt;/span&gt;
&lt;span class="nd"&gt;@ClTrait&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;Payable&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;pay&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;
  
  
  Technical 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;@ClWorker&lt;/span&gt;
&lt;span class="nd"&gt;@ClTrait&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;Persistable&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;save&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;
  
  
  VII.3) Illustration of the Interface Family / Implementation Parallel
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ABSTRACT WORLD / INTERFACES]          │    [CONCRETE WORLD / CLASSES]
                                       │
       @ClAgent @ClFamily              │        @ClAgent
        interface Animal               │       class AnimalImpl
               ▲                       │               ▲
               │ (extends)             │               │ (extends)
               │                       │               │
       @ClAgent @ClFamily              │        @ClAgent
         interface Horse               │       class HorseImpl
               ▲                       │               ▼ (implements)
               │                       │       👉 implements Horse
               └───────────────────────┼───────  (and extends AnimalImpl)
                (Structural Inheritance)│
                                       │
 ──────────────────────────────────────┴─────────────────────────────────
  👉 THE TRAIT (Cross-cutting):

       @ClAgent @ClTrait               │
        interface Jumpable             │
               ▲                       │
               │ (inherited by Family) │
               │                       │
     Horse extends Jumpable            │
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  VII.4) &lt;code&gt;ClFree&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;A generic interface without a specific role. It shouldn't be necessary.&lt;/p&gt;

&lt;p&gt;Allows flexibility.&lt;/p&gt;




&lt;h3&gt;
  
  
  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;@ClFree&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;ExternalApi&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;
  
  
  VII.5) Using Interfaces
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;In Clprolf, &lt;code&gt;Family&lt;/code&gt; interfaces closely resemble pure abstract classes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They are intended to be implemented by one or more future Clprolf classes. Therefore, they have a target role (&lt;code&gt;agent&lt;/code&gt; or &lt;code&gt;worker&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;A class can only implement a single main &lt;code&gt;Family&lt;/code&gt; at a time, and the class role must match the target role of the interface. Clprolf thus uses single implementation for interfaces, in the same way that Java uses single inheritance for classes. Indeed, a &lt;code&gt;Family&lt;/code&gt; is always the structural reflection of its implementation. This notably allows for systematic loose coupling.&lt;br&gt;
However, multiple implementation is not removed, but rather shifted to the &lt;code&gt;Family&lt;/code&gt; implemented by the class.&lt;br&gt;
&lt;strong&gt;This might seem restrictive and unconventional, but it only applies in strict mode, which is not the default. This prevents multiple implementations of the same family from repeating a multi-contract declaration, and helps developers quickly understand what the classes actually implement.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Trait&lt;/code&gt; interfaces express a common functionality across multiple &lt;code&gt;Family&lt;/code&gt; interfaces.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A &lt;code&gt;Trait&lt;/code&gt; therefore represents a cross-cutting trait shared among several families.&lt;/p&gt;

&lt;p&gt;Normally, a &lt;code&gt;Trait&lt;/code&gt; can only be inherited by a &lt;code&gt;Family&lt;/code&gt; interface, and not directly implemented by a class. This prevents a trait from being separated from its family interface, and clarifies class implementations (especially when a family has multiple implementations).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;However, this only applies in strict mode, which is not the default.&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;Concrete class
    ↓ implements
ClFamily
    ↓ inherits from
ClTrait

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: A &lt;code&gt;Family&lt;/code&gt; interface can inherit from multiple &lt;code&gt;Family&lt;/code&gt; or &lt;code&gt;Trait&lt;/code&gt; interfaces.&lt;br&gt;
A &lt;code&gt;Trait&lt;/code&gt; interface can only inherit from other &lt;code&gt;Traits&lt;/code&gt;, because a trait remains a trait.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Interface inheritance can still be forced using &lt;code&gt;@ClInterfaceBypass&lt;/code&gt; above the interface (or &lt;code&gt;@ClBypass&lt;/code&gt; to force inheritance between different target roles). However, these bypasses should be rare.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  VI.5.2 Strict mode for interfaces with flexibility
&lt;/h3&gt;

&lt;p&gt;It is possible to use &lt;code&gt;ClFree&lt;/code&gt; to enforce strict rules only on selected interfaces, while applying &lt;code&gt;ClFamily&lt;/code&gt; when greater rigor is required in specific cases. In this way, even in strict mode, the framework remains open and flexible.&lt;/p&gt;


&lt;h2&gt;
  
  
  VII.6) Advantages of Systematic Loose Coupling via the Mirror Interface
&lt;/h2&gt;

&lt;p&gt;In strict mode, restricting a class to implementing a single ClFamily (and delegating ClTrait interfaces to it) is not merely an aesthetic constraint. It is the very mechanism that guarantees systematic loose coupling.&lt;/p&gt;

&lt;p&gt;Instead of a class implementing multiple scattered contracts, the ClFamily acts as the official and complete "mirror contract" of the component. Thus, when component A requires component B, it is naturally driven to depend on B's ClFamily, rather than on its concrete implementation. Dependency inversion is no longer just a recommendation; it mechanically arises from the structure of the code.&lt;/p&gt;

&lt;p&gt;The gain lies in maintaining a single hierarchy rather than duplicating class and interface hierarchies. Naturally, this strict mode is optional and should be applied according to your team's preferences and specific project needs.&lt;/p&gt;
&lt;h3&gt;
  
  
  Real-world example of &lt;code&gt;ClFamily&lt;/code&gt; and &lt;code&gt;ClTrait&lt;/code&gt; interfaces
&lt;/h3&gt;

&lt;p&gt;Let’s take a look at this real-world example, which demonstrates a design applicable to the strict mode of the Clprolf Framework:&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="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.tngtech.archunit.lang&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@ClAgent&lt;/span&gt; &lt;span class="nd"&gt;@ClFamily&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;ArchRule&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;CanBeEvaluated&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;CanOverrideDescription&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ArchRule&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="c1"&gt;//(…)&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.tngtech.archunit.library&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;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Architectures&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="c1"&gt;//(…)&lt;/span&gt;
&lt;span class="nd"&gt;@ClAgent&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LayeredArchitecture&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;ArchRule&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="c1"&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;blockquote&gt;
&lt;p&gt;In this example, &lt;code&gt;CanBeEvaluated&lt;/code&gt; and &lt;code&gt;CanOverrideDescription&lt;/code&gt; act as &lt;code&gt;@ClTrait&lt;/code&gt;s, while &lt;code&gt;ArchRule&lt;/code&gt; formalizes the &lt;code&gt;@ClFamily&lt;/code&gt;. Notice that the &lt;code&gt;LayeredArchitecture&lt;/code&gt; class only implements the family, which in turn inherits the traits. The class does not directly implement &lt;code&gt;CanBeEvaluated&lt;/code&gt; and &lt;code&gt;CanOverrideDescription&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  VII.7) Note on Clprolf Interfaces and the Interface Segregation Principle (ISP)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Classic &lt;em&gt;Fat Interface&lt;/em&gt; Problem
&lt;/h3&gt;

&lt;p&gt;Without strict separation, software design often falls into the trap of creating a single monolithic interface containing all possible behaviors:&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="c1"&gt;// Anti-pattern: Fat Interface violating ISP&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;Machine&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;print&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Document&lt;/span&gt; &lt;span class="n"&gt;doc&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;scan&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Document&lt;/span&gt; &lt;span class="n"&gt;doc&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;fax&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Document&lt;/span&gt; &lt;span class="n"&gt;doc&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 this scenario, a legacy printer (&lt;code&gt;OldPrinterImpl&lt;/code&gt;) that can only print would still be forced to implement &lt;code&gt;scan()&lt;/code&gt; and &lt;code&gt;fax()&lt;/code&gt;, often throwing an &lt;code&gt;UnsupportedOperationException&lt;/code&gt;, directly violating the ISP.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Clprolf Approach
&lt;/h3&gt;

&lt;p&gt;Clprolf naturally adheres to the ISP and prevents "fat interfaces". Since a &lt;code&gt;ClFamily&lt;/code&gt; interface acts as the mirror of its implementation, it cannot impose methods that do not belong to that implementation.&lt;br&gt;
Consequently, code factorization into multiple &lt;code&gt;ClFamily&lt;/code&gt; interfaces and &lt;code&gt;ClTrait&lt;/code&gt; components happens organically. This maintains the underlying architectural relationship (here between &lt;code&gt;ModernPrinter&lt;/code&gt; and &lt;code&gt;OldPrinter&lt;/code&gt;) while avoiding the duplication of shared traits.&lt;/p&gt;

&lt;p&gt;As a result, the codebase gains significantly in maintainability, scalability, and readability.&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;@ClAgent&lt;/span&gt;
&lt;span class="nd"&gt;@ClTrait&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;Scanner&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;scan&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Document&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@ClAgent&lt;/span&gt;
&lt;span class="nd"&gt;@ClTrait&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;Fax&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;fax&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Document&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@ClAgent&lt;/span&gt;
&lt;span class="nd"&gt;@ClTrait&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;Printer&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;print&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Document&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@ClAgent&lt;/span&gt;
&lt;span class="nd"&gt;@ClFamily&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;OldPrinter&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Printer&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@ClAgent&lt;/span&gt;
&lt;span class="nd"&gt;@ClFamily&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;ModernPrinter&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;OldPrinter&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Scanner&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Fax&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@ClAgent&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;OldPrinterImpl&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;OldPrinter&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// (...)&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@ClAgent&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;ModernPrinterImpl&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;ModernPrinter&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// (...)&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  VIII) Immutability
&lt;/h1&gt;

&lt;p&gt;It is also possible to make &lt;code&gt;Clprolf&lt;/code&gt; classes immutable, for instance by encapsulating the state within a record. Every method that modifies the state will return a new object, allowing further methods to be called in a fluent manner.&lt;br&gt;
Much like the &lt;code&gt;String&lt;/code&gt; class in Java/.NET, this approach guarantees native thread safety, eliminates side effects, and provides a fluent, expressive API. Naturally, the decision to use immutability should be evaluated on a case-by-case basis, considering trade-offs, performance costs, and preferences.&lt;br&gt;
Below is an example implementation in Java and C#, though other solutions exist depending on your language version and whether you need to interact with mutable APIs.&lt;br&gt;
These examples are not patterns, but merely illustrations of applying immutability within Clprolf.&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="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.ArrayList&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.util.List&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.util.Objects&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.util.stream.Stream&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@ClAgent&lt;/span&gt;
&lt;span class="nd"&gt;@ClFamily&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;Car&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;// Immutable state definition&lt;/span&gt;
    &lt;span class="c1"&gt;// Automatically public static inside an interface&lt;/span&gt;

    &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;State&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;make&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;mileage&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;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;
    &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Compact constructor enforcing domain invariants&lt;/span&gt;
        &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;State&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;Objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;requireNonNull&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Make cannot be null"&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;mileage&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;"Mileage cannot be negative"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;

            &lt;span class="c1"&gt;// Guarantees deep immutability via defensive copy and prevents null elements.&lt;/span&gt;
            &lt;span class="c1"&gt;// If 'options' is already an unmodifiable list (e.g., produced by Stream.toList() or List.of),&lt;/span&gt;
            &lt;span class="c1"&gt;// Java optimizes this call by returning the same instance without re-allocating memory.&lt;/span&gt;
            &lt;span class="n"&gt;options&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;copyOf&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&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="nc"&gt;State&lt;/span&gt; &lt;span class="nf"&gt;state&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// Business methods returning the contract abstraction&lt;/span&gt;
    &lt;span class="nc"&gt;Car&lt;/span&gt; &lt;span class="nf"&gt;drive&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;distance&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="nc"&gt;Car&lt;/span&gt; &lt;span class="nf"&gt;addOption&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;newOption&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;@ClAgent&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;CarImpl&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;// 🔒 Strictly final state reference&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;State&lt;/span&gt; &lt;span class="n"&gt;state&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;CarImpl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;State&lt;/span&gt; &lt;span class="n"&gt;state&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;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;requireNonNull&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"State cannot be null"&lt;/span&gt;&lt;span class="o"&gt;);&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="nc"&gt;State&lt;/span&gt; &lt;span class="nf"&gt;state&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="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Covariant return types: methods return 'CarImpl' instead of 'Car'&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;CarImpl&lt;/span&gt; &lt;span class="nf"&gt;drive&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;distance&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;distance&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;return&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;// No state change occurs&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;newState&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;State&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;make&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt;
                &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mileage&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;distance&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;options&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="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;CarImpl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newState&lt;/span&gt;&lt;span class="o"&gt;);&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="nc"&gt;CarImpl&lt;/span&gt; &lt;span class="nf"&gt;addOption&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;newOption&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;requireNonNull&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newOption&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"New option cannot be null"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// OPTION 1: Optimized Stream concatenation (Single allocation)&lt;/span&gt;
        &lt;span class="c1"&gt;// Stream.toList() (Java 16+) returns an unmodifiable list directly.&lt;/span&gt;
        &lt;span class="c1"&gt;// When passed to State's constructor, List.copyOf(options) recognizes &lt;/span&gt;
        &lt;span class="c1"&gt;// it as already unmodifiable and avoids a second copy.&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;updatedOptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Stream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;concat&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;options&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="nc"&gt;Stream&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="n"&gt;newOption&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
                                   &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toList&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="cm"&gt;/* 
        // OPTION 2: Alternative using a temporary mutable ArrayList
        // Simple and readable, but results in 2 list allocations in heap memory:
        // 1) The temporary ArrayList created here.
        // 2) The unmodifiable copy created inside State's constructor by List.copyOf().

        var updatedOptions = new ArrayList&amp;lt;&amp;gt;(state.options());
        updatedOptions.add(newOption);
        */&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;CarImpl&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;State&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;make&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mileage&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;updatedOptions&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="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="c1"&gt;// Using the specific type&lt;/span&gt;
        &lt;span class="nc"&gt;CarImpl&lt;/span&gt; &lt;span class="n"&gt;initialCar&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;CarImpl&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;Car&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;State&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Tesla"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10000&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="s"&gt;"Autopilot"&lt;/span&gt;&lt;span class="o"&gt;)));&lt;/span&gt;
        &lt;span class="nc"&gt;CarImpl&lt;/span&gt; &lt;span class="n"&gt;drivenCar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;initialCar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;drive&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Using the interface type&lt;/span&gt;
        &lt;span class="nc"&gt;Car&lt;/span&gt; &lt;span class="n"&gt;genericCar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;initialCar&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="nc"&gt;Car&lt;/span&gt; &lt;span class="n"&gt;updatedCar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genericCar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addOption&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Premium Audio"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Returns a Car&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;
  
  
  2) C-Sharp version
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Collections.Generic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Collections.Immutable&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ClAgent&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ClFamily&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;ICar&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;record&lt;/span&gt; &lt;span class="nc"&gt;State&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Make&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;init&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;Mileage&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;init&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Strongly-typed property using the concrete immutable type&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;ImmutableArray&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Options&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;init&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;State&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;mileage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;ArgumentNullException&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ThrowIfNull&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;ArgumentNullException&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ThrowIfNull&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mileage&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;ArgumentOutOfRangeException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;nameof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mileage&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s"&gt;"Mileage cannot be negative."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="n"&gt;Make&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;Mileage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mileage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="c1"&gt;// ToImmutableArray() handles automatically if options is already an ImmutableArray&lt;/span&gt;
            &lt;span class="n"&gt;Options&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToImmutableArray&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

            &lt;span class="c1"&gt;// PERFORMANCE NOTE:&lt;/span&gt;
            &lt;span class="c1"&gt;// If the collection contains a very large number of items and undergoes VERY frequent additions/modifications,&lt;/span&gt;
            &lt;span class="c1"&gt;// consider using ImmutableList&amp;lt;string&amp;gt; and ToImmutableList() to optimize memory reuse (AVL tree):&lt;/span&gt;
            &lt;span class="c1"&gt;// Options = options.ToImmutableList();&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;State&lt;/span&gt; &lt;span class="n"&gt;CarState&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Business methods returning the contract abstraction&lt;/span&gt;
    &lt;span class="n"&gt;ICar&lt;/span&gt; &lt;span class="nf"&gt;Drive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;distance&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;ICar&lt;/span&gt; &lt;span class="nf"&gt;AddOption&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;newOption&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ClAgent&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CarImpl&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ICar&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Strictly read-only state reference&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;ICar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;State&lt;/span&gt; &lt;span class="n"&gt;CarState&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;CarImpl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ICar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;State&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;CarState&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;CarImpl&lt;/span&gt; &lt;span class="nf"&gt;Drive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;distance&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;distance&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// No state change occurs&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// C# 'with' expression creates a copy of State updating only Mileage&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;newState&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CarState&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Mileage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CarState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Mileage&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;distance&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;CarImpl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newState&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;CarImpl&lt;/span&gt; &lt;span class="nf"&gt;AddOption&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;newOption&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Clean and direct syntax without casts or conversions.&lt;/span&gt;
        &lt;span class="c1"&gt;// Options.Add() returns a new ImmutableArray instance.&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;newState&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CarState&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Options&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CarState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newOption&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;CarImpl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newState&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Explicit interface implementation to satisfy the ICar contract in C#&lt;/span&gt;
    &lt;span class="n"&gt;ICar&lt;/span&gt; &lt;span class="n"&gt;ICar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Drive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;distance&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;Drive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;distance&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;ICar&lt;/span&gt; &lt;span class="n"&gt;ICar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddOption&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;newOption&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;AddOption&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newOption&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Using the specific type&lt;/span&gt;
        &lt;span class="n"&gt;CarImpl&lt;/span&gt; &lt;span class="n"&gt;initialCar&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ICar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;State&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Tesla"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"Autopilot"&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
        &lt;span class="n"&gt;CarImpl&lt;/span&gt; &lt;span class="n"&gt;drivenCar&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;initialCar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Drive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;150&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Using the interface type&lt;/span&gt;
        &lt;span class="n"&gt;ICar&lt;/span&gt; &lt;span class="n"&gt;genericCar&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;initialCar&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;ICar&lt;/span&gt; &lt;span class="n"&gt;updatedCar&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genericCar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddOption&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Premium Audio"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  IX) Overall Architecture
&lt;/h1&gt;

&lt;p&gt;Clprolf naturally encourages a simple architecture.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;agent
    ↓ delegates to
worker

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Agents&lt;/code&gt; contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;business rules,&lt;/li&gt;
&lt;li&gt;decisions,&lt;/li&gt;
&lt;li&gt;orchestration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;Workers&lt;/code&gt; handle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;technical execution,&lt;/li&gt;
&lt;li&gt;system access,&lt;/li&gt;
&lt;li&gt;machine-level operations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An agent (including system-oriented &lt;code&gt;ClSystem&lt;/code&gt;) delegates technical code to one or more workers. It may execute technical tasks, but only by invoking a worker method.&lt;br&gt;
The worker serves the agent.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌────────────────────────────────────────────────────┐
│                       AGENT                        │
│               conceptual behavior,                 │
│          domain / business responsibility          │
└─────────────────────────┬──────────────────────────┘
                          │
                          │ uses / delegates to
                          │
                          ▼
┌────────────────────────────────────────────────────┐
│                       WORKER                       │
│       system service for technical execution,      │
│                 serving an agent                   │
└─────────────────────────┬──────────────────────────┘
                          │
                          │ may use
                          │
                          ▼
┌────────────────────────────────────────────────────┐
│               SYSTEM DOMAIN (ClSystem)             │
│    conceptual object tied to system behavior       │
│ examples: stream, socket, thread, file, window     │
└─────────────────────────┬──────────────────────────┘
                          │
                          │ delegates low-level work to
                          │
                          ▼
┌────────────────────────────────────────────────────┐
│                LOW-LEVEL WORKER                    │
│   native calls, rendering, I/O, OS / runtime tasks │
└────────────────────────────────────────────────────┘

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  X) Purpose of the framework
&lt;/h1&gt;

&lt;p&gt;Clprolf does not aim to replace classical OOP.&lt;/p&gt;

&lt;p&gt;It aims to make certain important distinctions explicit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;business vs technical,&lt;/li&gt;
&lt;li&gt;coherent inheritance vs composition,&lt;/li&gt;
&lt;li&gt;primary responsibility of a class.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  XI) ArchUnit Checker
&lt;/h1&gt;

&lt;p&gt;An ArchUnit-based checker is available for the Clprolf Framework on GitHub. It is open-source and consists of two classes: &lt;code&gt;ClprolfArchTest&lt;/code&gt; and &lt;code&gt;ClprolfStrictArchTest&lt;/code&gt;. It validates semantic rules.&lt;br&gt;
The rules in &lt;code&gt;ClprolfStrictArchTest&lt;/code&gt; are optional. Likewise, it is easy to change the annotation names if you prefer a different vocabulary.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Java Version (ArchUnit)
&lt;/h2&gt;

&lt;p&gt;Available on GitHub, the Java checker is open-source and structured around two main test classes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ClprolfArchTest&lt;/code&gt;&lt;/strong&gt;: Validates the framework's standard and fundamental semantic rules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ClprolfStrictArchTest&lt;/code&gt;&lt;/strong&gt;: Enforces optional, more rigid constraints for demanding projects (such as forbidding a class from directly implementing a &lt;code&gt;ClTrait&lt;/code&gt;).
Both checkers (Java and .NET) also contain the definitions of Clprolf annotations (or attributes).
To simplify the documentation, the &lt;code&gt;ClSystem&lt;/code&gt; annotation is not included in the description of the rules. It is simply handled as an independent role by the checker.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. C# .NET Version (ArchUnitNET)
&lt;/h2&gt;

&lt;p&gt;The port of the .NET extension is available and published on GitHub.&lt;/p&gt;

&lt;p&gt;The Visual Studio solution (2022 to date) contains a project with the framework and ArchUnit rules, along with an xUnit project for the tests.&lt;br&gt;
A third example project is also included. There are currently 8 mandatory tests and 4 strict tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rules to Follow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  clprolf_classes_must_not_mix_agent_and_worker:
&lt;/h3&gt;

&lt;p&gt;A class cannot be annotated as both &lt;code&gt;@ClAgent&lt;/code&gt; and &lt;code&gt;@ClWorker&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  agent_worker_inheritance_must_not_mix
&lt;/h3&gt;

&lt;p&gt;A &lt;code&gt;@ClWorker&lt;/code&gt; class cannot inherit from a &lt;code&gt;@ClAgent&lt;/code&gt; class, and vice versa.&lt;/p&gt;

&lt;h3&gt;
  
  
  family_role_must_match_implementation
&lt;/h3&gt;

&lt;p&gt;The target role of a &lt;code&gt;@ClFamily&lt;/code&gt; interface must match the role of the implementing class (&lt;code&gt;@ClAgent&lt;/code&gt; or &lt;code&gt;@ClWorker&lt;/code&gt;). Bypassing is possible using &lt;code&gt;@ClBypass&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  (non-strict mode) trait_interface_role_must_match_direct_implementation
&lt;/h3&gt;

&lt;p&gt;A class that directly implements a trait must have a compatible role (unless bypassed with &lt;code&gt;@ClBypass&lt;/code&gt;). Forbidden in strict mode.&lt;/p&gt;

&lt;h3&gt;
  
  
  trait_interfaces_must_extend_only_trait_interfaces
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;@ClTrait&lt;/code&gt; interfaces can only inherit from other &lt;code&gt;@ClTrait&lt;/code&gt; interfaces. Bypassing is possible using &lt;code&gt;@ClInterfaceBypass&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  clprolf_interfaces_must_have_target_role
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;@ClFamily&lt;/code&gt; interfaces must have exactly one target role: &lt;code&gt;@ClAgent&lt;/code&gt; or &lt;code&gt;@ClWorker&lt;/code&gt;.&lt;br&gt;
&lt;code&gt;@ClTrait&lt;/code&gt; interfaces must have at least one target role: &lt;code&gt;@ClAgent&lt;/code&gt;, &lt;code&gt;@ClWorker&lt;/code&gt;, or exceptionally both.&lt;/p&gt;

&lt;h3&gt;
  
  
  inheriting_interface_role_must_match_trait_interface_target_role
&lt;/h3&gt;

&lt;p&gt;Interfaces (family or trait) that inherit from a trait must have a role compatible with that trait (unless bypassed with &lt;code&gt;@ClBypass&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  family_interface_target_role_must_match_inherited_family_interface
&lt;/h3&gt;

&lt;p&gt;Family interfaces inherited by another family interface must have a compatible role, unless &lt;code&gt;@ClBypass&lt;/code&gt; is used.&lt;/p&gt;

&lt;p&gt;Stricter Rules:&lt;/p&gt;

&lt;h3&gt;
  
  
  optional_all_classes_should_have_clprolf_role
&lt;/h3&gt;

&lt;p&gt;All classes must have a Clprolf role (&lt;code&gt;@ClAgent&lt;/code&gt;, &lt;code&gt;@ClWorker&lt;/code&gt;, or &lt;code&gt;@ClDraft&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  optional_all_interfaces_should_have_clprolf_role
&lt;/h3&gt;

&lt;p&gt;All interfaces must have a Clprolf role (&lt;code&gt;@ClFamily&lt;/code&gt;, &lt;code&gt;@ClTrait&lt;/code&gt;, or &lt;code&gt;@ClFree&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  optional_class_should_not_implement_trait_directly
&lt;/h3&gt;

&lt;p&gt;A class cannot directly implement a &lt;code&gt;@ClTrait&lt;/code&gt; interface (unless &lt;code&gt;@ClInterfaceBypass&lt;/code&gt; is used).&lt;/p&gt;

&lt;h3&gt;
  
  
  optional_class_must_implement_only_one_family_interface (OPTIONAL)
&lt;/h3&gt;

&lt;p&gt;A Clprolf class can only implement a single &lt;code&gt;@ClFamily&lt;/code&gt; interface. Bypassing is possible using &lt;code&gt;@ClInterfaceBypass&lt;/code&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  XII) Clprolf and the SOLID Principles
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;S&lt;/strong&gt; — Single Responsibility Principle (SRP)
&lt;/h2&gt;

&lt;p&gt;The framework naturally &lt;strong&gt;helps apply&lt;/strong&gt; the Single Responsibility Principle (SRP). Indeed, each class possesses its own conceptual or business domain, which is strictly preserved during inheritance. Adhering strictly to Clprolf makes achieving this even easier.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;O&lt;/strong&gt; — Open-Closed Principle (OCP)
&lt;/h2&gt;

&lt;p&gt;This principle encourages us to anticipate future evolutions as extensions rather than code corrections. The Clprolf framework &lt;strong&gt;facilitates&lt;/strong&gt; extensions through the strict separation of conceptual domains and workers. &lt;code&gt;ClFamily&lt;/code&gt; interfaces promote clear visibility of the interfaces used within classes and push for well-thought-out features. &lt;code&gt;ClTrait&lt;/code&gt; interfaces allow us to keep &lt;code&gt;ClFamily&lt;/code&gt; interfaces even simpler and purer, while enabling traits to be shared and reused seamlessly.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;L&lt;/strong&gt; — Liskov Substitution Principle (LSP)
&lt;/h2&gt;

&lt;p&gt;Clprolf enforces inheritance that remains strictly within the same conceptual domain, alongside the separation between &lt;code&gt;ClAgent&lt;/code&gt; and &lt;code&gt;ClWorker&lt;/code&gt;. Thus, Liskov's LSP principle is more easily taken into account, as a &lt;code&gt;Square&lt;/code&gt; class does not share the same conceptual domain as &lt;code&gt;Rectangle&lt;/code&gt;.&lt;br&gt;
Indeed, a &lt;code&gt;Giraffe&lt;/code&gt; class belongs to the same domain as an &lt;code&gt;Animal&lt;/code&gt;, from which it inherits its natural behaviors. Conversely, a &lt;code&gt;Square&lt;/code&gt; class does not share the true nature of a &lt;code&gt;Rectangle&lt;/code&gt; (it cannot have independent length and width). In Clprolf, they therefore do not belong to the same conceptual domain, which prevents improper inheritance and helps prevent certain violations of the LSP.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;I&lt;/strong&gt; — Interface Segregation Principle (ISP)
&lt;/h2&gt;

&lt;p&gt;This principle suggests that a client should not be forced to implement methods &lt;strong&gt;it does not use&lt;/strong&gt;. With Clprolf, the interface is custom-tailored for the client, and traits are precise. This naturally promotes compliance with the ISP.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;D&lt;/strong&gt; — Dependency Injection (DI)
&lt;/h2&gt;

&lt;p&gt;Dependency injection is particularly effective when dependencies are loosely coupled to implementations. This loose coupling is encouraged and facilitated by &lt;code&gt;ClFamily&lt;/code&gt; interfaces, which are closely &lt;strong&gt;linked&lt;/strong&gt; to classes and act as a mirror of implementations. It then becomes very easy to replace an implementation with an interface in a variable declaration.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Favoring Composition over Inheritance"
&lt;/h2&gt;

&lt;p&gt;The Clprolf framework ensures that inheritance is used sparingly and with precision, while relying on composition for everything else. It offers a practical and intuitive way to choose between the two.&lt;/p&gt;

&lt;h1&gt;
  
  
  XIII) Clprolf and Existing Architectures
&lt;/h1&gt;

&lt;p&gt;Clprolf is compatible with existing architectural approaches such as Domain-Driven Design (DDD), Model-View-Controller (MVC), Clean Architecture, Hexagonal Architecture, and others.&lt;br&gt;
Rather than replacing these architectures, Clprolf acts as an additional layer between Object-Oriented Programming (OOP) and software architecture. Its purpose is to complement, clarify, and reinforce existing architectural principles by making class roles and inheritance relationships more explicit.&lt;br&gt;
In this way, Clprolf helps improve architectural consistency while remaining fully compatible with established design practices.&lt;br&gt;
Furthermore, Clprolf is not just meant for enterprise software, but for all types of applications, including simulations and scientific applications.&lt;/p&gt;

&lt;h1&gt;
  
  
  XIV) Summary
&lt;/h1&gt;

&lt;p&gt;Clprolf introduces very few concepts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Classes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ClAgent
ClWorker
ClSystem
ClDraft
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Interfaces
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ClFamily
ClTrait
ClFree
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Two Fundamental Rules
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Separate business and technical concerns.
2. Inherit only within the same domain.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>architecture</category>
      <category>java</category>
      <category>cleancoding</category>
      <category>csharp</category>
    </item>
  </channel>
</rss>
