Como posso promover o uso do padrão Builder em minha equipe?


22

Nossa base de código é antiga e novos programadores, como eu, aprendem rapidamente a fazê-lo da maneira que é feita em prol da uniformidade. Pensando que precisamos começar em algum lugar, decidi refatorar uma classe de detentores de dados como tal:

  • Removemos os métodos setter e criamos todos os campos final(entendo " finalé bom" axiomaticamente). Os setters foram usados ​​apenas no construtor, como se vê, então isso não teve efeitos colaterais.
  • Introduziu uma classe Builder

A classe Builder era necessária porque o construtor (que é o que levou à refatoração em primeiro lugar) abrange cerca de três linhas de código. Tem muitos parâmetros.

Por sorte, um colega de equipe meu estava trabalhando em outro módulo e precisou dos levantadores, porque os valores que ele exigiu ficaram disponíveis em diferentes pontos do fluxo. Assim, o código ficou assim:

public void foo(Bar bar){
    //do stuff
    bar.setA(stuff);
    //do more stuff
    bar.setB(moreStuff);
}

Argumentei que ele deveria usar o construtor em vez disso, porque livrar-se dos levantadores permite que os campos permaneçam imutáveis ​​(eles já me ouviram falar sobre imutabilidade antes) e também porque os construtores permitem que a criação de objetos seja transacional. Esbocei o seguinte pseudocódigo:

public void foo(Bar bar){
    try{
        bar.setA(a);
        //enter exception-throwing stuff
        bar.setB(b);
    }catch(){}
}

Se essa exceção for acionada, barhaverá dados corrompidos, o que teria sido evitado com um construtor:

public Bar foo(){
        Builder builder=new Builder();
    try{
        builder.setA(a);
        //dangerous stuff;
        builder.setB(b);
        //more dangerous stuff
        builder.setC(c);
        return builder.build();
    }catch(){}
    return null;
}

Meus colegas de equipe replicaram que a exceção em questão nunca será acionada, o que é justo o suficiente para essa área específica de código, mas acredito que esteja faltando a floresta para a árvore.

O compromisso foi reverter para a solução antiga, ou seja, usar um construtor sem parâmetros e definir tudo com os configuradores, conforme necessário. A lógica era que essa solução segue o princípio do KISS, que a minha viola.

Sou novo nesta empresa (há menos de 6 meses) e tenho plena consciência de que perdi esta. As perguntas que tenho são:

  • Existe outro argumento para o uso de construtores em vez da "maneira antiga"?
  • A mudança que proponho vale mesmo a pena?

mas realmente,

  • Você tem alguma dica para apresentar melhor esses argumentos ao defender algo novo?

6
O Construtor precisará definir valores de alguma forma. Portanto, não resolve o problema básico.
Amy Blankenship

3
Por que motivo as coisas (mais perigosas / lançadoras de exceções) não podem ser movidas antes da ligação setA?
precisa

2
Apenas 3 linhas de parâmetros do construtor? Isso não é tão ruim assim.
Pjc50

7
Em qualquer projeto de software, sempre há trocas entre complexidade e desacoplamento. Embora eu ache que concordo pessoalmente com você que o construtor é uma boa solução aqui, seu colega de trabalho tem razão em hesitar com base no KISS. Eu mantenho um software que é incrivelmente complicado demais, e parte do motivo é que todo novo contratado fica desonesto e diz: "Isso é estúpido, vou fazer essa coisa nova do meu jeito", portanto, temos 5 estruturas para agendamento trabalhos em segundo plano e 8 métodos para consultar um banco de dados. Tudo é bom com moderação e não há uma resposta correta e clara em casos como este.
Brandon

3
O KISS é um conceito difuso, objetos modificáveis ​​são uma fonte de complexidade enormemente subestimada pelos desenvolvedores, eles fazem multi-threading, depuração e exceções lidando com muito mais dificuldade do que o imutável. O objeto é válido ou uma exceção é criada na construção (qual o melhor local para capturar essa exceção?).
Alessandro Teruzzi 06/04

