Qual seria a melhor "prática de programação" para este código?

Estou com dúvida não no exercício mas na parte de ?boa prática de programação?. O exercício é o 3.14 do Deitel pede para criar uma classe Employee e criar três variáveis de instância e inicializa-las no construtor. Depois um set e um get para cada variável de instância:

package salario;

public class Employee {
	
	private String nome;
	private String sobreNone;
	private double salarioMensal;
	
	public Employee (String nome, String sobreNome, double salarioMensal) 
	{
		this.nome = nome;
		this.sobreNone = sobreNome;
		
		if (salarioMensal > 0.0)
			this.salarioMensal = salarioMensal;
	}
	
	public void setSalarioNome (String nome)
	{
		this.nome = nome;
	}
	
	public String getSalarioNome ()
	{
		return nome;
	}
	
	public void setSalarioSobreNome ( String sobreNome)
	{
		this.sobreNone = sobreNome;
	}
	
	public String getSobreNome ()
	{
		return sobreNone;
	}
	
	public void setSalarioSalarioMensal ( double salarioMensal)
	{
		this.salarioMensal = salarioMensal;
	}
	
	public double getSalarioMensal ()
	{
		return salarioMensal;
	}

}

[code]
package salario;

public class EmployeeTest {

/**
 * @param args
 */
public static void main(String[] args) {
	
	Employee sal1 = new Employee("Jose" , "Silva" , 510.00);
	
	Employee sal2 = new Employee("Maria", "Silva",650.00);
	
	System.out.println("O salario anual do(a) " + sal1.getSalarioNome()
			+ " " + sal1.getSobreNome()+ " é = " + sal1.getSalarioMensal() * 12 );
	System.out.println("O salario anual do(a) " + sal1.getSalarioNome()
			+ " " + sal1.getSobreNome()+ " com aumento de 10 % = " + (sal1.getSalarioMensal() * 12) * 1.10 );

	System.out.println("O salario anual do(a) " + sal2.getSalarioNome()
			+ " " + sal2.getSobreNome()+ " é = " + sal2.getSalarioMensal() * 12 );
	System.out.println("O salario anual do(a) " + sal2.getSalarioNome()
			+ " " + sal2.getSobreNome()+ " com aumento de 10 % = " + (sal2.getSalarioMensal() * 12) * 1.10 );

}

}[/code]

O problema é, seria ideal eu fazer esses calculos de salário anual e aumento de salário na classe main como está ou melhor dar um jeito de criar um método na classe Employee para fazer os cálculos? Qual seria a melhor prática de programação?

Boa noite, na minha oopinião, a melhor coisa seria sobrescrever o método toString da classe employ e usa-lo, caso tenha duvidas existem bastante tópicos de como funciona o toString, caso ainda restem dúvidas poste-nos.

link para tópico sobre toString: http://www.guj.com.br/java/136139-como-usar-o-tostring-e-para-que-serve-como-e-chamado-resolvido

e o que tem haver o toString() com o que ele lhe perguntou ???

Usar o toString() para efetuar cálculos em uma classe é uma das piores práticas que poderia ser feito…

Amigão, use sua classe Employee para realizar o cálculo sim… Se um dia você quiser mudar o seu main para uma GUI Swing, sua regra está fora do Front de sua aplicação…

Uma boa (mas aí dependerá de seu Projeto), poderia ser criar uma classe SalarioEmployee ou apenas Salario que recebe um atributo Employee e calcula o salario dele através dos parâmetros contidos em seu Objeto Employee, assim você divide responsabilidade e granulariza sua aplicação para receber calculos de salários de vários níveis de empregados. Enfim, estude qual a situação melhor pra você…

Mas a priori, você foi pelo caminho certo, tire o seu cálculo do main… o Main será o lugar somente de exibição de seus dados.

Abs [] e bons estudos.

Ola amigo,
Na minha opinião a boa prática seria vc criar um método getSalarioAnual() pois é um dado específico de Employee e vc já tem o salário mensal no construtor.
Outra boa prática é usao BigDecimal ao invés de Double para calculo monetário.

Fallow Abraço

Perfeito… acostume-se com isso. Já tive dores de cabeça pra trocar um Sistema de Contabilidade inteiro, onde o amigão fez todos os atributos monetários como Double…

Pense num Problema… ???

Abs []

Oi,

Vc acaba de usar encapsulamento. E a grande ideia eh essa, vc tanto podera criar um metodo que lhe retorne a soma do salario ou utilizar os get() para tal.

Tchauzin!

Boa noite a todos.

A meu ver voce pode utilizar os métodos qetSalarioAnual para fazer isto, e nem precisa dos métodos setSalarioAnual(), uma vez que for setado o salário mensal no setSalarioMensal(…), ao se obter o sálario anual, automaticamente voce já faz o cálculo dentro do getSalárioAnual, e a sua classe ficaria assim:

package salario;  
  
public class Employee {  
      
