Na engenharia de software, existem dois conceitos complementares que permitem ao projetista especificar procedimentos e dados, suprimindo ou revelando, respectivamente, os detalhes de baixo nível. São eles:
granularidade e coesão;
coesão e modularidade;
abstração e refinamento;
acoplamento e modularidade;
modularidade e abstração.