Respostas:


46

Pensando que temos que começar em algum lugar, decidi refatorar uma classe de suporte de dados

Foi aí que deu errado - você fez uma grande alteração na arquitetura da base de código, de forma que ela se tornou muito diferente do esperado. Você surpreendeu seus colegas. Surpresa só é boa se envolver uma festa, o princípio da menor surpresa é ouro (mesmo que envolva festas, então eu saberia usar cueca limpa!)

Agora, se você achava que essa mudança valia a pena, seria muito melhor esboçar o pseudocódigo que mostrava a mudança e apresentá-la aos seus colegas (ou pelo menos quem tem o papel mais próximo do arquiteto) e ver o que eles pensavam antes de fazer qualquer coisa. Do jeito que está, você ficou desonesto, pensou que toda a base de código era sua para você brincar como quisesse. Um jogador da equipe, não um jogador da equipe!

Eu posso estar sendo um pouco duro com você, mas eu estive no lugar oposto: verifique um código e pense "WTF aconteceu aqui ?!", apenas para encontrar o novo cara (quase sempre o novo cara) decidiu mudar um monte de coisas baseadas no que ele acha que o "caminho certo" deveria ser. Parafusos também com a história do SCM, que é outro grande problema.


7
"Surpresa só é boa se envolver uma festa", isso não é verdade para todos !! Eu parar de falar a qualquer chamado amigo que me jogou uma surpresa nada , especialmente um partido . Com pessoas . Ugh.
precisa saber é o seguinte

3
Portanto, se todos os padrões de refatoração e design ou todas as decisões como "Eu uso o acessador e o mutador aqui ou o padrão do construtor?" precisa ser aprovado por uma equipe, como os desenvolvedores se sentirão capacitados para fazer a coisa certa? Como você fará mudanças no futuro se tudo tiver que ser planejado por um comitê. Eu já estive no lugar do OP antes, onde estou preso tendo que manter um código sem sentido (como o novo cara) que todo mundo estava com medo de mudar porque é consistente . A consistência é boa e tudo, mas não à custa da melhoria.
Brandon

11
@Brandon não, mas todas as mudanças abrangentes que os afetarão devem. Se você precisar corrigir um bug, é apenas mais um pedaço de código - não é grande coisa. Se você tomar uma decisão que afeta todos os outros, é pelo menos educado dizer a eles o que você está fazendo. Você pode obter um acordo da equipe para alterar seu código insensato e, em seguida, suas alterações se tornam a nova consistência. Você só precisa conversar com seus colegas. Não há nada de ruim sobre dizendo: "Eu vou mudar o padrão de assessor de baixa qualidade que todos nós ódio" e ouvir seus colegas responder com "sim, é hora de alguém tratado que"
gbjbaanb

13
@Brandon, há um ditado: "O caminho para o inferno é pavimentado com boas intenções". Consistência não é apenas boa , é necessária ! Imagine tentar gerenciar uma equipe de desenvolvedores que gerenciam coletivamente 20 aplicativos, cada um deles escrito em um estilo e / ou arquitetura diferente, porque preferências, tecnologia atual, tendências etc. ditaram o que era melhor na época. Fazer com que a equipe concorde que algo deve mudar pode ser a diferença entre o novo cara ser aceito porque eles resolveram um problema de longa data e serem demitidos por deixarem de lado o que você achou melhor.
precisa saber é o seguinte

3
@Brandon - Se você for desonesto e consertar algo "que todo mundo concorda que está errado", provavelmente terá mais sucesso escolhendo algo que "todo mundo concorda que está errado" em vez de escolher algo que, na melhor das hipóteses, tem campos diferentes tópico, como imutabilidade. Um bom design / arquitetura faz da imutabilidade um alto custo, praticamente sem recompensa. Portanto, a menos que sua equipe esteja tendo problemas porque está usando setters, você não está solucionando um problema. OTOH, se isso tem sido uma fonte de erros frequentes, parece que as ramificações justificam uma decisão da equipe.
Húmido

