Muitas vezes me vejo abraçando "agora é melhor do que nunca" quando estou avançando no DRYness de um design. Normalmente, acho que preciso cultivar uma compreensão do Local Autoritário Único para um pedaço de conhecimento no contexto de um sistema de outros pedaços de conhecimento. Assim, tendo a projetar o sistema 'agora'.
Por outro lado, essa prática me leva a construir com bastante antecedência, apesar de uma chance razoável de que não vou precisar.
Como esses dois padrões se encaixam?
Quais práticas você usa para garantir que elas sejam boas?
Como você os ensina juntos sem criar confusão?
design-patterns
language-agnostic
philosophy
Justin Myles Holmes
fonte
fonte
Respostas:
Eu tento pensar muito à frente também, mas geralmente não no código. Faço um brainstorming e tomo notas, espero organizando as coisas bem o suficiente para que eu possa me referir a elas.
Eu me inclino mais para "você não vai precisar" com relação ao código, mas "agora é melhor do que nunca" com o design.
Ao começar a construir um novo sistema, é tentador querer construir tudo agora, mas também pode minar seu ímpeto e moral. Costumo pensar no design geral e tentar traçar uma linha direta através dele - criar uma arquitetura esquelética de ponta a ponta e construir essa primeira, aplicando princípios de design sólidos para que eu possa evoluí-la mais tarde e refatorá-la para trazer em novos recursos.
Crie a representação de ponta a ponta mais simples do sistema que possa funcionar; faça isso primeiro, e então você terá algo para refletir. Isso tende a ajudar a cristalizar todas as vagas perguntas do tipo "e se" e a ajudar a definir o que você precisa construir a seguir.
fonte
YAGNI significa que as coisas são feitas quando precisam ser feitas e não antes. Isso não significa que eles nunca terminem, a menos que nunca sejam necessários. Isso significa que você só faz o que dá ao cliente valor comercial imediato . O que significa valor comercial imediato é subjetivo a todo cliente e todo projeto.
Em ambos os casos, você não pode perder nada com o YAGNI.
No outro caso, você perde tempo escrevendo código que nunca é usado e escrevendo testes para código que nunca é usado, e escrevendo documentação para código que nunca é usado e manutenção de código que nunca é usado, as pessoas se perguntando o que esse código faz. e, se alguma vez for usado, ad nauseum.
Exemplo
Se estou trabalhando em um protótipo / prova de conceito ou na versão 1.0 de um aplicativo, não preciso de um design para dimensionar o nível do Facebook. Inferno, não preciso de um design para escalar para o nível do Facebook, até começar a ver que tenho esse tipo de tráfego.
Você acha que Zuckerberg projetou a primeira versão do Facebook para atingir 500 milhões de usuários? Não, ele o projetou e construiu para fazer apenas o necessário e não mais. Se ele tivesse tentado alterar o design para 500 milhões de usuários desde o primeiro dia, o Facebook provavelmente nunca teria sido lançado.
A maneira prática de fazer as coisas é como ele fez isso. Ele começou com PHP e MySQL, e redesenhou e reescreveu, conforme necessário, com base no valor comercial , escalar para milhões de usuários era de enorme valor comercial, mas não no dia 0. No dia 0, apenas o lançamento de algo era um tremendo valor comercial.
Ele planejou redesenhar e reescrever. O que é uma mentalidade diferente do que o planejado para a pia da cozinha e nunca realmente desenvolve ou entrega algo útil que esteja completo.
Planejar no final da vida útil de uma base de código e reescrever é uma solução ágil e futura. Tentar chegar a um objetivo indefinido de "flexível" acaba sempre em fracasso. Você está projetando sem nenhuma necessidade e desperdiçando tempo, poderia estar desenvolvendo o que é de valor comercial, em vez de sonhar com recursos que nunca serão usados.
fonte
A maneira Zen do Python diz:
A idéia é que não é porque você pode definir algo agora que deveria. Você precisa agora?
Os casos em que isso é menos óbvio são em casos de refatoração. Devo aplicar DRY toda vez que posso? A resposta não é clara porque há momentos em que a aplicação de DRY custa mais (no tempo gasto) do que a duplicação. No entanto, a longo prazo, aplicar DRY até que você tenha razões técnicas / de desempenho nem sempre é bom.
Então, YAGNI até você, então faça-o agora. Não espere!
fonte
Eu não acho que eles tocam juntos. Eu acho que você se inclina de um jeito ou de outro. E eu me inclino para YAGNI.
Mas, pelo que vale, não concordo com a segunda proposta: "Agora é melhor do que nunca". Se um requisito é importante, terá que ser realizado. Então "nunca" não é uma possibilidade. Se não é importante, então "agora" não é melhor - "nunca" é melhor.
Apenas meus dois centavos.
fonte
Eles são ortogonais e não têm nada a ver um com o outro.
Hum. Os dois? O que mais pode haver?
YAGNI descreve os recursos como vistos pelos usuários. Você não precisa de fantasia.
Agora é melhor do que nunca descreve o processo. Escreva testes agora. Escreva o código agora. Não perca o tempo pensando em alternativas de design. Construa algo em vez de falar sobre construir algo.
fonte
Se "nunca" é a implicação de "agora não", seu design é defeituoso.
As decisões locais que você toma devem ser transparentes para o resto de um sistema.
Por exemplo, se você tiver um componente
CookieSource
que exijaCookieFactory
aCookieRecipes
conversãoCookies
, com base em alguns parâmetros de entrada,CookieSource
não precisa e, portanto, não deve depender de comoCookieFactory
é implementado e comoCookieRecipes
é representado.Se o
CookieFactory
é de fato umBakery
, isso pode levar a umRecipe
acordoPastry
, não importa. E, a menos que você precise dessa funcionalidade, não há necessidade de implementá-la. E não há nenhuma razão no mundo para que você não possa adicioná-lo posteriormente, exceto se não houver uma barreira clara de abstração entreCookieSource
e os serviços que ele usa.Ao criar um software, adicione funcionalidade conforme necessário e tente não se prender a nenhuma decisão tomada. Em vez disso, bloqueie a decisão em uma abstração adequada .
fonte
A solução mais simples que encontrei é esperar alterações ao escrever código antecipadamente. Quando estou passando algum bool para uma função, normalmente o altero o mais rápido possível para um sinalizador / enumerações, para que fique a) mais legível eb) fácil de estender. Da mesma forma, se eu perceber que estou passando vários parâmetros em torno de onde cheira como se eu precisasse de mais um, normalmente crio uma estrutura especial. A esperança é que YAGNI, mas se você o fizer em algum momento, ele não quebrará todos os usuários de maneira horrível imediatamente e o "trabalho pesado" já está feito. Freqüentemente, você também pode adicionar algum comentário como / * adições futuras podem ser acessadas aqui * / ou então é claro que ainda não foi implementado, mas aqui é o lugar para adicioná-lo. Isso geralmente ajuda mais, pois achei que a refatoração de interface mais tarde consumia mais tempo.
fonte
Projete com futuras extensões em mente, mas não as implemente até que você precise delas.
O exemplo que vem à mente é que, quando o Netflix foi iniciado, você só podia ter uma fila associada a cada conta. Mais tarde, eles invadiram o suporte para várias filas. Como não foi projetado dessa maneira desde o início, tornou-se cada vez mais difícil de manter, então eles decidiram interromper esse recurso. Depois de um tumulto do cliente, eles morderam a bala e fizeram um redesenho para integrar corretamente várias filas.
Se alguém no início tivesse permitido a possibilidade de querer várias filas mais tarde, poderia ter poupado muita dor de longo prazo por muito pouco esforço adicional de curto prazo. Eles não precisaram realmente implementar várias filas imediatamente, apenas certifique-se de que, se alguma vez o fizessem, não seria necessário uma reescrita maciça ou um hack impossível de manter.
Aparentemente, parece que seria necessário uma habilidade parecida com o adivinho para prever requisitos futuros, mas, na prática, coisas desse tipo tendem a se destacar em um bom programador quando ele percebe que está codificando alguma coisa ou que uma tabela de banco de dados está coletando muitas colunas apenas vagamente relacionadas.
fonte