Quando preferir uma solução generalizada em vez de resolver casos específicos


18

Na programação, muitas vezes nos deparamos com uma escolha: cobrir cada caso de uso concebível individualmente ou resolver o problema geral:

XKCD - 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?


4
Por que tantos votos negativos?
Pureferret 19/08/12

3
Parece uma pergunta razoável para mim. Parece que você tem uma edição inacabada; você pode querer cuidar disso.
Stuart Marks


@gnat que está entre diferentes programas / projetos. Estou perguntando sobre o mesmo projeto / cenário.
Pureferret 19/08/12

Muito vago. Cobrir todos os casos está resolvendo o problema geral. Depois disso, é apenas uma questão de como você escreve seu código.
Caleb

Respostas:


29

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.


4
Esta é uma ótima resposta!
Pureferret 19/08/2012

E é por isso que o Agile rochas.
Euphoric


9

Como sei quando é melhor tentar cobrir uma lista finita de casos ou criar um sistema genérico para cobrir todas as possibilidades?

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.


3

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.


2

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.


2

Faça uma vez, faça duas vezes, faça três vezes, generalize.


1

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.