Como organizar o código OO [duplicado]

5

Se você tem um método que não precisa de acesso a campos, propriedades ou métodos não públicos, onde você deve colocar o método?

deve ser apenas um método normal na classe, um método estático que usa uma instância como um parâmetro, um método de extensão ou outra coisa?

    
por user1450877 26.06.2013 / 14:44
fonte

5 respostas

5

Este método ainda faz parte logicamente da interface de classe? Se assim for, você vai querer colocá-lo em proximidade com a própria classe de alguma forma. Isso poderia ser como um membro, como um método estático de uma classe de utilitário relacionado (incluindo métodos de extensão se sua linguagem tiver tal coisa, por exemplo, C #) ou uma função livre no mesmo pacote / namespace da classe, se seu idioma suportar isso (por exemplo, C ++).

Mas se não for inerentemente ligado à classe, talvez em outro lugar seja melhor.

Em geral, eu não daria a uma classe um método estático que usasse um único parâmetro de instância. Na maioria das linguagens, esse método não é mais restrito no que ele pode acessar (geralmente pode acessar membros privados), portanto, é apenas uma carga sintática para o chamador.

    
por 26.06.2013 / 15:23
fonte
1

Eu costumo usar os conceitos de acoplamento e coesão para decidir o que acontece em qualquer classe / interface / módulo / etc específica. Baixo acoplamento e alta coesão são o que você quer.

O acoplamento é bem fácil de entender. Mas acho que muitos desenvolvedores têm problemas com a coesão. Basicamente, "coesão" é como a velha canção da Vila Sésamo: "Uma dessas coisas não é como as outras ..." Numa aula de alta coesão, tudo parece pertencer.

(Além disso, para ser pedante, eu diria que é mais sobre como você "desenha" código OO em vez de "organizá-lo" - onde organização seria mais sobre como você ordena métodos, pacotes de nomes, etc.)

    
por 26.06.2013 / 21:28
fonte
0

Se ele usa campos, propriedades ou métodos privados, mantenha-o não estático. Passar em uma variável de instância apenas adiciona ruído.

Eu tento tornar os métodos estáticos, se puder (sem passar por instâncias), sinaliza a oportunidade de mover o método para outro lugar, se necessário.

Em caso de dúvida, deixe a saída estática.

    
por 26.06.2013 / 15:23
fonte
0

Estático, se não for relevante para a instância. O fato de você querer passar uma instância significa que é uma instância relevante, portanto, não.

Particular, se na melhor das hipóteses não fizer mais do que confundir as pessoas que tentam reutilizar sua turma quando expostas a elas. O ponto principal é enterrar como isso funciona e apenas dar às pessoas fácil compreensão, botões bem marcados para pressionar.

Pense primeiro no que você deseja expor a outra pessoa usando sua turma. E preste atenção às APIs públicas sobre as coisas que você mais gosta de trabalhar para algumas ideias sobre o que funciona bem.

A única razão para normalmente usar um método estendido é se você tem uma variedade de classes que você quer que todos tenham o mesmo conjunto padrão de métodos. Há pessoas por aí se estendendo e implementando por todos os tipos de razões e padrões complexos, mas é uma OOP ruim e, na maioria dos casos, elas provavelmente deveriam parar.

Mantenha tudo tão simples e limpo quanto necessário. É sempre mais fácil tornar suas aulas mais complexas do que manter uma base de código cheia de coisas que não precisavam estar lá. Quanto menos houver para olhar, mais claras são suas intenções e mais fácil é manter / modificar sem que tudo exploda na sua cara.

    
por 26.06.2013 / 18:44
fonte
0

Não estou falando de nenhuma palavra OO específica a um idioma (estática, privada, etc.).

If you have a method that doesn't need access to any non public fields, properties or methods where should you put the method ?

Se o código não estiver relacionado a nenhuma classe em seu domínio, pode ser uma função simples, fora de um escopo de classe. Um exemplo idiota é fatorial ou até mesmo fibonacci, ou apenas recebe um valor e calcula um resultado, não pertence a nenhuma classe em especial. Se o código for algum tipo de factory ou tiver algo relacionado a uma determinada classe, então ele pode ser um método estático ou de classe, ou até mesmo outra classe.

É importante notar que, se o seu idioma permitir as funções pure , não apenas classes e métodos, você poderá aproveitá-lo e tornar seu design mais simples (para mim, é um dos principais desvantagens da linguagem Java, mas é apenas minha opinião pessoal).

    
por 26.06.2013 / 22:07
fonte