# Open/Closed Principle

> A design rule that a module gains new behavior by adding code at an extension point, leaving its existing code unchanged.

Record: `architecture:open-closed`
Kind: principle
Layer: [Structural Core](https://banes-lab.com/records/layer/structural-core.md)
Severity: recommended
Scope: class, module, component
Aliases: OCP
Canonical: https://banes-lab.com/ontology#architecture-open-closed

Listed in [Architecture principles](https://banes-lab.com/api/records/architecture.md), after [Dependency Inversion Principle (DIP)](https://banes-lab.com/records/architecture/dependency-inversion.md) and before [Liskov Substitution Principle (LSP)](https://banes-lab.com/records/architecture/liskov-substitution.md).

## Repair

- Refactored by: Extract Strategy, Add Extension Point, Introduce Plugin
- Detected by: growing conditionals, repeated edits to central classes
- Violated by: repeated modification of stable core for variants
- Measured by: modification frequency of core modules
- Enforced by: extension policies, change analysis

## Requires

- [Abstraction](https://banes-lab.com/records/architecture/abstraction.md)
- [Extension Points](https://banes-lab.com/records/architecture/extension-points.md)

## Reinforces

- [Plugin Architecture](https://banes-lab.com/records/architecture/plugin-architecture.md)
- [Strategy Pattern](https://banes-lab.com/records/architecture/strategy-pattern.md)

## Enables

- [Feature Extension without Modification](https://banes-lab.com/records/lexicon/feature-extension-without-modification.md)

## Conflicts with

- [Switch-Based Extension](https://banes-lab.com/records/lexicon/switch-based-extension.md)

## In tension with

- [Simplicity](https://banes-lab.com/records/lexicon/simplicity.md)

## Tensions

- [Open/Closed Principle (OCP) / Simplicity](https://banes-lab.com/records/tension/open-closed-principle-ocp-simplicity.md)

## Contracts

- [Extensibility Core](https://banes-lab.com/records/algorithms/extensibility-core.md)

## Severity

- [recommended](https://banes-lab.com/records/vocabulary/severity-recommended.md)

## Category

- [SOLID / Object-Oriented Design](https://banes-lab.com/records/architecture-category/solid-object-oriented-design.md)

## Enforced by

- [rules/eslint/closure-barrel-must-be-glob.eslint.rule.ts](https://banes-lab.com/source/governance/rules/eslint/closure-barrel-must-be-glob.eslint.rule.ts.md)
- [rules/eslint/require-self-registration.eslint.rule.ts](https://banes-lab.com/source/governance/rules/eslint/require-self-registration.eslint.rule.ts.md)

## Reinforced by

- [Dynamic Dispatch](https://banes-lab.com/records/architecture/dynamic-dispatch.md)
- [Runtime Extensibility](https://banes-lab.com/records/architecture/runtime-extensibility.md)
- [Polymorphism](https://banes-lab.com/records/architecture/polymorphism.md)
- [Command Pattern](https://banes-lab.com/records/architecture/command-pattern.md)
- [State Pattern](https://banes-lab.com/records/architecture/state-pattern.md)
- [Chain of Responsibility Pattern](https://banes-lab.com/records/architecture/chain-of-responsibility-pattern.md)
- [Visitor Pattern](https://banes-lab.com/records/architecture/visitor-pattern.md)
- [Factory Pattern](https://banes-lab.com/records/architecture/factory-pattern.md)
- [Factory Method Pattern](https://banes-lab.com/records/architecture/factory-method-pattern.md)
- [Decorator Pattern](https://banes-lab.com/records/architecture/decorator-pattern.md)
- [Composite Pattern](https://banes-lab.com/records/architecture/composite-pattern.md)

## Linked from

- [The filesystem is the architecture](https://banes-lab.com/disciplined-methodology/build/the-filesystem-is-the-architecture.md)
- [The structural domain](https://banes-lab.com/software-architecture/principles/the-structural-domain.md)
- [Runtime Discovery / Dynamic Binding](https://banes-lab.com/ontology/principles/architecture-category-runtime-discovery-dynamic-binding.md)
- [Core Modular Design](https://banes-lab.com/ontology/principles/architecture-category-core-modular-design.md)
- [SOLID / Object-Oriented Design](https://banes-lab.com/ontology/principles/architecture-category-solid-object-oriented-design.md)
- [Behavioral Patterns](https://banes-lab.com/ontology/principles/architecture-category-behavioral-patterns.md)
- [Creational Patterns](https://banes-lab.com/ontology/principles/architecture-category-creational-patterns.md)
- [Structural Patterns](https://banes-lab.com/ontology/principles/architecture-category-structural-patterns.md)
- [Plugin / Extensibility / IoC](https://banes-lab.com/ontology/principles/architecture-category-plugin-extensibility-ioc.md)
- [Quality Attributes](https://banes-lab.com/ontology/lexicon/lexicon-category-quality-attributes.md)
- [SOLID / Object-Oriented Design](https://banes-lab.com/ontology/lexicon/lexicon-category-solid-object-oriented-design.md)
- [Architectural Clusters](https://banes-lab.com/ontology/algorithms/algorithms-domain-architectural-clusters.md)
- [Severity levels](https://banes-lab.com/ontology/schema/the-vocabulary-severity.md)
- [The resolutions](https://banes-lab.com/ontology/schema/the-resolutions.md)

## Evidence in the code

- [registerPage](https://banes-lab.com/source/tree/domain/registries/page.registry.ts.md)
- [presentation/records](https://banes-lab.com/anatomy/tree/folder-presentation-records.md)
- [presentation/records/records.barrel.ts](https://banes-lab.com/source/tree/presentation/records/records.barrel.ts.md)
