TL; DR: depende do que você está tentando resolver.
Eu tive uma conversa semelhante com meus vovôs sobre isso, enquanto conversávamos sobre como Func e Action em C # são impressionantes. My Gramps é um programador de cronômetros muito antigo, que usa códigos-fonte desde que o software foi executado em computadores que ocupavam uma sala inteira.
Ele mudou de técnico várias vezes em sua vida. Ele escreveu código em C, COBOL, Pascal, BASIC, Fortran, Smalltalk, Java e acabou iniciando o C # como um hobby. Eu aprendi a programar com ele, sentado no colo dele enquanto eu era apenas um demônio, esculpindo minhas primeiras linhas de código no editor azul do SideKick da IBM. Quando eu tinha 20 anos, eu já havia passado mais tempo codificando do que tocando lá fora.
Essas são algumas das minhas lembranças, então com licença, se eu não for exatamente prático enquanto as reconto. Eu gosto um pouco desses momentos.
Foi o que ele me disse:
"Devemos procurar a generalização de um problema ou resolvê-lo no escopo específico, você pergunta? Bem, essa é uma ... pergunta."
Vovô fez uma pausa para pensar sobre isso por um breve momento, enquanto fixa a posição de seus óculos no rosto. Ele estava jogando um jogo de combinação 3 no computador, enquanto ouvia um LP do Deep Purple em seu antigo sistema de som.
"Bem, isso dependeria de qual problema você está tentando resolver", ele me disse. "É tentador acreditar que existe uma solução única e santa para todas as opções de design, mas não existe. A arquitetura de software é como queijo, você vê."
"... Queijo, vovô?"
"Não importa o que você pensa sobre o seu favorito, sempre haverá alguém que acha que é mau cheiro".
Eu pisquei em confusão por um momento, mas antes que eu pudesse dizer qualquer coisa, o vovô continuou.
"Quando você está construindo um carro, como você escolhe o material de uma peça?"
"Eu ... acho que depende dos custos envolvidos e do que a peça deve fazer, suponho."
"Depende do problema que a parte está tentando resolver. Você não fabricará um pneu de aço ou um para-brisa de couro. Você escolhe o material que melhor resolve o problema que tem em mãos. Agora, o que é um solução genérica? Ou uma específica? Para qual problema, para qual caso de uso? Você deve seguir uma abordagem funcional completa, para dar flexibilidade máxima a um código que será usado apenas uma vez? Você deve escrever um código frágil e especializado para uma parte do seu sistema que verá muitos usos e possivelmente muitas mudanças? As escolhas de design como essas são como os materiais que você escolhe para uma peça em um carro ou a forma do tijolo Lego que você escolhe para construir uma pequena casa . Qual é o melhor tijolo de Lego? "
O programador idoso pegou um pequeno modelo de trem Lego que ele tinha em sua mesa antes de continuar.
"Você só pode responder isso se souber o que precisa desse tijolo. Como diabos você saberá se a solução específica é melhor que a genérica, ou vice-versa, se você nem sabe qual é o seu problema?" tentando resolver? Você não pode ver além de uma escolha que não entende. "
"..Você acabou de citar The Matrix? "
"O que?"
"Nada, continue."
"Bem, suponha que você esteja tentando criar algo no Sistema Nacional de Faturas. Você sabe como essa API infernal e seu arquivo XML de trinta mil linhas se parecem por dentro. Como seria uma solução 'genérica' para criar esse arquivo? como? O arquivo está cheio de parâmetros opcionais, cheio de casos que somente ramos de negócios muito específicos devem usar. Na maioria dos casos, você pode ignorá-los com segurança. Você não precisa criar um sistema de fatura genérico se a única coisa que você ' Você sempre venderá sapatos. Crie um sistema para vender sapatos e faça com que ele seja o melhor sistema de faturas vendidas por sapatos já existentes. Agora, se você tivesse que criar um sistema de faturas para qualquer tipo de cliente, em um aplicativo mais amplo - ser revendido como um sistema de vendas genérico independente,por exemplo - agora é interessante implementar as opções que são usadas apenas para gás, comida ou álcool.Agora, esses são possíveis casos de uso. Antes eles eram apenas alguns casos hipotéticos de Não use e você não deseja implementar Não use casos. Não use é o irmão mais novo de Não precisa . "
Vovô colocou o trem de lego de volta em seu lugar e voltou ao seu jogo de combinar 3.
"Portanto, para poder escolher uma solução genérica ou específica para um determinado problema, você primeiro precisa entender o que diabos é esse problema. Caso contrário, você está apenas adivinhando, e adivinhar é o trabalho dos gerentes, não dos programadores. Como quase tudo em TI, depende. "
Então, aí está. "Depende". Essa é provavelmente a expressão de duas palavras mais poderosa quando se pensa em design de software.