21

Por sorte, um colega de equipe meu estava trabalhando em outro módulo e precisou dos levantadores, porque os valores que ele exigiu ficaram disponíveis em diferentes pontos do fluxo.

Conforme descrito, não vejo o que faz o código exigir setters. Provavelmente não sei o suficiente sobre o caso de uso, mas por que não esperar até que todos os parâmetros sejam conhecidos antes de instanciar o objeto?

Como alternativa, se a situação exigir setters: ofereça uma maneira de congelar seu código para que os setters gerem um erro de asserção (também conhecido como erro de programador) se você tentar modificar os campos depois que o objeto estiver pronto.

Eu acho que remover os levantadores e usar final é a maneira "correta" de fazê-lo, além de reforçar a imutabilidade, mas é realmente com o que você deveria gastar seu tempo?

Dicas gerais

Velho = ruim, novo = bom, do meu jeito, do seu jeito ... esse tipo de discussão não é construtivo.

Atualmente, a maneira como seu objeto é usado segue alguma regra implícita. Isso faz parte da especificação não escrita do seu código e sua equipe pode pensar que não há muito risco de outras partes do código utilizá-lo incorretamente. O que você deseja fazer aqui é tornar a regra mais explícita com um Construtor e verificações em tempo de compilação.

De alguma forma, a refatoração de código está ligada à teoria Broken Window : você acha certo corrigir qualquer problema como o vê (ou anote algumas reuniões posteriores de "melhoria da qualidade") para que o código sempre pareça agradável de se trabalhar, é seguro e limpo. Você e sua equipe não têm a mesma idéia sobre o que é "bom o suficiente". O que você vê como uma oportunidade de contribuir e melhorar o código, com boa fé, provavelmente é visto de maneira diferente da equipe existente.

A propósito, não se deve presumir que sua equipe esteja necessariamente sofrendo de inércia, maus hábitos, falta de educação, ... o pior que você pode fazer é projetar uma imagem de um sabe-tudo que existe para mostrar a eles como codificar. Por exemplo, imutabilidade não é algo novo , provavelmente seus colegas já leram sobre isso, mas apenas porque esse assunto está se tornando popular em blogs não é suficiente para convencê-los a gastar tempo alterando seu código.

Afinal, existem inúmeras maneiras de melhorar uma base de código existente, mas custa tempo e dinheiro. Eu poderia olhar para o seu código, chamá-lo de "antigo" e encontrar coisas para detalhar. Por exemplo: nenhuma especificação formal, afirmações insuficientes, talvez comentários ou testes insuficientes, cobertura de código insuficiente, algoritmo não ideal, uso excessivo de memória, não uso do "melhor" padrão de design possível em cada caso, etc. ad nauseam . Mas para a maioria dos pontos que eu gostaria de mencionar, você pensaria: tudo bem, meu código funciona, não há necessidade de gastar mais tempo nele.

Talvez sua equipe pense que o que você sugere já passou do ponto de diminuir os retornos. Mesmo se você tivesse encontrado uma instância real de um bug devido ao tipo de exemplo que você mostra (com exceção), eles provavelmente apenas o corrigiam uma vez e não queriam refatorar o código.

Então a pergunta é sobre como gastar seu tempo e energia, considerando que eles são limitados ? Existem mudanças contínuas no software, mas geralmente sua ideia começa com uma pontuação negativa até que você possa fornecer bons argumentos. Mesmo se você estiver certo sobre o benefício, não é um argumento suficiente por si só, porque ele terminará na cesta "É bom ter um dia ... ".

Quando você apresenta seus argumentos, precisa fazer algumas verificações de "sanidade": você está tentando vender a ideia ou a si mesmo? E se alguém a apresentasse à equipe? Você encontraria algumas falhas em seu raciocínio? Você está tentando aplicar algumas práticas recomendadas gerais ou levou em consideração as especificidades do seu código?

