{
  "code": "OCP",
  "collection": "architecture",
  "href": "https://banes-lab.com/ontology#architecture-open-closed",
  "id": "open-closed",
  "kind": "principle",
  "layer": {
    "href": "https://banes-lab.com/ontology/schema#layer-structural-core",
    "json": "https://banes-lab.com/json/records/layer/structural-core",
    "label": "Structural Core",
    "markdown": "https://banes-lab.com/records/layer/structural-core.md",
    "ref": "layer:structural-core"
  },
  "name": "Open/Closed Principle",
  "ref": "architecture:open-closed",
  "relations": [
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology#architecture-abstraction",
          "json": "https://banes-lab.com/json/records/architecture/abstraction",
          "label": "Abstraction",
          "markdown": "https://banes-lab.com/records/architecture/abstraction.md",
          "ref": "architecture:abstraction"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-extension-points",
          "json": "https://banes-lab.com/json/records/architecture/extension-points",
          "label": "Extension Points",
          "markdown": "https://banes-lab.com/records/architecture/extension-points.md",
          "ref": "architecture:extension-points"
        }
      ],
      "relation": "requires"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology#architecture-plugin-architecture",
          "json": "https://banes-lab.com/json/records/architecture/plugin-architecture",
          "label": "Plugin Architecture",
          "markdown": "https://banes-lab.com/records/architecture/plugin-architecture.md",
          "ref": "architecture:plugin-architecture"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-strategy-pattern",
          "json": "https://banes-lab.com/json/records/architecture/strategy-pattern",
          "label": "Strategy Pattern",
          "markdown": "https://banes-lab.com/records/architecture/strategy-pattern.md",
          "ref": "architecture:strategy-pattern"
        }
      ],
      "relation": "reinforces"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-feature-extension-without-modification",
          "json": "https://banes-lab.com/json/records/lexicon/feature-extension-without-modification",
          "label": "Feature Extension without Modification",
          "markdown": "https://banes-lab.com/records/lexicon/feature-extension-without-modification.md",
          "ref": "lexicon:feature-extension-without-modification"
        }
      ],
      "relation": "enables"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-switch-based-extension",
          "json": "https://banes-lab.com/json/records/lexicon/switch-based-extension",
          "label": "Switch-Based Extension",
          "markdown": "https://banes-lab.com/records/lexicon/switch-based-extension.md",
          "ref": "lexicon:switch-based-extension"
        }
      ],
      "relation": "conflicts-with"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-simplicity",
          "json": "https://banes-lab.com/json/records/lexicon/simplicity",
          "label": "Simplicity",
          "markdown": "https://banes-lab.com/records/lexicon/simplicity.md",
          "ref": "lexicon:simplicity"
        }
      ],
      "relation": "tensions-with"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/schema#tension-open-closed-principle-ocp-simplicity",
          "json": "https://banes-lab.com/json/records/tension/open-closed-principle-ocp-simplicity",
          "label": "Open/Closed Principle (OCP) / Simplicity",
          "markdown": "https://banes-lab.com/records/tension/open-closed-principle-ocp-simplicity.md",
          "ref": "tension:open-closed-principle-ocp-simplicity"
        }
      ],
      "relation": "tensions"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/algorithms#algorithms-extensibility-core",
          "json": "https://banes-lab.com/json/records/algorithms/extensibility-core",
          "label": "Extensibility Core",
          "markdown": "https://banes-lab.com/records/algorithms/extensibility-core.md",
          "ref": "algorithms:extensibility-core"
        }
      ],
      "relation": "contracts"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-switch-based-extension",
          "json": "https://banes-lab.com/json/records/lexicon/switch-based-extension",
          "label": "Switch-Based Extension",
          "markdown": "https://banes-lab.com/records/lexicon/switch-based-extension.md",
          "ref": "lexicon:switch-based-extension"
        }
      ],
      "relation": "violated-by"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology#architecture-strategy-pattern",
          "json": "https://banes-lab.com/json/records/architecture/strategy-pattern",
          "label": "Strategy Pattern",
          "markdown": "https://banes-lab.com/records/architecture/strategy-pattern.md",
          "ref": "architecture:strategy-pattern"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-extension-points",
          "json": "https://banes-lab.com/json/records/architecture/extension-points",
          "label": "Extension Points",
          "markdown": "https://banes-lab.com/records/architecture/extension-points.md",
          "ref": "architecture:extension-points"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-plugin-architecture",
          "json": "https://banes-lab.com/json/records/architecture/plugin-architecture",
          "label": "Plugin Architecture",
          "markdown": "https://banes-lab.com/records/architecture/plugin-architecture.md",
          "ref": "architecture:plugin-architecture"
        }
      ],
      "relation": "refactored-by"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology/schema#vocabulary-severity-recommended",
          "json": "https://banes-lab.com/json/records/vocabulary/severity-recommended",
          "label": "recommended",
          "markdown": "https://banes-lab.com/records/vocabulary/severity-recommended.md",
          "ref": "vocabulary:severity-recommended"
        }
      ],
      "relation": "severity"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology#architecture-category-solid-object-oriented-design",
          "json": "https://banes-lab.com/json/records/architecture-category/solid-object-oriented-design",
          "label": "SOLID / Object-Oriented Design",
          "markdown": "https://banes-lab.com/records/architecture-category/solid-object-oriented-design.md",
          "ref": "architecture-category:solid-object-oriented-design"
        }
      ],
      "relation": "category"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/anatomy/governance#file-governance-rules-eslint-closure-barrel-must-be-glob-eslint-rule-ts",
          "json": "https://banes-lab.com/json/source/governance/rules/eslint/closure-barrel-must-be-glob.eslint.rule.ts",
          "label": "rules/eslint/closure-barrel-must-be-glob.eslint.rule.ts",
          "markdown": "https://banes-lab.com/source/governance/rules/eslint/closure-barrel-must-be-glob.eslint.rule.ts.md",
          "ref": "anatomy:file-governance-rules-eslint-closure-barrel-must-be-glob-eslint-rule-ts"
        },
        {
          "href": "https://banes-lab.com/anatomy/governance#file-governance-rules-eslint-require-self-registration-eslint-rule-ts",
          "json": "https://banes-lab.com/json/source/governance/rules/eslint/require-self-registration.eslint.rule.ts",
          "label": "rules/eslint/require-self-registration.eslint.rule.ts",
          "markdown": "https://banes-lab.com/source/governance/rules/eslint/require-self-registration.eslint.rule.ts.md",
          "ref": "anatomy:file-governance-rules-eslint-require-self-registration-eslint-rule-ts"
        }
      ],
      "relation": "enforced-by"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/ontology#architecture-dynamic-dispatch",
          "json": "https://banes-lab.com/json/records/architecture/dynamic-dispatch",
          "label": "Dynamic Dispatch",
          "markdown": "https://banes-lab.com/records/architecture/dynamic-dispatch.md",
          "ref": "architecture:dynamic-dispatch"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-runtime-extensibility",
          "json": "https://banes-lab.com/json/records/architecture/runtime-extensibility",
          "label": "Runtime Extensibility",
          "markdown": "https://banes-lab.com/records/architecture/runtime-extensibility.md",
          "ref": "architecture:runtime-extensibility"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-polymorphism",
          "json": "https://banes-lab.com/json/records/architecture/polymorphism",
          "label": "Polymorphism",
          "markdown": "https://banes-lab.com/records/architecture/polymorphism.md",
          "ref": "architecture:polymorphism"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-command-pattern",
          "json": "https://banes-lab.com/json/records/architecture/command-pattern",
          "label": "Command Pattern",
          "markdown": "https://banes-lab.com/records/architecture/command-pattern.md",
          "ref": "architecture:command-pattern"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-state-pattern",
          "json": "https://banes-lab.com/json/records/architecture/state-pattern",
          "label": "State Pattern",
          "markdown": "https://banes-lab.com/records/architecture/state-pattern.md",
          "ref": "architecture:state-pattern"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-chain-of-responsibility-pattern",
          "json": "https://banes-lab.com/json/records/architecture/chain-of-responsibility-pattern",
          "label": "Chain of Responsibility Pattern",
          "markdown": "https://banes-lab.com/records/architecture/chain-of-responsibility-pattern.md",
          "ref": "architecture:chain-of-responsibility-pattern"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-visitor-pattern",
          "json": "https://banes-lab.com/json/records/architecture/visitor-pattern",
          "label": "Visitor Pattern",
          "markdown": "https://banes-lab.com/records/architecture/visitor-pattern.md",
          "ref": "architecture:visitor-pattern"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-factory-pattern",
          "json": "https://banes-lab.com/json/records/architecture/factory-pattern",
          "label": "Factory Pattern",
          "markdown": "https://banes-lab.com/records/architecture/factory-pattern.md",
          "ref": "architecture:factory-pattern"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-factory-method-pattern",
          "json": "https://banes-lab.com/json/records/architecture/factory-method-pattern",
          "label": "Factory Method Pattern",
          "markdown": "https://banes-lab.com/records/architecture/factory-method-pattern.md",
          "ref": "architecture:factory-method-pattern"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-decorator-pattern",
          "json": "https://banes-lab.com/json/records/architecture/decorator-pattern",
          "label": "Decorator Pattern",
          "markdown": "https://banes-lab.com/records/architecture/decorator-pattern.md",
          "ref": "architecture:decorator-pattern"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-composite-pattern",
          "json": "https://banes-lab.com/json/records/architecture/composite-pattern",
          "label": "Composite Pattern",
          "markdown": "https://banes-lab.com/records/architecture/composite-pattern.md",
          "ref": "architecture:composite-pattern"
        }
      ],
      "relation": "reinforced-by"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/disciplined-methodology/build#the-filesystem-is-the-architecture",
          "json": "https://banes-lab.com/json/disciplined-methodology/build/the-filesystem-is-the-architecture",
          "label": "The filesystem is the architecture",
          "markdown": "https://banes-lab.com/disciplined-methodology/build/the-filesystem-is-the-architecture.md",
          "ref": "chapter:/disciplined-methodology/build#the-filesystem-is-the-architecture"
        },
        {
          "href": "https://banes-lab.com/software-architecture/principles#the-structural-domain",
          "json": "https://banes-lab.com/json/software-architecture/principles/the-structural-domain",
          "label": "The structural domain",
          "markdown": "https://banes-lab.com/software-architecture/principles/the-structural-domain.md",
          "ref": "chapter:/software-architecture/principles#the-structural-domain"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-runtime-discovery-dynamic-binding",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-runtime-discovery-dynamic-binding",
          "label": "Runtime Discovery / Dynamic Binding",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-runtime-discovery-dynamic-binding.md",
          "ref": "chapter:/ontology#architecture-category-runtime-discovery-dynamic-binding"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-core-modular-design",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-core-modular-design",
          "label": "Core Modular Design",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-core-modular-design.md",
          "ref": "chapter:/ontology#architecture-category-core-modular-design"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-solid-object-oriented-design",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-solid-object-oriented-design",
          "label": "SOLID / Object-Oriented Design",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-solid-object-oriented-design.md",
          "ref": "chapter:/ontology#architecture-category-solid-object-oriented-design"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-behavioral-patterns",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-behavioral-patterns",
          "label": "Behavioral Patterns",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-behavioral-patterns.md",
          "ref": "chapter:/ontology#architecture-category-behavioral-patterns"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-creational-patterns",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-creational-patterns",
          "label": "Creational Patterns",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-creational-patterns.md",
          "ref": "chapter:/ontology#architecture-category-creational-patterns"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-structural-patterns",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-structural-patterns",
          "label": "Structural Patterns",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-structural-patterns.md",
          "ref": "chapter:/ontology#architecture-category-structural-patterns"
        },
        {
          "href": "https://banes-lab.com/ontology#architecture-category-plugin-extensibility-ioc",
          "json": "https://banes-lab.com/json/ontology/principles/architecture-category-plugin-extensibility-ioc",
          "label": "Plugin / Extensibility / IoC",
          "markdown": "https://banes-lab.com/ontology/principles/architecture-category-plugin-extensibility-ioc.md",
          "ref": "chapter:/ontology#architecture-category-plugin-extensibility-ioc"
        },
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-category-quality-attributes",
          "json": "https://banes-lab.com/json/ontology/lexicon/lexicon-category-quality-attributes",
          "label": "Quality Attributes",
          "markdown": "https://banes-lab.com/ontology/lexicon/lexicon-category-quality-attributes.md",
          "ref": "chapter:/ontology/lexicon#lexicon-category-quality-attributes"
        },
        {
          "href": "https://banes-lab.com/ontology/lexicon#lexicon-category-solid-object-oriented-design",
          "json": "https://banes-lab.com/json/ontology/lexicon/lexicon-category-solid-object-oriented-design",
          "label": "SOLID / Object-Oriented Design",
          "markdown": "https://banes-lab.com/ontology/lexicon/lexicon-category-solid-object-oriented-design.md",
          "ref": "chapter:/ontology/lexicon#lexicon-category-solid-object-oriented-design"
        },
        {
          "href": "https://banes-lab.com/ontology/algorithms#algorithms-domain-architectural-clusters",
          "json": "https://banes-lab.com/json/ontology/algorithms/algorithms-domain-architectural-clusters",
          "label": "Architectural Clusters",
          "markdown": "https://banes-lab.com/ontology/algorithms/algorithms-domain-architectural-clusters.md",
          "ref": "chapter:/ontology/algorithms#algorithms-domain-architectural-clusters"
        },
        {
          "href": "https://banes-lab.com/ontology/schema#the-vocabulary-severity",
          "json": "https://banes-lab.com/json/ontology/schema/the-vocabulary-severity",
          "label": "Severity levels",
          "markdown": "https://banes-lab.com/ontology/schema/the-vocabulary-severity.md",
          "ref": "chapter:/ontology/schema#the-vocabulary-severity"
        },
        {
          "href": "https://banes-lab.com/ontology/schema#the-resolutions",
          "json": "https://banes-lab.com/json/ontology/schema/the-resolutions",
          "label": "The resolutions",
          "markdown": "https://banes-lab.com/ontology/schema/the-resolutions.md",
          "ref": "chapter:/ontology/schema#the-resolutions"
        }
      ],
      "relation": "linked-from"
    },
    {
      "links": [
        {
          "href": "https://banes-lab.com/anatomy/tree#file-domain-registries-page-registry-ts",
          "json": "https://banes-lab.com/json/source/tree/domain/registries/page.registry.ts",
          "label": "registerPage",
          "markdown": "https://banes-lab.com/source/tree/domain/registries/page.registry.ts.md",
          "ref": "anatomy:file-domain-registries-page-registry-ts"
        },
        {
          "href": "https://banes-lab.com/anatomy/tree#folder-presentation-records",
          "json": "https://banes-lab.com/json/anatomy/tree/folder-presentation-records",
          "label": "presentation/records",
          "markdown": "https://banes-lab.com/anatomy/tree/folder-presentation-records.md",
          "ref": "chapter:/anatomy/tree#folder-presentation-records"
        },
        {
          "href": "https://banes-lab.com/anatomy/tree#file-presentation-records-records-barrel-ts",
          "json": "https://banes-lab.com/json/source/tree/presentation/records/records.barrel.ts",
          "label": "presentation/records/records.barrel.ts",
          "markdown": "https://banes-lab.com/source/tree/presentation/records/records.barrel.ts.md",
          "ref": "anatomy:file-presentation-records-records-barrel-ts"
        }
      ],
      "relation": "evidence"
    }
  ],
  "summary": "A design rule that a module gains new behavior by adding code at an extension point, leaving its existing code unchanged.",
  "siblings": {
    "next": {
      "href": "https://banes-lab.com/ontology#architecture-liskov-substitution",
      "json": "https://banes-lab.com/json/records/architecture/liskov-substitution",
      "label": "Liskov Substitution Principle (LSP)",
      "markdown": "https://banes-lab.com/records/architecture/liskov-substitution.md",
      "ref": "architecture:liskov-substitution"
    },
    "previous": {
      "href": "https://banes-lab.com/ontology#architecture-dependency-inversion",
      "json": "https://banes-lab.com/json/records/architecture/dependency-inversion",
      "label": "Dependency Inversion Principle (DIP)",
      "markdown": "https://banes-lab.com/records/architecture/dependency-inversion.md",
      "ref": "architecture:dependency-inversion"
    }
  },
  "up": {
    "href": null,
    "json": "https://banes-lab.com/json/api/records/architecture",
    "label": "Architecture principles",
    "markdown": "https://banes-lab.com/api/records/architecture.md",
    "ref": "api:records/architecture"
  },
  "aliases": [
    "OCP",
    "Open-Closed Principle"
  ],
  "exemplar": {
    "after": "interface FooPricing { price(value: number): number; }\nconst registry = new Map<string, FooPricing>();\nexport function registerPricing(kind: string, pricing: FooPricing) { registry.set(kind, pricing); }\nexport function priceFoo(kind: string, value: number) {\n  const pricing = registry.get(kind);\n  if (!pricing) throw new Error(`unknown kind ${kind}`);\n  return pricing.price(value);\n}\nregisterPricing(\"bar\", { price: value => value * 2 });",
    "before": "function priceFoo(kind: string, value: number) {\n  if (kind === \"foo\") return value;\n  if (kind === \"bar\") return value * 2;\n  throw new Error(\"unknown kind\");\n}",
    "lang": "ts",
    "medium": "code"
  },
  "formedBy": null,
  "scope": [
    "class",
    "module",
    "component"
  ],
  "severity": "recommended"
}
