Qual a estrutura da classe está correta?

2 respostas
M

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?

2 Respostas

igor_ks

Depende do seu escopo…

Com certeza, se vc for usar a variavel Vaga apenas para este método, compensa fazer somente por parametro para diminuir o escopo…
Nao faz sentido vc fazer

tarifa.setVaga(vaga); tarifa.calculaTarifa();

faz somente um

tarifa.calculaTarifa(vaga);
sergiotaborda

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.

Criado 7 de março de 2013
Ultima resposta 7 de mar. de 2013
Respostas 2
Participantes 3