Então, lembre-se de não aparecer como se estivesse tentando consertar os "erros" anteriores do seu time. Isso ajuda a mostrar que você não é sua ideia, mas pode receber feedback razoavelmente. Quanto mais você fizer isso, mais suas sugestões terão a oportunidade de serem seguidas.


Você está absolutamente certo. Uma pequena objeção: não é o "caminho antigo" vs "o meu novo e super impressionante caminho". Estou plenamente consciente de que posso estar falando bobagem. Meu problema é que, continuando a usar práticas de software que todos na empresa acham horríveis, eu posso estagnar como desenvolvedor. Por isso, tento introduzir algumas mudanças, mesmo que eu esteja errado. (A tarefa foi desencadeada por um pedido para refatorar uma classe relacionada)
Rath

@rath Não há novas bases de código sendo desenvolvidas?
biziclop

@biziclop Existem novos módulos sendo conectados à antiga base de código. Eu trabalhei em um recentemente. Dias felizes.
Rath

5
@rath Talvez você precise de um projeto pessoal no qual possa trabalhar no seu próprio tempo, onde possa avançar no seu próprio desenvolvimento? Também não estou convencido pelo seu argumento de padrão "Construtor"; os getters / setters parecem ser uma solução perfeitamente OK com base nas informações que você forneceu. Lembre-se de que você é responsável perante seu empregador e sua equipe; sua prioridade é garantir que qualquer trabalho que você faça beneficie aqueles a quem você é responsável.
precisa

@ath Bem, mesmo se você não estiver em um código "antigo / novo", o que importa é como ele é percebido pelo destinatário, especialmente se eles tiverem mais poder de decisão que você. Parece que você deseja introduzir mudanças para seu próprio interesse e não para o produto que você desenvolve. Se todos na empresa acharem a prática horrível, ela acabará mudando, mas isso não parece ser uma prioridade.
Coredump #

17

Como posso promover o uso do padrão Builder em minha equipe?

Você não

Se o seu construtor tiver 3 linhas de parâmetros, é muito grande e muito complexo. Nenhum padrão de design corrigirá isso.

Se você possui uma classe cujos dados são disponibilizados em momentos diferentes, devem ser dois objetos diferentes ou seu consumidor deve agregar os componentes e depois construir o objeto. Eles não precisam de um construtor para fazer isso.


É um grande detentor de dados de se Stringoutros primitivos. Não há lógica em lugar algum, nem mesmo verifica se há nulletc. Portanto, é apenas o tamanho, não a complexidade em si. Eu pensei que fazer algo assim builder.addA(a).addB(b); /*...*/ return builder.addC(c).build();seria muito mais fácil para os olhos.
Rath 06/04

8
@ath: É um grande detentor de dados de Strings e outras primitivas. => Então você tem outros problemas, espero que há-se importa se o acidental campo de e-mail é atribuído com endereço postal do cara ...
Matthieu M.

@MatthieuM. Um problema de cada vez Suponho :)
Rath

@rath - Parece que a incorporação de um bom esquema de verificação de validação teria sido muito mais útil e mais facilmente recebida do que tentar descobrir como desorganizar o padrão do construtor no código já existente. Em outro lugar, você disse que quer melhorar a si mesmo. Aprender a obter o máximo ganho com o mínimo de esforço e conseqüências é definitivamente um atributo que deve ser desenvolvido.
Dunk6

1
Eu tenho muuuuito muitos construtores com muito mais parâmetros do que isso. Necessário nos padrões de IoC. Má generalização nesta resposta.
djechlin

16

Você parece mais focado em estar certo do que em trabalhar bem com os outros. Pior ainda, você reconhece que o que está fazendo é uma luta pelo poder e, no entanto, deixa de pensar em como as coisas se sentirão para as pessoas cuja experiência e autoridade você está desafiando.

Inverta isso.

