Eu acho que existem alguns fatores que ainda não foram mencionados.
Primeiro de tudo, pelo menos em "OOP puro" (por exemplo, Smalltalk), onde tudo é um objeto, você precisa mudar sua mente para uma configuração pouco natural para pensar em um número (por apenas um exemplo) como um objeto inteligente em vez de apenas um valor - já que, na realidade, 21
(por exemplo) é realmente apenas um valor. Isso se torna especialmente problemático quando, por um lado, você diz que uma grande vantagem do OOP é modelar a realidade mais de perto, mas você começa adotando o que parece muito com uma visão inspirada em LSD, mesmo das partes mais básicas e óbvias de realidade.
Segundo, a herança no POO também não segue muito de perto os modelos mentais das pessoas. Para a maioria das pessoas, classificar as coisas de maneira mais específica não tem nada perto das regras absolutas necessárias para criar uma hierarquia de classes que funcione. Em particular, criar um class D
que herda de outro class B
significa que os objetos class D
compartilham absolutamente, positivamente todas as características de class B
. class D
pode adicionar novas e diferentes características próprias, mas todas as características de class B
devem permanecer intactas.
Por outro lado, quando as pessoas classificam as coisas mentalmente, elas geralmente seguem um modelo muito mais flexível. Por exemplo, se uma pessoa faz algumas regras sobre o que constitui uma classe de objetos, é bastante típico que quase qualquer regra possa ser quebrada desde que outras regras sejam seguidas. Mesmo as poucas regras que realmente não podem ser violadas quase sempre podem ser "esticadas" um pouco.
Apenas por exemplo, considere "carro" como uma classe. É muito fácil perceber que a grande maioria do que a maioria das pessoas considera "carros" tem quatro rodas. A maioria das pessoas, no entanto, já viu (pelo menos uma foto) um carro com apenas três rodas. Alguns de nós da idade certa também se lembram de um ou dois carros de corrida do início dos anos 80 (mais ou menos) que tinham seis rodas - e assim por diante. Isso nos deixa basicamente com três opções:
- Não afirme nada sobre quantas rodas um carro possui - mas isso tende a levar à suposição implícita de que sempre será 4 e código que provavelmente quebrará para outro número.
- Afirme que todos os carros têm quatro rodas e apenas os classifique como "não carros", mesmo sabendo que eles realmente são.
- Crie a classe para permitir variação no número de rodas, apenas por precaução, mesmo que haja uma boa chance de que esse recurso nunca seja necessário, usado ou testado adequadamente.
Ensinar sobre POO geralmente se concentra na construção de enormes taxonomias - por exemplo, partes do que seria uma hierarquia gigante de toda a vida conhecida na Terra, ou algo nessa ordem. Isso levanta dois problemas: em primeiro lugar, tende a levar muitas pessoas a se concentrarem em grandes quantidades de informações que são absolutamente irrelevantes para a questão em questão. Em um ponto, vi uma discussão bastante longa sobre como modelar raças de cães e se (por exemplo) o "poodle miniatura" deve herdar do "poodle de tamanho completo", ou vice-versa, ou se deve haver uma base abstrata "Poodle "class, com" caniche em tamanho normal "e" caniche em miniatura "ambos herdados dela. O que todos pareciam ignorar era que o aplicativo deveria lidar com o controle de licenças para cães,
Segundo, e quase importante, leva a focar nas características dos itens, em vez de focar nas características importantes para a tarefa em questão. Isso leva a modelar as coisas como estão, onde (na maioria das vezes) o que é realmente necessário é construir o modelo mais simples que atenda às nossas necessidades e usar a abstração para atender às subclasses necessárias para atender à abstração que construímos.
Por fim, direi mais uma vez: estamos lentamente seguindo o mesmo caminho adotado pelos bancos de dados ao longo dos anos. Os primeiros bancos de dados seguiram o modelo hierárquico. Além de se concentrar exclusivamente em dados, essa é uma herança única. Por um curto período de tempo, alguns bancos de dados seguiram o modelo de rede - essencialmente idêntico à herança múltipla (e vistos desse ângulo, várias interfaces não são diferentes o suficiente de várias classes base para perceber ou se preocupar).
Há muito tempo, no entanto, os bancos de dados convergiam amplamente para o modelo relacional (e, embora não sejam SQL, nesse nível de abstração os bancos de dados "NoSQL" atuais também são relacionais). As vantagens do modelo relacional são suficientemente conhecidas que não vou me incomodar em repeti-las aqui. Vou apenas observar que o análogo mais próximo do modelo relacional que temos na programação é a programação genérica (e desculpe, mas, apesar do nome, os genéricos Java, por exemplo, não se qualificam realmente, embora sejam um pequeno passo no direção correta).