Atualmente, estou trabalhando em uma base de código que possui muitas classes que implementam um método Start. Parece-me uma construção em duas fases, que eu sempre considerara uma prática ruim. Não sei dizer a diferença entre isso e um construtor.
Quando é apropriado usar um método start em vez da construção normal do objeto?
Quando devo preferir usar o construtor?
Edit: Eu não acho que seja relevante, mas a linguagem de programação é C #, poderia ser aplicada igualmente a Java ou C ++
object-oriented-design
construction
constructors
Dave Hillier
fonte
fonte
start
e o construtor? etc ...init
método de algum tipo fora danew
função - perldoc.perl.org/perlobj.html . Os idiomas de um idioma podem funcionar bem lá e não em outros idiomas.Start
métodos em APIs comuns incluem threads e cronômetros.Respostas:
Um
Start()
método (comoRun()
,Execute()
ou algo semelhante) é apropriado quando o custo de construção do objecto é baixa, mas o custo de utilização é elevada. Por exemplo: Uma classe que encapsula um algoritmo de otimização do melhor caminho. É trivial configurá-lo com um conjunto de parâmetros (X
quadrados porY
quadrados, com esse método de avaliação), mas pode demorar um pouco para ser executado. Se você deseja criar 20 desses objetos, pode atrasar a execução até que todos eles tenham sido criados - isso permite paralelizá-los mais facilmente, por exemplo.Como alternativa, pode ser útil quando você não sabe quando o objeto será necessário para iniciar - talvez porque seja baseado na entrada do usuário ou na lógica que seleciona em uma lista de possibilidades.
Isso pressupõe, é claro, que
Start()
é o método útil no objeto, e não equivalente a umInitialize()
método. Se é apenas uma maneira extra de definir mais parâmetros, ela não deveria existir.fonte
O Code Complete (e muitos outros recursos de engenharia de software) enfatiza a correspondência de suas classes com objetos do mundo real. Acredito que a razão fundamental para isso é que torna mais provável que você tenha uma compreensão verdadeira do que está implementando, em vez de se esquivar de uma ideia intangível.
Se você é assinante dessa teoria, não vejo nada de errado em adicionar um
Start()
método a qualquer classe que, se fosse um objeto real, também tivesse um estado de repouso. Se não faz sentido que seu objeto exista enquanto não está em execução (ou não faz sentido que ele esteja em execução), então eu diria que é uma má prática.fonte
Start()
poderia corresponder a um botão liga / desliga (como um interruptor de luzes) que deveria ter umStop()
, ou a um botão de pressão (como o botão Imprimir em uma copiadora), onde ele inicia e é executado até terminar.Você pode usar a inicialização lenta.
Dessa forma, você evita o acoplamento temporal, o que significa que o consumidor de sua classe precisa chamar certos métodos em uma certa ordem. Ter que ligar
start()
primeiro é uma maneira de saber como a classe funciona internamente, o que é ruim, porque você pode mudar isso no futuro.Atraso na inicialização cara até que seja necessário primeiro.
Exemplo:
fonte