Concentre-se em trabalhar com outras pessoas. Enquadre seus pensamentos como sugestões e idéias. Faça com que ELES conversem sobre SUAS idéias antes de fazer perguntas para fazê-los pensar sobre a sua. Evite confrontos diretos e aceite externamente que continuar fazendo as coisas da maneira que o grupo (por enquanto) é mais produtivo do que travar uma batalha árdua para mudar o grupo. (Embora traga as coisas de volta.) Faça com que seja um prazer trabalhar com você.

Faça isso de forma consistente e você deverá criar menos conflitos e encontrar mais idéias adotadas por outras pessoas. Todos sofremos da ilusão de que o argumento lógico perfeito irá impressionar os outros e vencer o dia. E se não funcionar dessa maneira, achamos que deveria .

Mas isso está em conflito direto com a realidade. A maioria dos argumentos é perdida antes que o primeiro argumento lógico seja apresentado. Mesmo entre pessoas supostamente lógicas, a psicologia supera a razão. Convencer as pessoas é superar as barreiras psicológicas para ser ouvido adequadamente, e não ter uma lógica perfeita.


2
Frame your thoughts as suggestions and ideas. Get THEM to talk through THEIR ideas before asking questions to make them think about yours+1 para isso, no entanto
rath 06/04

2
@rath Lembre-se de que outras pessoas podem não estar lendo seu livro. É possível que a pessoa com quem você está discutindo a considere um confronto, o que pode ser contraproducente aos seus objetivos.
Iker

2
@ath: Não há certo ou errado. Apenas troque. E, na maioria das vezes, as compensações envolvem mais do que apenas o código.
Marjan Venema

1
@ Dunker Tudo o que existe são compensações. Nós os chamamos de certos ou errados quando as trocas são claras e obviamente de um lado. No entanto, reconhecer quando isso se torna ambíguo é mais fácil se focarmos nelas como compensações desde o início.
btilly

2
Não há uma única "prática recomendada" de programação que eu saiba que não tenha exceções onde não é a melhor. Às vezes é difícil encontrar essas exceções, mas elas sempre existem.
btilly

11

Existe outro argumento para o uso de construtores em vez da "maneira antiga"?

"Quando você tem um novo martelo, tudo parecerá um prego". - foi o que pensei quando li sua pergunta.

Se eu fosse seu colega, perguntaria "por que não inicializar o objeto inteiro no construtor?" Afinal, é isso que é a funcionalidade. Por que usar o padrão do construtor (ou qualquer outro design)?

A mudança que proponho vale mesmo a pena?

É difícil distinguir desse pequeno trecho de código. Talvez seja - você e seus colegas precisam avaliar.

Você tem alguma dica para apresentar melhor esses argumentos ao defender algo novo?

Sim, aprenda mais sobre o tópico antes de discuti-lo. Arme-se com bons argumentos e razões antes de entrar na discussão.


7

Eu estive na situação em que fui recrutado por minhas habilidades. Quando cheguei a ver o código, bem ... era mais do que horrível. Ao tentar limpá-lo, alguém que está lá por mais tempo sempre suprime as alterações, porque não vê os benefícios. Parece algo que você está descrevendo. Acabou comigo deixando essa posição e agora posso evoluir muito melhor em uma empresa que tem uma prática melhor.

Eu não acho que você deva apenas atuar junto com os outros membros da equipe porque eles estão lá há mais tempo. Se você vir os membros de sua equipe usando práticas inadequadas nos projetos em que trabalha, é uma responsabilidade que você precise apontar como está. Caso contrário, você não é um recurso muito valioso. Se você apontar essas coisas repetidamente, mas ninguém estiver ouvindo, peça à gerência uma substituição ou troca de trabalho. É muito importante que você não se adapte às práticas ruins.

Para a pergunta real

Por que usar objetos imutáveis? Porque você sabe com o que está lidando.

Digamos que você tenha uma conexão db transmitida que permita alterar o host por meio de um setter, então você não sabe qual é a conexão. Sendo imutável, então você sabe.

