Engenharia de Software( Boas práticas ) - (Resolvido )

Srs, bom dia!

Tenho uma aplicação simples onde estou estudando os funcionamentos e benefícios da Hierarquia de heranças. Gostaria de saber qual seria uma “Boa prática de engenharia de software” em ambos os trecho de código.

//Classe commissionEmployee representa um funcionário que recebeu uma
//porcentagem das vendas brutas.
public class CommissionEmployee extends Object
{
	protected String firstName;
	protected String lastName;
	protected String socialSecurityNumber;
	protected double grossSales; //Vendas brutas semanais
	protected double commissionRate; //Porcentagem da comissão
				   
	
	//Construtor de cinco argumentos
	public CommissionEmployee( String first, String last, String ssn, double sales, double rate )
	{
		firstName = first;
		lastName = last;
		socialSecurityNumber = ssn;
		setGrossSales( sales );     //Valida e armazena as vendas brutas
		setCommissionRate( rate );  //Valida e armazena a taxa de comissão
				
	}//Fim do construtor CommissionEmployee de cinco argumentos	
	
	//Configura o nome
	public void setFirstName( String first )
	{
		firstName = first; //Deve valida
	
	}//Fim do método setFirstName
	
	//Retorna o nome
	public String getFirstName()
	{
		return firstName;
	
	}//Fim do método getFirstName
	
	//Configura nome
	public void setLastName( String last )
	{
		lastName = last; //Deve validar
	
	}//Fim do método setLastName
	
	//Retorna o sobreNome
	public String getLastName()
	{
		return lastName;
	
	}//Fim do método getLastName
	
	//Configura o CIC
	public void setSocialSecurityNumber( String ssn )
	{
		socialSecurityNumber = ssn; //Deve validar
	
	}//Fim do método setSocialSecurityNumber 
	
	
	//Retorna o CIC
	public String getSocialSecurityNumber()
	{
		return socialSecurityNumber; 
	
	}// Fim do método getSocialSecurityNumber
	
	//Confugura a quantidade de vendas brutas
	public void setGrossSales( double sales )
	{
		grossSales = ( sales < 0.0 ) ? 0.0 : sales ;
	
	}//Fim do método grossSales	
	
	//Retorna a quantidade de vendas brutas

	public double getGrossSales()
	{
		return grossSales;
	
	}//Fim do método setGrossSales	
		
	//Configura a taxa de comissão
	public void setCommissionRate( double rate )
	{
		commissionRate = ( rate > 0.0 && rate < 1.0 ) ? rate : 0.0;
			
	}//Fim do método setCommissionRate
	
	//Retorna a taxa de comissão
	public double getCommissionRate()
	{
		return commissionRate;   		       
	
	}//Fim do método setCommissionRate
	
	
	//Calcula os lucros
	
        public double earnings()
	{
		return getCommissionRate() * getGrossSales();
	
	}//Fim do método earings
	
	
	//Retorna a representação String do objeto CommissionEmployee
	@Override //Indica que esse método sobrescreve um método de superClasse
	public String toString()
	{
		return String.format( "%s: %s %s\n%s: %s\n%s: %.2f\n%s: %.2f", 
			"Commisson Employee", getFirstName(), getLastName(),
			"Social Security Number", getSocialSecurityNumber(),
			"Gross Sales", getGrossSales(),
			"Commission Rate", getCommissionRate() );
	
	}//Fim do método toString										
		
}//Fim da classe CommissionEmployee


*****Qual seria á prática recomendada no caso dos métodos earnings() e toString. Opção citada acima ou essa:******


	//Calcula os lucros
	public double earnings()
	{
		return commissionRate * grossSales;
	
	}//Fim do método earings
	
	
	//Retorna a representação String do objeto CommissionEmployee
	@Override //Indica que esse método sobrescreve um método de superClasse
	public String toString()
	{
		return String.format( "%s: %s %s\n%s: %s\n%s: %.2f\n%s: %.2f", 
			"Commisson Employee",firstName, lastName,
			"Social Security Number", socialSecurityNumber,
			"Gross Sales", grossSales,
			"Commission Rate", commissionRate );
	
	}//Fim do método toString										
		
}//Fim da classe CommissionEmployee

Quando você usa os getters, permite que esses métodos não precisem ser reimplementados caso a subclasse faça polimorfismo. Também torna os métodos mais resistentes a mudanças no tipo específico de dados dos atributos.

O getter() é em geral preferido. Porém, tem que analisar também se realmente é desejável que o método se adapte ao polimorfismo. Em classes relacionadas a segurança (como classes que gerem criptografia), muitas vezes podem não ser. Nesses casos, você usaria o atributo diretamente e ainda definiria o método como final. Essa situação é mais exceção do que regra.

Para entender mais a fundo sobre encapsulamento, leia:

ViniGodoy, bom dia!

Vou procura aprofundar mais meus conhecimentos em Composição, Herança e Polimorfismo. Sem duvida seu retorno ampliou mais meu nível de conhecimento.

Abraço.

ViniGodoy, bom dia!

Eu estava estudando o link que você me enviou, que por sinal bem completo. Eu observei que você fez um comentário com relação a composição x herança. Você prefere trabalhar com composição? Se sim, favor deixe me saber o porque você tem esse entendimento.

Obrigado.

Neste caso, leia esse link aqui: