maaarkin:
Por exemplo, tenho uma estrutura de estacionamento e basicamente tenho uma seguinte duvida, quando declarar ou não um atributo na classe, segue abaixo minha duvida:
class Tarifa {
Vaga vaga;
public Tarifa(Vaga vaga) {
this.vaga = vaga
}
public void calculaTarifa() {
...//Aqui Efetua um calculo da tarifa utilizando a classe Vaga.
}
.
.
.
Minha dúvida é: eu tambem cheguei a possibilidade de fazer o seguinte:
class Tarifa {
public Tarifa() {
}
public void calculaTarifa(Vaga vaga) {
...//Aqui Efetua um calculo da tarifa utilizando a classe Vaga.
}
.
.
.
Pelo que eu vi, eu poderia utilizar as duas formas, o problema é questão de PADRAO, qual seria a forma correta de implementar essa classe?
não é uma questão de padrão. É uma questão de responsabilidade da classe. qual classe tem responsabilidade do quê ? Qual classe é ativa e qual classe é apenas um dado alimentando um algoritmo
Vc poderia fazer assim
class Vaga {
public void calcularTarifa(Tarifa tarifa) {}
}
ou assim
class ServicoTarifário{
public Money calcularCusto(Tarifa tarifa, Vaga vaga) {}
}
Veja que todas as formas são válidas em termos de linguagem. O que as distingue é a responsabilidade que foi atribuida a cada classe. Escolher a responsabilidade de cada classe é uma das coisas mais essenciais de OO e é o que diferencia um bom modelo de uma porcaria. É tão importante que existem principios que regem isto, no caso o Principio da Responsabiliade Única (SRP) que diz que uma classe deve ter uma , e uma só, responsabilidade.
Qual é a responsabilidade do objeto Vaga ? e do objeto Tarifa ? Pode o objeto tarifa ter a responsabilidade pelo calculo ?
Em relação a usar um atributo ou passar como argumento a questão é : Pode um mesmo objeto Tarifa ser usado para calcular mais do que uma vaga ? ou existe alguma relação entre a tarifa e a vaga que obriga a cria um objeto tarifa vinculado com uma vaga ?
Se existe vinculo ( chamado de dependencia) então é preciso um atributo. Se não, então passa no argumento.