O desenvolvimento de software é extremamente amplo. Nesse mercado, existem diversas linguagens de programação, que seguem diferentes paradigmas. Um desses paradigmas é a Orientação a Objetos, que atualmente é o mais difundido entre todos. Isso acontece porque se trata de um padrão que tem evoluído muito, principalmente em questões voltadas para segurança e reaproveitamento de código, o que é muito importante no desenvolvimento de qualquer aplicação moderna.
A imagem a seguir apresenta as diferenças entre Programação Estruturada e Programação Orientada a Objetos:
Importante ressaltar que o Primitivismo - a crença na superioridade do estilo de vida simples - é desejável na Orientação a Objetos.
Abstração
A abstração consiste em um dos pontos mais importantes dentro de qualquer linguagem Orientada a Objetos. Como estamos lidando com uma representação de um objeto real, temos que imaginar o que esse objeto irá realizar dentro de nosso sistema. São três pontos que devem ser levados em consideração nessa abstração:
Identidade
Identidade é o que especifica um objeto (que representa algo no mundo real) de maneira única. Fazendo uma analogia ao mundo real, o CPF pode ser uma identidade de uma classe chamada pessoa.
Propriedades
Como sabemos, no mundo real qualquer objeto possui elementos que o definem. Dentro da programação orientada a objetos, essas características são nomeadas propriedades. Por exemplo, as propriedades de um objeto “Cachorro” poderiam ser “Tamanho”, “Raça” e “Idade”, por exemplo.
Métodos
Os métodos representam as ações realizadas pelos objetos. Esses métodos podem ser extremamente variáveis, desde “Acender()” em um objeto lâmpada até “Latir()” em um objeto cachorro.
Encapsulamento
O encapsulamento é uma das principais técnicas que define a programação orientada a objetos. Se trata de um dos elementos que adicionam segurança à aplicação em uma programação orientada a objetos pelo fato de esconder as propriedades, criando uma espécie de caixa preta.
A maior parte das linguagens orientadas a objetos implementam o encapsulamento baseado em propriedades privadas, ligadas a métodos especiais chamados getters e setters, que irão retornar e setar o valor da propriedade, respectivamente. Essa atitude evita o acesso direto a propriedade do objeto, adicionando uma outra camada de segurança à aplicação.
Para fazermos um paralelo com o que vemos no mundo real, temos o encapsulamento em outros elementos. Por exemplo, quando clicamos no botão ligar da televisão, não sabemos o que está acontecendo internamente. Podemos então dizer que os métodos que ligam a televisão estão encapsulados.
Herança
Classificação de Classes de Sistema
Existem, basicamente, 3 tipos de classes:
classes de fronteira
classes de controle
classes de entidade.
Classes de fronteira (View)
As classes de fronteira, são aquelas que representam a interface entre os atores e o sistema. É através das classes de fronteira que os atores se comunicam com o sistema, por exemplo, se você estiver utilizando Java, uma janela representada por uma classe de fronteira do tipo javax.swing.JFrame. (Provavelmente, uma classe do tipo JFrame será uma classe de projeto e não de análise ou conceitual).
Classes de controle (Controller)
O objetivo das classes de controle são fazer o "meio de campo" entre as classes de fronteira e as classes de entidade. As classes de controle, como o próprio nome sugere, controlam os fluxos resultantes das entradas dos atores e das respostas do sistema.
Classes de entidade (Model)
As classes de entidade, representam o negócio da aplicação. São nessas classes que as regras de negócio são executadas de fato.
Em síntese: os atores utilizam as classes de fronteira para se comunicar com o sistema; as classes de fronteira acionam as classes de controle que decide para que classe de entidade devem ser delegadas as entradas dos atores; as classes de entidade processam a lógica de negócio referente às entradas e retorna para que as classes de controle decidam que classe fronteira irá apresentar a resposta ao usuário.
Por fim, só um detalhe que eu percebi ao estudar essa classificação: os tipos de classe se parecem bastante com as camadas do modelo ou padrão MVC (Model-View-Controller), onde a camada Model é equivalente ao tipo de classe de entidade, a camada View é equivalente ao tipo de classe de fronteira e a camada Controller equivale ao tipo de classe de controle.
Fontes:
https://pt.wikipedia.org/wiki/Primitivismo
http://www.devmedia.com.br/os-4-pilares-da-programacao-orientada-a-objetos/9264
http://compiladorvirtual.blogspot.com.br/2012/11/classificacao-de-classes-de-sistema.html