    private String nome;  
    private String sobreNone;  
    private double salarioMensal;  
      
    public Employee (String nome, String sobreNome, double salarioMensal)   
    {  
        this.nome = nome;  
        this.sobreNone = sobreNome;  
          
        if (salarioMensal > 0.0)  
            this.salarioMensal = salarioMensal;  
    }  
      
    public void setNome (String nome)  
    {  
        this.nome = nome;  
    }  
      
    public String getNome ()  
    {  
        return nome;  
    }  
      
    public void setSobreNome ( String sobreNome)  
    {  
        this.sobreNone = sobreNome;  
    }  
      
    public String getSobreNome ()  
    {  
        return sobreNone;  
    }  
      
    public void setSalarioMensal ( double salarioMensal)  
    {  
        this.salarioMensal = salarioMensal;  
    }  
      
    public double getSalarioMensal ()  
    {  
        return salarioMensal;  
    }

    // Aqui voce já obtém o cálculo do salário anual.
    public  double getSalarioAnual()
    {
        if (salarioMensal != 0.0) {
            return (salarioMensal * 12);
        } else {
            return 0.0;
        }
     }
  
}

Uma outra dica, se voce estiver no Brasil então o salário anual e o salário mensal X 12 mais o 13º salário, então, o seu método ficaria assim:


// Aqui voce já obtém o cálculo do salário anual com 13º salário.
    public  double getSalarioAnual()
    {
        if (salarioMensal != 0.0) {
            return (salarioMensal * 12) + salarioMensal;
        } else {
            return 0.0;
        }
     }

Pensando melhor ainda tem o 1/3 de férias, caramba :!: :!: :!: Então o salário anual ficaria assim:


// Aqui voce já obtém o cálculo do salário anual com 13º salário e mais 1/3 de férias
    public  double getSalarioAnual()
    {
        if (salarioMensal != 0.0) {
            return (salarioMensal * 12) + salarioMensal + (salarioMensal * 0.33);
        } else {
            return 0.0;
        }
     }

Valendo lembrar que 1/3 do salário não corresponde a 30 % e sim a 33 %, que na verdade seria uma dízima períodica simples 0,3333333333…, neste caso é melhor multiplicar por 0.33 para dar um valor aproximado

Um abraço.

[quote=discorpio]



// Aqui voce já obtém o cálculo do salário anual com 13º salário.
    public  double getSalarioAnual()
    {
        if (salarioMensal != 0.0) {
            return (salarioMensal * 12) + salarioMensal;
        } else {
            return 0.0;
        }
     }

[/code][/quote]

Uma pequena opinião que para mim seria mais válido neste trecho de código
acrescentar mais uma condição para validação
[code]  public  double getSalarioAnual()
    {
        if (salarioMensal != 0.0 && salarioMensal  > 0.0 ) {
            return (salarioMensal * 12) + salarioMensal;
        } else {
            return 0.0;
        }
     }

[quote=alexafe][quote=discorpio]



// Aqui voce já obtém o cálculo do salário anual com 13º salário.
    public  double getSalarioAnual()
    {
        if (salarioMensal != 0.0) {
            return (salarioMensal * 12) + salarioMensal;
        } else {
            return 0.0;
        }
     }

[/code][/quote]

Uma pequena opinião que para mim seria mais válido neste trecho de código
acrescentar mais uma condição para validação
[code]  public  double getSalarioAnual()
    {
        if (salarioMensal != 0.0 && salarioMensal  > 0.0 ) {
            return (salarioMensal * 12) + salarioMensal;
        } else {
            return 0.0;
        }
     }

[/quote]

Obrigado Alexafe por lembrar, entretanto a segunda validação já é suficiente, pois se o salário mensal for maior que zero, obviamente não será igual e nem menor. então.

// Aqui voce já obtém o cálculo do salário anual com 13º salário e mais 1/3 de férias  
    public  double getSalarioAnual()  
    {  
        if (salarioMensal > 0.0) {  
            return (salarioMensal * 12) + salarioMensal + (salarioMensal * 0.33);  
        } else {  
            return 0.0;  
        }  
     }  

Oi,

Sendo um pouco chata, mudaria então para:

// Aqui voce já obtém o cálculo do salário anual com 13º salário e mais 1/3 de férias public double getSalarioAnual() { return (salarioMensal > 0.0 ? (salarioMensal * 12) + salarioMensal + (salarioMensal * 0.33) : 0.0); }

Faz a mesma coisa, porém evita return no meio do código e uma carrada de else if…

Tchauzin!

[quote=lina]Oi,

Sendo um pouco chata, mudaria então para:

// Aqui voce já obtém o cálculo do salário anual com 13º salário e mais 1/3 de férias public double getSalarioAnual() { return (salarioMensal > 0.0 ? (salarioMensal * 12) + salarioMensal + (salarioMensal * 0.33) : 0.0); }

Faz a mesma coisa, porém evita return no meio do código e uma carrada de else if…

