# Design by Contract

> A design rule that every operation states the preconditions it needs, the postconditions it guarantees and the invariants it keeps.

Record: `architecture:design-by-contract`
Kind: principle
Layer: [Contracts Core](https://banes-lab.com/records/layer/contracts-core.md)
Severity: recommended
Scope: API, function, class, service
Canonical: https://banes-lab.com/ontology#architecture-design-by-contract

Listed in [Architecture principles](https://banes-lab.com/api/records/architecture.md), after [PACELC Theorem](https://banes-lab.com/records/architecture/pacelc-theorem.md) and before [Explicit Contracts](https://banes-lab.com/records/architecture/explicit-contracts.md).

## Repair

- Refactored by: Add Preconditions, Add Postconditions, Add Invariants
- Detected by: missing assertions, missing validation, vague public APIs
- Violated by: undocumented assumptions, unchecked inputs
- Measured by: contract coverage
- Enforced by: assertions, contract tests, [static analysis](https://banes-lab.com/records/reasoning/technique-static-analysis.md)

## Requires

- [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

- [Correctness](https://banes-lab.com/records/architecture/correctness.md)
- [Predictability](https://banes-lab.com/records/architecture/predictability.md)

## Enables

- [Contract Testing](https://banes-lab.com/records/lexicon/contract-testing.md)
- [Liskov Substitution Principle (LSP)](https://banes-lab.com/records/architecture/liskov-substitution.md)

## Conflicts with

- [Implicit Behavior](https://banes-lab.com/records/lexicon/implicit-behavior.md)

## In tension with

- [Development Speed](https://banes-lab.com/records/lexicon/development-speed.md)

## Tensions

- [Design by Contract / Development Speed](https://banes-lab.com/records/tension/design-by-contract-development-speed.md)

## Contracts

- [Architectural Contract Algebra](https://banes-lab.com/records/algorithms/architectural-contract-algebra.md)
- [Contract-Based Verification Kernel](https://banes-lab.com/records/algorithms/contract-based-verification-kernel.md)

## Severity

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

## Category

- [Contracts / Interfaces / Compatibility](https://banes-lab.com/records/architecture-category/contracts-interfaces-compatibility.md)

## Linked from

- [Template families](https://banes-lab.com/pag/templates/templates-families.md)
- [A seat is a contract](https://banes-lab.com/disciplined-methodology/start/a-seat-is-a-contract.md)
- [Stating an invariant](https://banes-lab.com/disciplined-methodology/collaborate/stating-an-invariant.md)
- [From intent to predicate](https://banes-lab.com/software-architecture/coverage/an-architecture-is-its-predicate-set.md)
- [Contracts / Interfaces / Compatibility](https://banes-lab.com/ontology/principles/architecture-category-contracts-interfaces-compatibility.md)
- [Correctness / Determinism / Verification](https://banes-lab.com/ontology/principles/architecture-category-correctness-determinism-verification.md)
- [SOLID / Object-Oriented Design](https://banes-lab.com/ontology/principles/architecture-category-solid-object-oriented-design.md)
- [Error Handling / Resilience](https://banes-lab.com/ontology/principles/architecture-category-error-handling-resilience.md)
- [Contracts / Interfaces / Compatibility](https://banes-lab.com/ontology/lexicon/lexicon-category-contracts-interfaces-compatibility.md)
- [Architecture](https://banes-lab.com/ontology/algorithms/algorithms-domain-architecture.md)
- [Context verification](https://banes-lab.com/ontology/algorithms/algorithms-domain-context-verification.md)
- [Severity levels](https://banes-lab.com/ontology/schema/the-vocabulary-severity.md)
- [The resolutions](https://banes-lab.com/ontology/schema/the-resolutions.md)