Diga, no entanto, que você possui uma estrutura de dados que pode ser recuperada da persistência e depois persistida com novos dados; então, faz sentido que essa estrutura não seja imutável. É a mesma entidade, mas os valores podem mudar. Em vez disso, use objetos de valor imutável como argumentos.

O que você está focando na pergunta é, no entanto, um padrão de construtor para se livrar das dependências no construtor. Eu digo um grande NÃO gordo para isso. A instância é obviamente complexa já. Não tente esconder, conserte!

Tl; dr

A remoção dos levantadores pode estar correta, dependendo da classe. O padrão do construtor não está resolvendo o problema, apenas ocultando-o. (A sujeira debaixo do tapete ainda existe, mesmo que você não possa vê-lo)


Não sei os detalhes da sua situação, mas se você entrou e tentou mudar tudo sem primeiro ganhar a confiança das pessoas com suas habilidades ou não ter tempo para aprender "por que" eles fazem as coisas da maneira que fazem, então você é tratado exatamente como você seria tratado em praticamente qualquer empresa, mesmo que seja realmente boa. Na verdade, especialmente nos realmente bons. Uma vez que as pessoas confiam nas habilidades de alguém, é simplesmente uma questão convincente para suas sugestões. Se você não pode argumentar convincentemente, há uma boa chance de sua sugestão não ser tão boa.
Húmido

1
idk o que responder às suas suposições @Dunk Eu não estava tentando mudar tudo, tentei limpá-lo. E não foram as pessoas que sabiam o que estavam fazendo; criaram orgulhosamente classes e funções que, onde centenas de linhas de código, com o idk quantos estados, globais e assim por diante .. o nível estava mais próximo da imo garden. Então, eu mantenho minha declaração. Nunca volta para baixo quando você percebe sua auto estar em uma posição em que você terá de adotar a má prática para caber no.
super-herói

@ Dunk Tente mudar como as pessoas codificam como membro da equipe não é o que eu faço. Mas eu digo a eles desde o início; "Não trabalharei neste projeto sem reescrevê-lo completamente" , se o código for um pedaço de lixo. Se isso não é apropriado, bem ... então é mútuo. Não se trata apenas de um conforto, mas do fato de eu ser capaz de assumir a responsabilidade pelo que produzo. Não posso fazer isso se o código circundante no projeto estiver uma bagunça completa.
Super

Você não precisa "eternamente" trabalhar com código que é lixo ou seguir práticas ruins simplesmente porque é assim que está sendo feito. No entanto, se você quiser ter sucesso em mudar as coisas, é melhor provar sua credibilidade primeiro, no mínimo. Quase todos os desenvolvedores acham que o código herdado é lixo. Se toda empresa concordar com o novo cara todas as vezes sem nem mesmo saber seu verdadeiro nível de habilidade, o lixo se tornará um lixo. Além disso, você deve dedicar um tempo para entender por que as coisas são feitas como são. Às vezes, o caminho "errado" é o caminho "certo" para uma situação específica.
Dunk

@ Dunk Eu vejo que você tem uma opinião diferente, então eu neste assunto. O seu parece ser mais popular, se estiver lendo as outras respostas. Não concordo, por que escrevi essa resposta em oposição. O que você declarou não mudou de idéia.
super-herói

2

Embora todas as outras respostas sejam muito úteis (mais úteis do que as minhas), há uma propriedade dos construtores que você ainda não mencionou: ao transformar a criação de um objeto em um processo, você pode impor restrições lógicas complexas.

Você pode exigir, por exemplo, que determinados campos sejam definidos juntos ou em uma ordem específica. Você pode até retornar uma implementação diferente do objeto de destino, dependendo dessas decisões.

// business objects

interface CharRange {
   public char getCharacter();
   public int getFrom();
   public int getTo();
}

class MultiCharRange implements CharRange {
   final char ch;
   final int from;
   final int to;

   public char getCharacter() { return ch; }
   public int getFrom() { return from; }
   public int getTo() { return to; }
}

class SingleCharRange implements CharRange {
   final char ch;
   final int position;