Tchauzin![/quote]
O colega que criou o tópico é iniciante então esse tipo de condições mais avançadas são complicadas para iniciantes

[quote=alexafe][quote=lina]Oi,

Sendo um pouco chata, mudaria então para:

// Aqui voce já obtém o cálculo do salário anual com 13º salário e mais 1/3 de férias public double getSalarioAnual() { return (salarioMensal > 0.0 ? (salarioMensal * 12) + salarioMensal + (salarioMensal * 0.33) : 0.0); }

Faz a mesma coisa, porém evita return no meio do código e uma carrada de else if…

Tchauzin![/quote]
O colega que criou o tópico é iniciante então esse tipo de condições mais avançadas são complicadas para iniciantes[/quote]

Oi,

Avançada? É apenas um IF…

Tchauzin!

Eu digo avançada porque todo mundo começa aprendendo com if e else , pelo menos é o que eu vejo, só depois de um bom tempo de estudo, começam a entender e fazer esses outras formas de condições :smiley: :smiley: :smiley: , eu mesmo no inicio demorei pra entender as condicoes sem if e else explicitos

[quote=lina]Oi,

Sendo um pouco chata, mudaria então para:

// Aqui voce já obtém o cálculo do salário anual com 13º salário e mais 1/3 de férias public double getSalarioAnual() { return (salarioMensal > 0.0 ? (salarioMensal * 12) + salarioMensal + (salarioMensal * 0.33) : 0.0); }

Faz a mesma coisa, porém evita return no meio do código e uma carrada de else if…

Tchauzin![/quote]

Bom dia a todos.

Lina, se o negócio é enxugar o código, então podemos enxugar mais ainda, sabe onde, nos cálculos. Como assim :?:

Ora, se voce multiplicar o salário mensal por um terço de férias (0.33), voce terá valor da fração de um terço de férias, correto. Porém se voce multiplicar o salário mensal por 1,33, voce já soma a fação de um terço de férias ao salário mensal, obtendo o valor total de um salário mais um terço de férias.

Como um salário mensal também corresponde ao 13º salário, logo a expressão matemática poderia ser reduzida assim:

    // Aqui voce já obtém o cálculo do salário anual com 13º salário e mais 1/3 de férias  
    public  double getSalarioAnual()  
    {  
            return (salarioMensal > 0.0 ? (salarioMensal * 12) + (salarioMensal * 1.33) : 0.0);
     } 

[quote=paulo1911]Ola amigo,
Na minha opinião a boa prática seria vc criar um método getSalarioAnual() pois é um dado específico de Employee e vc já tem o salário mensal no construtor.
Outra boa prática é usao BigDecimal ao invés de Double para calculo monetário.

Fallow Abraço[/quote]

O que é esse BigDecimal?

[quote=lina][quote=alexafe][quote=lina]Oi,

Sendo um pouco chata, mudaria então para:

// Aqui voce já obtém o cálculo do salário anual com 13º salário e mais 1/3 de férias public double getSalarioAnual() { return (salarioMensal > 0.0 ? (salarioMensal * 12) + salarioMensal + (salarioMensal * 0.33) : 0.0); }

Faz a mesma coisa, porém evita return no meio do código e uma carrada de else if…

Tchauzin![/quote]
O colega que criou o tópico é iniciante então esse tipo de condições mais avançadas são complicadas para iniciantes[/quote]

Oi,

Avançada? É apenas um IF…

Tchauzin![/quote]

Alguém poderia me explicar com é essa forma de condição? O que esse interrogação faz ae? :?:

Oi,

[quote]
Alguém poderia me explicar com é essa forma de condição? O que esse interrogação faz ae? :?: [/quote]

Explicação Simbólica:

? = Então
: = Se não

Algo do tipo:

[code]
a = 5;
b = 5;

// Se a e b possuem os mesmos valores, então…
if (a == b) {
System.out.println(“Os valores são iguais”);
}
// Se não
else
{
System.out.println(“Os valores são diferentes”);
}[/code]

Podendo fazer:

return (a == b ? "Os valores são iguais" : "Os valores são diferentes");

Tchauzin!

Chama-se “Operador Ternário”.
Exemplo aqui.

O que a Lina comentou está corretissimo. :slight_smile:

Boa tarde a todos.

BigDecimal é uma classe java, para tratar números de ponto flutante, onde possui métodos de arredondamente e etc.

Se não me falhe a memória, esta classe consegue converter um tipo primitivo double que armazena 64 bits de posição para um BigDecimal de 32 bits de posição, porém com mais precisão no ponto flutuante.

Existe também a classe Double com “D” maiúsculo, assim como há diferenças entre o tipo primitivo boolean e a classe Boolean e as classes te oferecem melhores recursos do que o tipo primitivo.

Para esclarecer melhor, visite este link: http://blog.caelum.com.br/arredondamento-no-java-do-double-ao-bigdecimal/

[quote=lina]Oi,

Obrigado pela explicação lina, eu tb sou um iniciante usuário do if.