Na programação, muitas vezes nos deparamos com uma escolha: cobrir cada caso de uso concebível individualmente ou resolver o problema geral:
É óbvio que a solução do problema imediato é mais rápida, mas a criação de uma solução generalizada economizará tempo no futuro.
Como sei quando é melhor tentar cobrir uma lista finita de casos ou criar um sistema genérico para cobrir todas as possibilidades?
algorithms
problem-solving
Pureferret
fonte
fonte
Respostas:
Primeiro, você passa o sal. Então você passa a pimenta. Então você passa o queijo parmesão ralado. Neste ponto, você tem experiência suficiente para começar a desenvolver um sistema geral de passagem de condimentos.
Funciona em projetos de software da mesma maneira: use sistemas de propósito especial que você desenvolve como etapas de aprendizado para sistemas generalizados; portanto, quando é hora de iniciar seu sistema de propósito geral, você tem uma confiança melhor no que está construindo, porque você tem vários sistemas para fins especiais em seu currículo.
fonte
Experiência.
A única maneira de saber é ter tentado um caminho antes, visto como ele é mordido na bunda (ou você perdeu um monte de tempo). Repita até ficar um pouco menos.
Mesmo assim, você realmente não sabe ; você apenas tem um palpite melhor.
fonte
Para desenvolver as respostas das dasblinkenlight e Paddy3118 , se você não tiver vários casos para implementar, não precisará generalizar! A razão pela qual o desenho animado do XKCD é engraçado é que ele abusa da generalização prematura . Ao ser solicitado a passar o sal, o personagem invisível pula imediatamente para "desenvolver um sistema para passar condimentos arbitrários" quando todo o primeiro personagem solicitado era o sal. Essa é uma boa piada para os desenvolvedores, pois acho que todos já vimos casos de generalização prematura.
O princípio oposto à generalização prematura é YAGNI (Você não vai precisar disso). Existem muitos materiais sobre isso disponíveis na Web, mas basicamente o YAGNI aponta vários riscos na generalização sem o benefício de vários casos de uso reais em mãos, incluindo a possibilidade de vários casos de uso não aparecerem. Ou, mais sutilmente, a falta de casos de uso reais exige que você faça suposições sobre o que é necessário no futuro. Essas suposições podem ser, e geralmente são, incorretas.
fonte
Parece mais fácil ser genérico no pequeno, ou seja, não crie uma classe para manipular uma tabela de pesquisa que mapeie números inteiros para strings quando você puder criar uma classe de dicionário razoável que lide com qualquer par de tipos (onde o primeiro tipo suporta algum tipo de comparação).
Em uma vida anterior, eu fiz muitos projetos de automação industrial para máquinas que lidavam com uma rede contínua de material. Aço, alumínio, papel, plástico, .... Você desenrola em uma extremidade e enrola novamente na outra depois de fazer algo útil no meio. Em um setor, você começa no "rolo de pagamento", não no "desenrolador". Se você usa a terminologia errada, é um idiota aos olhos multimilionários do cliente. Você ficaria surpreso com o quão pouco poderia ser abstraído para reutilização de um projeto para o outro. OTOH, muitas vezes é possível criar uma estrutura ou modelo como ponto de partida. Seria personalizado para o trabalho em questão, mas pelo menos tinha o benefício de aprender com projetos anteriores. E todos na equipe sabiam de onde estávamos começando.
fonte
Faça uma vez, faça duas vezes, faça três vezes, generalize.
fonte
Um, dois, muitos!
No segundo caso, você deve pensar em generalização. Ao ser solicitado o terceiro, você deve fornecê-lo a partir do código generalizado e usar o primeiro e o segundo caso previamente resolvidos individualmente como casos de teste.
fonte