# SOLID / Object-Oriented Design

> Every principle in this category is listed as a record.

Page: Ontology · Principles
Canonical: https://banes-lab.com/ontology#architecture-category-solid-object-oriented-design

Listed in [Ontology · Principles](https://banes-lab.com/api/pages/ontology/principles.md), after [Core Modular Design](https://banes-lab.com/ontology/principles/architecture-category-core-modular-design.md) and before [Event / Messaging / Asynchronous Architecture](https://banes-lab.com/ontology/principles/architecture-category-event-messaging-asynchronous-architecture.md).

Every principle in this category is listed as a record. Each record carries its kind, its severity, the scopes it applies at and the layer it lives in, then the edge relations that join it to other records, the records that point back at it, the contracts that answer to it and the tensions it takes part in. The descriptors say how it is violated, detected, measured, repaired and enforced. Where the record carries one, an exemplar shows the shape before and after the principle is applied.

Relations diagram

The relations inside this category.

```mermaid
flowchart LR
n_interface_segregation["Interface Segregation Principle (ISP)"]
n_dependency_inversion["Dependency Inversion Principle (DIP)"]
n_open_closed["Open/Closed Principle (OCP)"]
n_liskov_substitution["Liskov Substitution Principle (LSP)"]
n_polymorphism["Polymorphism"]
n_liskov_substitution --> n_polymorphism
n_polymorphism --> n_open_closed
```

### Interface Segregation Principle (ISP)

- Kind: [principle](https://banes-lab.com/records/kind/principle.md)
- Category: [SOLID / Object-Oriented Design](https://banes-lab.com/ontology/principles/architecture-category-solid-object-oriented-design.md)
- Severity: [mandatory](https://banes-lab.com/records/vocabulary/severity-mandatory.md)
- Scope: interface, service, module
- Layer: [Structural Core](https://banes-lab.com/records/layer/structural-core.md)

Details

Definition
A design rule that a client depends on an interface holding only the methods it uses.

Requires
[Role-Specific Interfaces](https://banes-lab.com/records/lexicon/role-specific-interfaces.md)

Reinforces
[Single Responsibility Principle (SRP)](https://banes-lab.com/records/architecture/single-responsibility.md), [Low Coupling](https://banes-lab.com/records/architecture/low-coupling.md)

Enables
[Consumer-Specific Contracts](https://banes-lab.com/records/lexicon/consumer-specific-contracts.md)

In tension with
[Interface Proliferation](https://banes-lab.com/records/lexicon/interface-proliferation.md)

Conflicts with
[Fat Interface](https://banes-lab.com/records/lexicon/fat-interface.md), [Repository Dump](https://banes-lab.com/records/architecture/repository-dump.md)

Tensions
[Interface Segregation Principle (ISP) / Interface Proliferation](https://banes-lab.com/records/tension/interface-proliferation-interface-segregation-principle-isp.md)

Violated by
clients depending on unused methods

Detected by
unused interface method implementations

Measured by
interface method usage ratio

Refactored by
Split Interface, Extract Role Interface

Enforced by
interface usage analysis, lint rules

Before

```typescript
interface FooWorker {
load(id: FooId): Foo;
save(foo: Foo): void;
delete(id: FooId): void;
export(): string;
}
class FooReader implements FooWorker {}
```

After

```typescript
interface FooReader { load(id: FooId): Foo; }
interface FooWriter { save(foo: Foo): void; }
interface FooRemover { delete(id: FooId): void; }
class CachedFooReader implements FooReader {
load(id: FooId) { return fooCache.get(id)!; }
}
```

How it is checked

Checked by
interface usage analysis, lint rules

Population
Every interface, class hierarchy and dependency edge in the object model

Freshness
A verdict stands until an interface, an override or a dependency changes

Refusal
The dependency rule or the contract test fails a change that breaks substitution, segregation or dependency direction

Observation
Interface usage, override contracts and dependency direction, read from source and contract tests

Evidence
None, because the catalog states this check as a class, so a watched run belongs to each system that adopts it

Authoritative side
The interface contract, which every implementation and override conforms to

Depends on
[Role-Specific Interfaces](https://banes-lab.com/records/lexicon/role-specific-interfaces.md), [Single Responsibility Principle (SRP)](https://banes-lab.com/records/architecture/single-responsibility.md), [Low Coupling](https://banes-lab.com/records/architecture/low-coupling.md), [Consumer-Specific Contracts](https://banes-lab.com/records/lexicon/consumer-specific-contracts.md)

Shape it refuses
[Fat Interface](https://banes-lab.com/records/lexicon/fat-interface.md), [Repository Dump](https://banes-lab.com/records/architecture/repository-dump.md)

### Dependency Inversion Principle (DIP)

- Kind: [principle](https://banes-lab.com/records/kind/principle.md)
- Category: [SOLID / Object-Oriented Design](https://banes-lab.com/ontology/principles/architecture-category-solid-object-oriented-design.md)
- Severity: [mandatory](https://banes-lab.com/records/vocabulary/severity-mandatory.md)
- Scope: module, component, layer
- Aliases: DIP
- Layer: [Structural Core](https://banes-lab.com/records/layer/structural-core.md)

Details

Definition
A design rule that high-level policy and low-level detail both depend on an abstraction owned by the policy.

Requires
[Abstraction](https://banes-lab.com/records/architecture/abstraction.md), [Stable Interfaces](https://banes-lab.com/records/architecture/stable-interfaces.md)

Reinforces
[Low Coupling](https://banes-lab.com/records/architecture/low-coupling.md), [Clean Architecture](https://banes-lab.com/records/architecture/clean-architecture.md)

Enables
[Dependency Injection](https://banes-lab.com/records/architecture/dependency-injection.md), [Ports and Adapters](https://banes-lab.com/records/lexicon/ports-and-adapters.md)

In tension with
[Runtime Indirection](https://banes-lab.com/records/lexicon/runtime-indirection.md)

Conflicts with
[Concrete Dependency](https://banes-lab.com/records/lexicon/concrete-dependency.md)

Referenced by
[Interface-Based Design](https://banes-lab.com/records/architecture/interface-based-design.md), [Testability](https://banes-lab.com/records/architecture/testability.md), [Abstraction](https://banes-lab.com/records/architecture/abstraction.md), [Replaceability](https://banes-lab.com/records/architecture/replaceability.md), [Inversion of Control (IoC)](https://banes-lab.com/records/architecture/inversion-of-control.md), [Dependency Injection](https://banes-lab.com/records/architecture/dependency-injection.md), [Service Locator Pattern](https://banes-lab.com/records/architecture/service-locator-pattern.md), [Ports and Adapters Architecture](https://banes-lab.com/records/architecture/ports-and-adapters-architecture.md), [Clean Architecture](https://banes-lab.com/records/architecture/clean-architecture.md)

Tensions
[Dependency Inversion Principle (DIP) / Runtime Indirection](https://banes-lab.com/records/tension/dependency-inversion-principle-dip-runtime-indirection.md)

Distinct from
[Inversion of Control (IoC)](https://banes-lab.com/records/architecture/inversion-of-control.md): Dependency inversion fixes which side owns the abstraction, while inversion of control moves object creation and control flow to a framework or composition root.

Violated by
domain importing infrastructure

Detected by
dependency direction violations

Measured by
inward dependency ratio

Refactored by
Extract Interface, Introduce Port, Inject Dependency

Enforced by
dependency graph rules, architecture tests

Before

```typescript
class FooService {
private readonly store = new SqlFooStore();
save(foo: Foo) { return this.store.save(foo); }
}
```

After

```typescript
interface FooStore { save(foo: Foo): Promise<void>; }
class FooService {
constructor(private readonly store: FooStore) {}
save(foo: Foo) { return this.store.save(foo); }
}
```

How it is checked

Checked by
dependency graph rules, architecture tests

Population
Every interface, class hierarchy and dependency edge in the object model

Freshness
A verdict stands until an interface, an override or a dependency changes

Refusal
The dependency rule or the contract test fails a change that breaks substitution, segregation or dependency direction

Observation
Interface usage, override contracts and dependency direction, read from source and contract tests

Evidence
None, because the catalog states this check as a class, so a watched run belongs to each system that adopts it

Authoritative side
The interface contract, which every implementation and override conforms to

Depends on
[Abstraction](https://banes-lab.com/records/architecture/abstraction.md), [Stable Interfaces](https://banes-lab.com/records/architecture/stable-interfaces.md), [Low Coupling](https://banes-lab.com/records/architecture/low-coupling.md), [Clean Architecture](https://banes-lab.com/records/architecture/clean-architecture.md), [Dependency Injection](https://banes-lab.com/records/architecture/dependency-injection.md), [Ports and Adapters](https://banes-lab.com/records/lexicon/ports-and-adapters.md)

Shape it refuses
[Concrete Dependency](https://banes-lab.com/records/lexicon/concrete-dependency.md)

### Open/Closed Principle (OCP)

- Kind: [principle](https://banes-lab.com/records/kind/principle.md)
- Category: [SOLID / Object-Oriented Design](https://banes-lab.com/ontology/principles/architecture-category-solid-object-oriented-design.md)
- Severity: [recommended](https://banes-lab.com/records/vocabulary/severity-recommended.md)
- Scope: class, module, component
- Aliases: OCP
- Layer: [Structural Core](https://banes-lab.com/records/layer/structural-core.md)

Details

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

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)

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

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

Referenced 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), [Strategy Pattern](https://banes-lab.com/records/architecture/strategy-pattern.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), [Plugin Architecture](https://banes-lab.com/records/architecture/plugin-architecture.md), [Extension Points](https://banes-lab.com/records/architecture/extension-points.md)

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

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

Distinct from
[Composability](https://banes-lab.com/records/architecture/composability.md): The open/closed principle adds behavior without editing existing code, while composability combines parts through compatible interfaces.

Violated by
repeated modification of stable core for variants

Detected by
growing conditionals, repeated edits to central classes

Measured by
modification frequency of core modules

Refactored by
Extract Strategy, Add Extension Point, Introduce Plugin

Enforced by
extension policies, change analysis

Refused by rules
open-closed

Before

```typescript
function priceFoo(kind: string, value: number) {
if (kind === "foo") return value;
if (kind === "bar") return value * 2;
throw new Error("unknown kind");
}
```

After

```typescript
interface FooPricing { price(value: number): number; }
const registry = new Map<string, FooPricing>();
export function registerPricing(kind: string, pricing: FooPricing) { registry.set(kind, pricing); }
export function priceFoo(kind: string, value: number) {
const pricing = registry.get(kind);
if (!pricing) throw new Error(`unknown kind ${kind}`);
return pricing.price(value);
}
registerPricing("bar", { price: value => value * 2 });
```

How it is checked

Checked by
extension policies, change analysis

Population
Every interface, class hierarchy and dependency edge in the object model

Freshness
A verdict stands until an interface, an override or a dependency changes

Refusal
The dependency rule or the contract test fails a change that breaks substitution, segregation or dependency direction

Observation
Interface usage, override contracts and dependency direction, read from source and contract tests

Evidence
None, because the catalog states this check as a class, so a watched run belongs to each system that adopts it

Authoritative side
The interface contract, which every implementation and override conforms to

Depends on
[Abstraction](https://banes-lab.com/records/architecture/abstraction.md), [Extension Points](https://banes-lab.com/records/architecture/extension-points.md), [Plugin Architecture](https://banes-lab.com/records/architecture/plugin-architecture.md), [Strategy Pattern](https://banes-lab.com/records/architecture/strategy-pattern.md), [Feature Extension without Modification](https://banes-lab.com/records/lexicon/feature-extension-without-modification.md)

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

### Liskov Substitution Principle (LSP)

- Kind: [principle](https://banes-lab.com/records/kind/principle.md)
- Category: [SOLID / Object-Oriented Design](https://banes-lab.com/ontology/principles/architecture-category-solid-object-oriented-design.md)
- Severity: [mandatory](https://banes-lab.com/records/vocabulary/severity-mandatory.md)
- Scope: class, interface, type hierarchy
- Aliases: LSP
- Layer: [Structural Core](https://banes-lab.com/records/layer/structural-core.md)

Details

Definition
A design rule that a subtype can replace its base type anywhere, because it keeps the base type's preconditions, postconditions and invariants.

Requires
[Contract Preservation](https://banes-lab.com/records/lexicon/contract-preservation.md), [Preconditions](https://banes-lab.com/records/architecture/preconditions.md), [Postconditions](https://banes-lab.com/records/architecture/postconditions.md), [Invariant](https://banes-lab.com/records/architecture/invariant.md)

Reinforces
[Polymorphism](https://banes-lab.com/records/architecture/polymorphism.md), [Type Safety](https://banes-lab.com/records/architecture/type-safety.md)

Enables
[Safe Substitution](https://banes-lab.com/records/lexicon/safe-substitution.md), [Substitutability](https://banes-lab.com/records/lexicon/substitutability.md)

In tension with
[Narrow Specialized Behavior](https://banes-lab.com/records/lexicon/narrow-specialized-behavior.md)

Conflicts with
[Broken Inheritance](https://banes-lab.com/records/lexicon/broken-inheritance.md), [Broken Inheritance](https://banes-lab.com/records/lexicon/broken-inheritance.md)

Referenced by
[Design by Contract](https://banes-lab.com/records/architecture/design-by-contract.md)

Tensions
[Liskov Substitution Principle (LSP) / Narrow Specialized Behavior](https://banes-lab.com/records/tension/liskov-substitution-principle-lsp-narrow-specialized-behavior.md)

Violated by
subclass weakening postconditions or strengthening preconditions

Detected by
overridden method contract divergence

Measured by
contract test pass rate across subtypes

Refactored by
Replace Inheritance, Extract Interface, Split Hierarchy

Enforced by
contract tests, type tests

Before

```typescript
class FooStore {
save(foo: Foo): Promise<Receipt> { return persist(foo); }
}
class ReadOnlyFooStore extends FooStore {
save(): Promise<Receipt> { throw new Error("not supported"); }
}
```

After

```typescript
class FooStore {
save(foo: Foo): Promise<Receipt> { return persist(foo); }
}
class AuditedFooStore extends FooStore {
async save(foo: Foo): Promise<Receipt> {
const receipt = await super.save(foo);
audit.record(receipt);
return receipt;
}
}
```

How it is checked

Checked by
contract tests, type tests

Population
Every interface, class hierarchy and dependency edge in the object model

Freshness
A verdict stands until an interface, an override or a dependency changes

Refusal
The dependency rule or the contract test fails a change that breaks substitution, segregation or dependency direction

Observation
Interface usage, override contracts and dependency direction, read from source and contract tests

Evidence
None, because the catalog states this check as a class, so a watched run belongs to each system that adopts it

Authoritative side
The interface contract, which every implementation and override conforms to

Depends on
[Contract Preservation](https://banes-lab.com/records/lexicon/contract-preservation.md), [Preconditions](https://banes-lab.com/records/architecture/preconditions.md), [Postconditions](https://banes-lab.com/records/architecture/postconditions.md), [Invariant](https://banes-lab.com/records/architecture/invariant.md), [Polymorphism](https://banes-lab.com/records/architecture/polymorphism.md), [Type Safety](https://banes-lab.com/records/architecture/type-safety.md), [Safe Substitution](https://banes-lab.com/records/lexicon/safe-substitution.md), [Substitutability](https://banes-lab.com/records/lexicon/substitutability.md)

Shape it refuses
[Broken Inheritance](https://banes-lab.com/records/lexicon/broken-inheritance.md), [Broken Inheritance](https://banes-lab.com/records/lexicon/broken-inheritance.md)

### Polymorphism

- Kind: [mechanism](https://banes-lab.com/records/kind/mechanism.md)
- Category: [SOLID / Object-Oriented Design](https://banes-lab.com/ontology/principles/architecture-category-solid-object-oriented-design.md)
- Severity: [recommended](https://banes-lab.com/records/vocabulary/severity-recommended.md)
- Scope: class, interface, runtime
- Layer: [Structural Core](https://banes-lab.com/records/layer/structural-core.md)

Details

Definition
A mechanism that lets one interface have several implementations, with the implementation chosen by the object that receives the call.

Requires
[Abstraction](https://banes-lab.com/records/architecture/abstraction.md), [Substitutability](https://banes-lab.com/records/lexicon/substitutability.md)

Reinforces
[Open/Closed Principle (OCP)](https://banes-lab.com/records/architecture/open-closed.md), [Strategy Pattern](https://banes-lab.com/records/architecture/strategy-pattern.md)

Enables
[Dynamic Dispatch](https://banes-lab.com/records/architecture/dynamic-dispatch.md), [Interchangeability](https://banes-lab.com/records/architecture/interchangeability.md)

In tension with
[Traceability](https://banes-lab.com/records/architecture/traceability.md)

Conflicts with
[Type Switching](https://banes-lab.com/records/lexicon/type-switching.md)

Referenced by
[Dynamic Binding](https://banes-lab.com/records/architecture/dynamic-binding.md), [Dynamic Dispatch](https://banes-lab.com/records/architecture/dynamic-dispatch.md), [Abstraction](https://banes-lab.com/records/architecture/abstraction.md), [Interchangeability](https://banes-lab.com/records/architecture/interchangeability.md), [Liskov Substitution Principle (LSP)](https://banes-lab.com/records/architecture/liskov-substitution.md), [Strategy Pattern](https://banes-lab.com/records/architecture/strategy-pattern.md), [State Pattern](https://banes-lab.com/records/architecture/state-pattern.md), [Null Object Pattern](https://banes-lab.com/records/architecture/null-object-pattern.md)

Tensions
[Polymorphism / Traceability](https://banes-lab.com/records/tension/polymorphism-traceability.md)

Distinct from
[Dynamic Dispatch](https://banes-lab.com/records/architecture/dynamic-dispatch.md): Polymorphism is one interface with several implementations, while dynamic dispatch is the runtime selection of which one runs, from the receiver or a keyed table.

Distinct from
[Type Safety](https://banes-lab.com/records/architecture/type-safety.md): Polymorphism varies the implementation behind a type, while type safety rejects operations on the wrong type.

Violated by
instanceof/switch dispatch over types

Detected by
conditional type checks, duplicated branching

Measured by
polymorphic dispatch ratio

Refactored by
[Replace Conditional with Polymorphism](https://banes-lab.com/records/lexicon/replace-conditional-with-polymorphism.md)

Enforced by
[code review](https://banes-lab.com/records/architecture/code-review.md), static analysis rules

Before

```typescript
function renderFoo(kind: string, foo: Foo) {
if (kind === "text") return foo.name;
if (kind === "json") return JSON.stringify(foo);
throw new Error("unknown renderer");
}
```

After

```typescript
interface FooRenderer { render(foo: Foo): string; }
class TextFooRenderer implements FooRenderer { render(foo: Foo) { return foo.name; } }
class JsonFooRenderer implements FooRenderer { render(foo: Foo) { return JSON.stringify(foo); } }
function renderFoo(renderer: FooRenderer, foo: Foo) { return renderer.render(foo); }
```

How it is checked

Checked by
code review, static analysis rules

Population
Every interface, class hierarchy and dependency edge in the object model

Freshness
A verdict stands until an interface, an override or a dependency changes

Refusal
The dependency rule or the contract test fails a change that breaks substitution, segregation or dependency direction

Observation
Interface usage, override contracts and dependency direction, read from source and contract tests

Evidence
None, because the catalog states this check as a class, so a watched run belongs to each system that adopts it

Authoritative side
The interface contract, which every implementation and override conforms to

Depends on
[Abstraction](https://banes-lab.com/records/architecture/abstraction.md), [Substitutability](https://banes-lab.com/records/lexicon/substitutability.md), [Open/Closed Principle (OCP)](https://banes-lab.com/records/architecture/open-closed.md), [Strategy Pattern](https://banes-lab.com/records/architecture/strategy-pattern.md), [Dynamic Dispatch](https://banes-lab.com/records/architecture/dynamic-dispatch.md), [Interchangeability](https://banes-lab.com/records/architecture/interchangeability.md)

Shape it refuses
[Type Switching](https://banes-lab.com/records/lexicon/type-switching.md)

## Links to

- [principle](https://banes-lab.com/records/kind/principle.md)
- [mandatory](https://banes-lab.com/records/vocabulary/severity-mandatory.md)
- [Structural Core](https://banes-lab.com/records/layer/structural-core.md)
- [Role-Specific Interfaces](https://banes-lab.com/records/lexicon/role-specific-interfaces.md)
- [Single Responsibility Principle](https://banes-lab.com/records/architecture/single-responsibility.md)
- [Low Coupling](https://banes-lab.com/records/architecture/low-coupling.md)
- [Consumer-Specific Contracts](https://banes-lab.com/records/lexicon/consumer-specific-contracts.md)
- [Interface Proliferation](https://banes-lab.com/records/lexicon/interface-proliferation.md)
- [Fat Interface](https://banes-lab.com/records/lexicon/fat-interface.md)
- [Repository Dump](https://banes-lab.com/records/architecture/repository-dump.md)
- [Interface Segregation Principle (ISP) / Interface Proliferation](https://banes-lab.com/records/tension/interface-proliferation-interface-segregation-principle-isp.md)
- [Abstraction](https://banes-lab.com/records/architecture/abstraction.md)
- [Stable Interfaces](https://banes-lab.com/records/architecture/stable-interfaces.md)
- [Clean Architecture](https://banes-lab.com/records/architecture/clean-architecture.md)
- [Dependency Injection](https://banes-lab.com/records/architecture/dependency-injection.md)
- [Ports and Adapters](https://banes-lab.com/records/lexicon/ports-and-adapters.md)
- [Runtime Indirection](https://banes-lab.com/records/lexicon/runtime-indirection.md)
- [Concrete Dependency](https://banes-lab.com/records/lexicon/concrete-dependency.md)
- [Interface-Based Design](https://banes-lab.com/records/architecture/interface-based-design.md)
- [Testability](https://banes-lab.com/records/architecture/testability.md)
- [Replaceability](https://banes-lab.com/records/architecture/replaceability.md)
- [Inversion of Control](https://banes-lab.com/records/architecture/inversion-of-control.md)
- [Service Locator Pattern](https://banes-lab.com/records/architecture/service-locator-pattern.md)
- [Ports and Adapters Architecture](https://banes-lab.com/records/architecture/ports-and-adapters-architecture.md)
- [Dependency Inversion Principle (DIP) / Runtime Indirection](https://banes-lab.com/records/tension/dependency-inversion-principle-dip-runtime-indirection.md)
- [recommended](https://banes-lab.com/records/vocabulary/severity-recommended.md)
- [Extension Points](https://banes-lab.com/records/architecture/extension-points.md)
- [Plugin Architecture](https://banes-lab.com/records/architecture/plugin-architecture.md)
- [Strategy Pattern](https://banes-lab.com/records/architecture/strategy-pattern.md)
- [Feature Extension without Modification](https://banes-lab.com/records/lexicon/feature-extension-without-modification.md)
- [Simplicity](https://banes-lab.com/records/lexicon/simplicity.md)
- [Switch-Based Extension](https://banes-lab.com/records/lexicon/switch-based-extension.md)
- [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)
- [Extensibility Core](https://banes-lab.com/records/algorithms/extensibility-core.md)
- [Open/Closed Principle (OCP) / Simplicity](https://banes-lab.com/records/tension/open-closed-principle-ocp-simplicity.md)
- [Composability](https://banes-lab.com/records/architecture/composability.md)
- [Contract Preservation](https://banes-lab.com/records/lexicon/contract-preservation.md)
- [Preconditions](https://banes-lab.com/records/architecture/preconditions.md)
- [Postconditions](https://banes-lab.com/records/architecture/postconditions.md)
- [Invariant](https://banes-lab.com/records/architecture/invariant.md)
- [Type Safety](https://banes-lab.com/records/architecture/type-safety.md)
- [Safe Substitution](https://banes-lab.com/records/lexicon/safe-substitution.md)
- [Substitutability](https://banes-lab.com/records/lexicon/substitutability.md)
- [Narrow Specialized Behavior](https://banes-lab.com/records/lexicon/narrow-specialized-behavior.md)
- [Broken Inheritance](https://banes-lab.com/records/lexicon/broken-inheritance.md)
- [Design by Contract](https://banes-lab.com/records/architecture/design-by-contract.md)
- [Liskov Substitution Principle (LSP) / Narrow Specialized Behavior](https://banes-lab.com/records/tension/liskov-substitution-principle-lsp-narrow-specialized-behavior.md)
- [mechanism](https://banes-lab.com/records/kind/mechanism.md)
- [Open/Closed Principle](https://banes-lab.com/records/architecture/open-closed.md)
- [Interchangeability](https://banes-lab.com/records/architecture/interchangeability.md)
- [Traceability](https://banes-lab.com/records/architecture/traceability.md)
- [Type Switching](https://banes-lab.com/records/lexicon/type-switching.md)
- [Dynamic Binding](https://banes-lab.com/records/architecture/dynamic-binding.md)
- [Liskov Substitution Principle](https://banes-lab.com/records/architecture/liskov-substitution.md)
- [Null Object Pattern](https://banes-lab.com/records/architecture/null-object-pattern.md)
- [Polymorphism / Traceability](https://banes-lab.com/records/tension/polymorphism-traceability.md)
- [Replace Conditional with Polymorphism](https://banes-lab.com/records/lexicon/replace-conditional-with-polymorphism.md)
- [Code Review](https://banes-lab.com/records/architecture/code-review.md)

## Linked from

- [The layer topology](https://banes-lab.com/ontology/schema/the-layer-topology.md)
- [The membership](https://banes-lab.com/ontology/schema/the-membership.md)
