Estou programando em Java e sempre faço conversores assim:
public OtherObject MyObject2OtherObject(MyObject mo){
... Do the conversion
return otherObject;
}
No novo local de trabalho, o padrão é:
public void MyObject2OtherObject(MyObject mo, OtherObject oo){
... Do the conversion
}
Para mim, é um pouco malcheiroso, pois me acostumei a não alterar os parâmetros recebidos. Essa alteração de parâmetro de entrada é um antipadrão ou está OK? Tem algumas desvantagens sérias?
java
clean-code
anti-patterns
CsBalazsHungary
fonte
fonte
oo
seja um objeto que é passado para o método, não um ponteiro definido para um novo objeto. É esse o caso aqui? Se este for Java provavelmente é, se o seu C ++ pode não serRespostas:
Não é um antipadrão, é uma prática ruim.
A diferença entre um antipadrão e uma mera má prática está aqui: definição antipadrão .
O novo estilo de local de trabalho que você mostra é uma prática ruim , tempos vestigiais ou pré-POO, de acordo com o Código Limpo do tio Bob.
fonte
OtherObject
for uma interface? Somente quem chama (sabe-se) sabe que tipo concreto deseja.Citando o famoso livro de Robert C. Martin "Clean Code":
O segundo padrão viola as duas regras, particularmente o argumento "output output". Nesse sentido, é pior que o primeiro padrão.
fonte
O segundo idioma pode ser mais rápido, porque o chamador pode reutilizar uma variável em um loop longo, em vez de cada iteração criando uma nova instância.
Eu geralmente não usaria, mas por exemplo. na programação de jogos, ele tem seu lugar. Por exemplo, observe o lote de operações Vector3f do JavaMonkey permite passar a instância que deve ser modificada e retornada como resultado.
fonte
Eu não acho que essas são duas partes equivalentes de código. No primeiro caso, você deve criar o
otherObject
. Você pode modificar a instância existente no segundo. Ambos têm seus usos. O cheiro do código preferiria um ao outro.fonte
Realmente depende do idioma.
Em Java, a segunda forma pode ser um antipadrão, mas algumas linguagens tratam a passagem de parâmetros de maneira diferente. Em Ada e VHDL por exemplo, em vez de passar por valor ou por referência, os parâmetros podem ter modos
in
,out
, ouin out
.É um erro modificar um
in
parâmetro ou ler umout
parâmetro, mas qualquer alteração em umin out
parâmetro é passada de volta ao chamador.Portanto, as duas formas no Ada (também são VHDL legais) são
e
Ambos têm seus usos; um procedimento pode retornar vários valores em vários
Out
parâmetros enquanto uma função pode retornar apenas um único resultado. Como o objetivo do segundo parâmetro está claramente indicado na declaração do procedimento, não pode haver objeção a este formulário. Costumo preferir a função de legibilidade. mas haverá casos em que o procedimento é melhor, por exemplo, onde o chamador já criou o objeto.fonte
Realmente parece mal cheiroso, e sem ver mais contexto é impossível dizer com certeza. Pode haver duas razões para fazer isso, embora existam alternativas para ambas.
Primeiro, é uma maneira concisa de implementar a conversão parcial ou deixar o resultado com valores padrão se a conversão falhar. Ou seja, você pode ter o seguinte:
Obviamente, isso geralmente é tratado usando exceções. No entanto, mesmo que exceções precisem ser evitadas por qualquer motivo, existe uma maneira melhor de fazer isso - o padrão TryParse é uma opção.
Outro motivo é que pode ser por motivos de consistência pura, por exemplo, faz parte de uma API pública em que esse método é usado para todas as funções de conversão por qualquer motivo (como outras funções de conversão com várias saídas).
O Java não é bom em lidar com várias saídas - ele não pode ter parâmetros somente de saída, como algumas linguagens, ou ter vários valores de retorno como outros -, mas mesmo assim, você pode usar objetos de retorno.
A razão da consistência é um pouco ruim, mas, infelizmente, pode ser a mais comum.
fonte
A vantagem do segundo padrão é que ele força o chamador a assumir a propriedade e a responsabilidade pelo objeto criado. Não há dúvida de que o método criou ou não o objeto ou o obteve de um pool reutilizável. O chamador sabe que eles são responsáveis pela vida útil e pelo descarte do novo objeto.
As desvantagens deste método são:
OtherObject
dele e construí-lo com antecedência.MyObject
.OtherObject
deve ser construtível sem conhecerMyObject
.A resposta é baseada na minha experiência em c #, espero que a lógica se traduza em Java.
fonte
Dada a semântica solta -
myObjectToOtherObject
também pode significar que você move alguns dados do primeiro objeto para o segundo ou que os converte inteiramente de novo, o segundo método parece mais adequado.No entanto, se o nome do método fosse
Convert
(como deveria ser se olharmos para a parte "... faça a conversão"), eu diria que o segundo método não faria sentido. Você não converte um valor em outro valor que já exista, IMO.fonte