# Design by Contract

Record: `arch: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#arch-design-by-contract

## 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/reason/technique-static-analysis.md)

## requires

- [Preconditions](https://banes-lab.com/records/arch/preconditions.md)
- [Postconditions](https://banes-lab.com/records/arch/postconditions.md)
- [Invariants](https://banes-lab.com/records/arch/invariants.md)

## reinforces

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

## enables

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

## conflicts-with

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

## tensions-with

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

## tensions

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

## referenced-by

- [Preconditions](https://banes-lab.com/records/arch/preconditions.md)
- [Correctness](https://banes-lab.com/records/arch/correctness.md)
