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: