Programação baseada em aulas - Class-based programming

A programação baseada em classes , ou mais comumente orientação por classes , é um estilo de programação orientada a objetos (OOP) em que a herança ocorre por meio da definição de classes de objetos , em vez da herança que ocorre apenas por meio dos objetos (compare a programação baseada em protótipo ).

O modelo mais popular e desenvolvido de OOP é um modelo baseado em classe, em vez de um modelo baseado em objeto. Nesse modelo, os objetos são entidades que combinam estado (ou seja, dados), comportamento (ou seja, procedimentos ou métodos ) e identidade (existência única entre todos os outros objetos). A estrutura e o comportamento de um objeto são definidos por uma classe , que é uma definição , ou projeto , de todos os objetos de um tipo específico. Um objeto deve ser criado explicitamente com base em uma classe e um objeto assim criado é considerado uma instância dessa classe. Um objeto é semelhante a uma estrutura , com a adição de ponteiros de método, controle de acesso de membro e um membro de dados implícito que localiza instâncias da classe (ou seja, objetos da classe) na hierarquia de classes (essencial para recursos de herança em tempo de execução).

Encapsulamento

O encapsulamento evita que os usuários quebrem as invariáveis da classe, o que é útil porque permite que a implementação de uma classe de objetos seja alterada para aspectos não expostos na interface sem impacto no código do usuário. As definições de encapsulamento enfocam o agrupamento e empacotamento de informações relacionadas ( coesão ) ao invés de questões de segurança. Linguagens OOP normalmente não oferecem restrições de segurança formais para o estado do objeto interno. Usar um método de acesso é uma questão de convenção para o design da interface.

Herança

Na programação baseada em classes, a herança é feita definindo novas classes como extensões das classes existentes: a classe existente é a classe pai e a nova classe é a classe filha . Se uma classe filha tem apenas uma classe pai, isso é conhecido como herança única , enquanto se uma classe filha pode ter mais de uma classe pai, isso é conhecido como herança múltipla . Isso organiza as classes em uma hierarquia , uma árvore (se for herança única) ou rede (se for herança múltipla).

O recurso que define a herança é que tanto a interface quanto a implementação são herdadas; se apenas a interface for herdada, isso é conhecido como herança ou subtipagem de interface . A herança também pode ser feita sem classes, como na programação baseada em protótipo .

Crítica de modelos baseados em classe

Linguagens baseadas em classes, ou, para ser mais preciso, linguagens digitadas , em que a subclasse é a única forma de subtipagem , têm sido criticadas por misturar implementações e interfaces - o princípio essencial na programação orientada a objetos. Os críticos dizem que se pode criar uma classe de bolsa que armazena uma coleção de objetos e, em seguida, estendê-la para fazer uma nova classe chamada classe de conjunto, onde a duplicação de objetos é eliminada. Agora, uma função que pega um objeto da classe bag pode esperar que a adição de dois objetos aumente o tamanho de uma bolsa em dois, mas se alguém passar um objeto de uma classe definida, adicionar dois objetos pode ou não aumentar o tamanho de um saco por dois. O problema surge precisamente porque a subclasse implica a subtipagem mesmo nos casos em que o princípio da subtipagem, conhecido como princípio de substituição de Liskov , não é válido. Barbara Liskov e Jeannette Wing formularam o princípio sucintamente em um artigo de 1994 da seguinte maneira:

Requisito do subtipo : seja uma propriedade provável sobre objetos do tipo . Então deve ser verdadeiro para objetos do tipo em que é um subtipo de .

Assim, normalmente deve-se distinguir subtipagem e subclasse. A maioria das linguagens orientadas a objetos atuais distingue subtipagem e subclasse, mas algumas abordagens de design não o fazem.

Além disso, outro exemplo comum é que um objeto pessoa criado a partir de uma classe filha não pode se tornar um objeto da classe pai porque uma classe filha e uma classe pai herdam uma classe pessoal, mas as linguagens baseadas em classe geralmente não permitem alterar o tipo de classe de o objeto em tempo de execução. Para linguagens baseadas em classe, essa restrição é essencial para preservar a visão unificada da classe para seus usuários. Os usuários não devem se preocupar se uma das implementações de um método causa mudanças que quebram as invariantes da classe. Essas mudanças podem ser feitas destruindo o objeto e construindo outro em seu lugar. O polimorfismo pode ser usado para preservar as interfaces relevantes mesmo quando essas alterações são feitas, porque os objetos são vistos como abstrações de caixa preta e acessados ​​por meio da identidade do objeto . No entanto, normalmente o valor das referências de objeto referentes ao objeto é alterado, o que causa efeitos no código do cliente.

Linguagens de exemplo

Embora Simula tenha introduzido a abstração de classe, o exemplo canônico de uma linguagem baseada em classe é Smalltalk . Outros incluem PHP , C ++ , Java , C # e Objective-C .

Veja também

Referências