4
respostas

Instanciar regra dentro do cargo

Olá, Não achei muito interessante a idéia de ter que escrever no código qual é a regra de cada cargo. Em uma empresa, acho que seria mais comum categorizar cada posição e então definir qual será o valor multiplicado.

Assim, tentei desenvolver a classe Cargo como abstrata e com uma variável regra e todas as classes que extendam Cargo iriam ter em seu construtor um cargo inicial, conforme o código abaixo:

abstract class Cargo
{
    private $regra;

    public function getRegra()
    {
        return $this->regra;
    }
}

class Desenvolvedor extends Cargo
{
    private $regra;

    public function __construct()
    {
        $this->regra = new DezOuVintePorcento();
    }
}

class Tester extends Cargo
{
    private $regra;

    public function __construct()
    {
        $this->regra = new QuinzeOuVinteCincoPorcento();
    }
}

class Dba extends Cargo
{
    private $regra;

    public function __construct()
    {
        $this->regra = new QuinzeOuVinteCincoPorcento();
    }
}

Assim, quando alguém criar um cargo novo, só seria necessário decidir qual é a regra de cobrança. No entanto esse código não está funcionando.. Alguém sabe o que pode ser? Acho que deve ser alguma coisa que esqueci ou esse construtor só nas classes extendidas está fazendo algo errado..

Obrigado :D

4 respostas

Oi João, tudo bem? Existem várias formas de resolver estes problemas, o que define qual é a melhor solução é a questão do contexto. Você mudou o contexto e encontrou uma solução. E tudo bem isso, contando que você não misture a coesão e as responsabilidades de cada classe.

Sobre o erro, não aparece nenhuma mensagem?

Achei interessante o que o João Fernando disse, pois cada Cargo ficaria responsável pela sua regra de calculo de salário.

No exemplo abaixo pode ocorrer do programador inverter a ordem da Regra de Salário, ao invés de "DezOuVintePorcento" colocar "QuinzeOuVinteCincoPorcento".

$funcionario->setCargo(new Desenvolvedor(new DezOuVintePorcento()));

No entanto eu mudaria a classe Cargo para uma interface para as outras classes implementariam a função que receberá a RegraDeSalario.

declare seus atributos como protected em vez de private, assim vc conseguirá acessar nas classes que se extendem

Só fica atento que fazer isso Felipe, você foge um pouco do encapsulamento entende?