   public char getCharacter() { return ch; }
   public int getFrom() { return position; }
   public int getTo() { return position; }
}

// builders

class Builder1 {
   public Builder2 character(char ch) {
      return new Builder2(ch);
   }
}

class Builder2 {
   final char ch;
   int from;
   int to;

   public Builder2 range(int from, int to) {
      if (from > to) throw new IllegalArgumentException("from > to");
      this.from = from;
      this.to = to;
      return this;
   }

   public Builder2 zeroStartRange(int to) {
      this.from = 0;
      this.to = to;
      return this;
   }

   public CharRange build() {
      if (from == to)
         return new SingleCharRange(ch,from);
      else 
         return new MultiCharRange(ch,from,to);
   }
}

Este é um exemplo simplório que não faz muito sentido, mas demonstra as três propriedades: o caractere é sempre definido primeiro, os limites do intervalo são sempre definidos e validados juntos, e você escolhe sua implementação no momento da criação.

É fácil ver como isso pode levar a um código de usuário mais legível e confiável, mas como você também pode ver, há uma desvantagem: muito e muito código de construtor (e até deixei de fora os construtores para reduzir os trechos). Então você tenta calcular o trade-off, fazendo perguntas como:

  • Instanciamos apenas o objeto de um ou dois lugares? É provável que isso mude?
  • Talvez devêssemos impor essas restrições refatorando o objeto original em uma composição de objetos menores?
  • Acabaríamos passando o construtor de método para método?
  • Poderíamos apenas usar um método estático de fábrica?
  • Isso faz parte de uma API externa, que precisa ser a mais infalível e esperta possível?
  • Aproximadamente quantos dos nossos atuais registros de bugs poderiam ter sido evitados se tivéssemos construtores?
  • Quanto de documentação extra economizaríamos?

Seus colegas simplesmente decidiram que a troca não seria benéfica. Você deve discutir as razões de maneira aberta e honesta, de preferência sem recorrer a princípios abstratos, mas concentrando-se nas implicações práticas dessa ou daquela solução.


1
transformando a criação de um objeto em um processo, você pode impor restrições lógicas complexas. BAM. E tudo isso implica em complexidade quando ele é organizado em etapas menores, discretas e mais simples .
Radarbob

2

Parece que essa classe é realmente mais de uma classe, reunida na mesma definição de arquivo / classe. Se for um DTO, deve ser possível instancia-lo de uma só vez e ser imutável. Se você não usar todos os seus campos / propriedades em qualquer transação, é quase certo que ele está violando o princípio de responsabilidade única. Pode ser que dividi-lo em classes DTO menores, mais coesas e imutáveis, possa ajudar. Considere a possibilidade de ler o Código Limpo, se você ainda não o tiver, para poder articular melhor os problemas e os benefícios de fazer uma alteração.

Eu não acho que você possa projetar código nesse nível pelo comitê, a menos que você esteja literalmente programando mob (não parece que você faz parte desse tipo de equipe), então acho que não há problema em fazer uma alteração com base no seu melhor julgamento e, em seguida, leve-o ao queixo, se você achar que está errado.

No entanto, desde que você seja capaz de articular os possíveis problemas com o código, ele ainda poderá debater que uma solução é necessária , mesmo que a sua não seja a aceita. As pessoas são livres para oferecer alternativas.

" Opiniões fortes, fracamente defendidas " é um bom princípio - você segue em frente com confiança com base no que sabe, mas se encontrar alguma informação nova que contrarie isso, seja modesta e renuncie e entre em uma discussão sobre o que a solução correta deve estar. A única resposta errada é deixá-lo piorar.


Definitivamente, não é um projeto do comitê, que é parte da razão pela qual o código fede tanto. Acho que é muita coisa boa. Ele é um DTO, mas não vou dividi-lo em pedaços; se a base de código é ruim, o banco de dados é muito, muito pior. +1 (principalmente) para o último parágrafo.
Rath 06/04
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.