Assunto abordado por Staa (2000), a escolha de abstracoes corretas requer um bom planejamento da construcao do codigo para que ele fique de forma mais simples possivel e atenda aos requisitos necessarios. Muitas vezes poderia ter sido criado um numero menor de classes que o numero implementado, e o aplicativo ficou mais complexo do que deveria. Um dos beneficios da escolha das abstracoes corretas e diminuir a complexidade na medida do possivel.Para diminuir a complexidade do codigo, e necessario realizar esse planejamento para verificar quais classes realmente deverao ser criadas. Pode, muitas vezes, ser interessante, criar classes que implementem varios objetos ao inves de classes que implementem um unico objeto pois, isso evita a criacao de varias classes que poderiam ser uma so.Durante esse planejamento do sistema por meio do projeto de sua arquitetura ou mesmo durante a construcao de um simples diagrama UML, os engenheiros de software e desenvolvedores devem se atentar para as classes planejadas que nao serao necessarias ou que poderiam ter suas funcoes encaixadas em outras classes. Eles devem se atentar tambem para os relacionamentos entre as classes e como devem ser implementados esses relacionamentos para que o programa fique menos complexo possivel. Eles devem verificar ainda quais os metodos serao implementados em cada classe para que nao haja duplicidade de codigo.Ainda durante o planejamento, qualquer estrutura planejada para trabalhar como um componente do aplicativo que possuir um nome (substantivo) sera uma classe. Os procedimentos realizados por essas classes e nomeados com verbos serao suas funcoes. As propriedades de cada um desses componentes que sejam nomeadas com adjetivos ou substantivos serao seus atributos.Abstracao e o ato de conhecer o que um codigo faz e nao como ele faz. Abstrair depende do objetivo da abstracao. Por exemplo, uma pessoa na perspectiva de um medico e diferente de uma pessoa na perspectiva de um Analista de Sistemas. Essas duas pessoas possuem caracteristicas diferentes. As abstracoes possiveis das construcoes de um programa podem ser realizadas por meio de: Funcao: conjunto de comandos que realiza algum tipo de operacao, retorna um valor e pode causar efeito colateral. Procedimento: conjunto de declaracoes e comandos que sempre vao causar algum efeito colateral. Abstracao de dados: estrutura com representacao encapsulada que torna conhecidas somente as suas operacoes. Tipo Abstrato de Dados: tipo com representacao encapsulada que torna conhecidas somente as suas operacoes. Tipo Abstrato de dados parametrizado: tipo com representacao parametrizada e encapsulada que torna conhecidas somente as suas operacoes.Funcoes e procedimentos devem ser implementados como metodos de classes. Abstracao de dados e tipos abstratos de dados sao implementados como classes e tipos abstratos parametrizados sao realizados por classes genericas. Assim, encontrar as abstracoes corretas equivale a identificar as abstracoes de dados e os tipos abstratos de dados necessarios a implementacao da aplicacao. Resumindo, para escolher corretamente as abstracoes e necessario conhecer cada uma das abstracoes possiveis, conforme a lista mostrada e verificar em cada caso, qual delas se aplica a construcao de uma estrutura especifica.Referencia:STAA, A.D. Programacao Modular: Desenvolvendo Programas Complexos de Forma Organizada e Segura. 1. ed. MA: Rio de Janeiro: Campus, 2000.