Eu ouvi a frase sendo lançada ao redor e para mim os argumentos parecem completamente insanos (desculpe se estou pensando aqui, não é minha intenção), geralmente isso é algo parecido com:
Você não deseja criar uma abstração antes de saber qual é o caso geral; caso contrário (1) você pode colocar coisas em suas abstrações que não pertencem ou (2) omitir coisas importantes.
(1) Para mim, isso parece que o programador não está sendo pragmático o suficiente, eles fizeram suposições de que coisas existiriam no programa final que não funcionam, então eles estão trabalhando com um nível baixo de abstração, o problema não é abstração prematura, é concreção prematura.
(2) Omitir coisas importantes é uma coisa, é perfeitamente possível que algo seja omitido das especificações que mais tarde se revelem importantes, a solução para isso não é apresentar sua própria concreção e desperdiçar recursos quando você descobrir que adivinhado errado, é para obter mais informações do cliente.
Devemos sempre trabalhar das abstrações às concreções, pois essa é a maneira mais pragmática de fazer as coisas, e não o contrário.
Se não o fizermos, corremos o risco de interpretar mal os clientes e criar coisas que precisam ser alteradas, mas se construirmos apenas as abstrações que os clientes definiram em seu próprio idioma, nunca correremos esse risco (pelo menos, nem de longe, com a probabilidade de um tiro no escuro com alguma concreção), sim, é possível que os clientes mudem de idéia sobre os detalhes, mas as abstrações que eles usavam para comunicar originalmente o que eles querem tendem a continuar válidas.
Aqui está um exemplo, digamos que um cliente deseja que você crie um robô de ensacamento de itens:
public abstract class BaggingRobot() {
private Collection<Item> items;
public abstract void bag(Item item);
}
Estamos construindo algo a partir das abstrações que o cliente usou sem entrar em mais detalhes com coisas que não sabemos. Isso é extremamente flexível, já vi isso ser chamado de "abstração prematura" quando, na realidade, seria mais prematuro assumir como a embalagem foi implementada, digamos, depois de discutir com o cliente, que eles querem que mais de um item seja ensacado de uma só vez . Para atualizar minha classe, tudo o que preciso é alterar a assinatura, mas para alguém que começou de baixo para cima, isso pode envolver uma grande revisão do sistema.
Não existe abstração prematura, apenas concretização prematura. O que há de errado com esta afirmação? Onde estão as falhas no meu raciocínio? Obrigado.