Por favor, considere que as necessidades de Harper para ministrar uma aula introdutória de currículo de CS são muito diferentes das necessidades de um projeto da vida real . Seu trabalho é ensinar conceitos fundamentais (por exemplo, modularidade, paralelismo, indução) a calouros. Como tal, é muito importante que a linguagem (e o paradigma) escolhidos possam expressar esses conceitos com o mínimo de cerimônia (sintática e conceitual) possível. Familiaridade, suporte de ferramentas, bibliotecas disponíveis, desempenho de execução etc. são completamente irrelevantes nesse contexto. Portanto, lembre-se disso ao considerar o seguinte ...
A visão de que OO é anti-modular resulta do grande número de dependências para outras classes, mesmo objetos de classes bem projetadas tendem a acabar. Isso é um problema - mesmo aos olhos dos defensores do OO - fica claro quando você olha para a proliferação de estruturas , artigos, livros e postagens de blog de injeção de dependência nos últimos anos (também é interessante a ascensão de zombarias e tocos).
Outra dica é a importância dos Padrões de Design e a complexidade de implementá-los - em comparação com outros paradigmas de programação - por exemplo, Fábricas, Construtor, Adaptador, Ponte, Decorador, Fachada, Comando, Iterador, Mediador, Observador, Estratégia e Método de Modelo e talvez de alguma forma, o Composite está relacionado à melhoria da modularidade do código OO.
A herança também é problemática (por exemplo , problema frágil de classe base ) e o polimorfismo (subtipo) seduz a pessoa a espalhar a implementação de um algoritmo entre várias classes, onde as mudanças podem se espalhar por toda a cadeia de herança (para cima e para baixo!).
A acusação de ser anti-paralelo está relacionada à ênfase do estado em comparação com a computação (também conhecida como mutabilidade versus imutabilidade). O primeiro envolve a expressão de dependências de subcomputações (que é a opinião de Harper sobre paralelismo!), Pois geralmente não é possível inferir a partir do local em que o estado é gerenciado (também conhecido como arquivo, onde a variável de instância é declarada) que atores externos vai mudar em que momento.
Uma ênfase na imutabilidade e computação facilita muito a expressão de dependências de subcomputações, pois não há gerenciamento de estado, apenas funções / cálculos que são combinados no local em que você deseja expressar as dependências de subcomputações.