# Abstraction

> A design rule that a concept is expressed by what it does for the code that uses it, and the detail of how it does it stays out of that expression.

Record: `architecture:abstraction`
Kind: principle
Layer: [Structural Core](https://banes-lab.com/records/layer/structural-core.md)
Severity: mandatory
Scope: class, module, service, system
Canonical: https://banes-lab.com/ontology#architecture-abstraction

Listed in [Architecture principles](https://banes-lab.com/api/records/architecture.md), after [Information Hiding](https://banes-lab.com/records/architecture/information-hiding.md) and before [Modularity](https://banes-lab.com/records/architecture/modularity.md).

## Repair

- Refactored by: Extract Interface, Introduce Port, Generalize Dependency
- Detected by: concrete type usage across boundaries
- Violated by: hardcoded implementation dependency, implementation leakage
- Measured by: abstraction ratio, interface stability
- Enforced by: architecture tests, dependency inversion rules

## Requires

- [Stable Semantics](https://banes-lab.com/records/lexicon/stable-semantics.md)
- [Interface Definition](https://banes-lab.com/records/lexicon/interface-definition.md)

## Reinforces

- [Dependency Inversion Principle (DIP)](https://banes-lab.com/records/architecture/dependency-inversion.md)
- [Low Coupling](https://banes-lab.com/records/architecture/low-coupling.md)
- [Portability](https://banes-lab.com/records/architecture/portability.md)

## Enables

- [Polymorphism](https://banes-lab.com/records/architecture/polymorphism.md)
- [Replaceability](https://banes-lab.com/records/architecture/replaceability.md)

## Conflicts with

- [Concrete Coupling](https://banes-lab.com/records/architecture/concrete-coupling.md)
- [Middle Man](https://banes-lab.com/records/architecture/middle-man.md)

## In tension with

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

## Tensions

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

## Severity

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

## Category

- [Core Modular Design](https://banes-lab.com/records/architecture-category/core-modular-design.md)

## Concept

- [Abstraction](https://banes-lab.com/records/reasoning/mode-abstraction.md)

## Required by

- [Dynamic Binding](https://banes-lab.com/records/architecture/dynamic-binding.md)
- [Interface-Based Design](https://banes-lab.com/records/architecture/interface-based-design.md)
- [Separation of Concerns](https://banes-lab.com/records/architecture/separation-of-concerns.md)
- [Do Not Repeat Yourself](https://banes-lab.com/records/architecture/duplicate-code.md)
- [Reusability](https://banes-lab.com/records/architecture/reusability.md)
- [Open/Closed Principle](https://banes-lab.com/records/architecture/open-closed.md)
- [Inversion of Control](https://banes-lab.com/records/architecture/inversion-of-control.md)
- [Dependency Injection](https://banes-lab.com/records/architecture/dependency-injection.md)

## Reinforced by

- [Encapsulation](https://banes-lab.com/records/architecture/encapsulation.md)

## Linked from

- [Integrating algorithms](https://banes-lab.com/pag/patterns/algorithm-integration.md)
- [Resolving a message](https://banes-lab.com/disciplined-methodology/start/resolving-a-message.md)
- [Execute the template](https://banes-lab.com/disciplined-methodology/plan/execute-the-template.md)
- [Documentation is code](https://banes-lab.com/disciplined-methodology/verify/documentation-is-code.md)
- [Architectural rules and principles](https://banes-lab.com/software-architecture/glossary/architectural-principles.md)
- [Anti-patterns](https://banes-lab.com/ontology/principles/architecture-category-anti-patterns.md)
- [Domain Architecture](https://banes-lab.com/ontology/principles/architecture-category-domain-architecture.md)
- [Runtime Discovery / Dynamic Binding](https://banes-lab.com/ontology/principles/architecture-category-runtime-discovery-dynamic-binding.md)
- [Contracts / Interfaces / Compatibility](https://banes-lab.com/ontology/principles/architecture-category-contracts-interfaces-compatibility.md)
- [Portability / Infrastructure / Deployment](https://banes-lab.com/ontology/principles/architecture-category-portability-infrastructure-deployment.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)
- [Plugin / Extensibility / IoC](https://banes-lab.com/ontology/principles/architecture-category-plugin-extensibility-ioc.md)
- [Core Modular Design](https://banes-lab.com/ontology/lexicon/lexicon-category-core-modular-design.md)
- [Quality Attributes](https://banes-lab.com/ontology/lexicon/lexicon-category-quality-attributes.md)
- [Severity levels](https://banes-lab.com/ontology/schema/the-vocabulary-severity.md)
- [The resolutions](https://banes-lab.com/ontology/schema/the-resolutions.md)
