Ver Mensaje Individual
  #11 (permalink)  
Antiguo 06/08/2016, 16:57
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: ¿ Estaría el código bien orientado a objetos ?

Tenia un poco de tiempo asì que hice un ejemplo a partir de tu clase original, la cual lo único que hace es guardar la información que querías y cree dos clases adicionales una que solo se encarga de calcular el sueldo a partir de un porcentaje como lo tenìas pensado y otra que se encarga de proporcionar el sueldo que requiere el Empleado cuando es contratado o promovido a un puesto, es algo sencillo que se puede refactorizar pero espero que te ayude.

Código PHP:
Ver original
  1. class Empleado
  2. {
  3.     private $nombre;
  4.     private $apellidos;
  5.     private $dni;
  6.     private $sueldoAnual;
  7.  
  8.     private function __construct($nombre, $apellidos, $dni, $sueldoAnual) {
  9.         $this->setNombre($nombre);
  10.         $this->setApellidos($apellidos);
  11.         $this->setDni($dni);
  12.         $this->setSueldoAnual($sueldoAnual);
  13.     }
  14.  
  15.     public static function contratar($nombre, $apellidos, $dni, $sueldoAnual)
  16.     {
  17.         return new static($nombre, $apellidos, $dni, $sueldoAnual);
  18.     }
  19.  
  20.     public function promover($sueldo)
  21.     {
  22.         $this->setSueldoAnual($sueldo);
  23.  
  24.         return $this;
  25.     }
  26.  
  27.     public function getPrimerApellido() {
  28.         $porcion = explode(" ", $this->getApellidos());
  29.         return $porcion[0];
  30.     }
  31.  
  32.     public function getSegundoApellido() {
  33.         $porcion = explode(" ", $this->getApellidos());
  34.         if (!isset($porcion[1])) {
  35.             return null;
  36.         }
  37.         return $porcion[1];
  38.     }
  39.  
  40.     public function getNombre() {
  41.         return $this->nombre;
  42.     }
  43.  
  44.     public function getApellidos() {
  45.         return $this->apellidos;
  46.     }
  47.  
  48.     public function getDni() {
  49.         return $this->dni;
  50.     }
  51.  
  52.     public function getSueldoAnual() {
  53.         return $this->sueldoAnual;
  54.     }
  55.  
  56.     public function setNombre($nombre) {
  57.         $this->nombre = $nombre;
  58.     }
  59.  
  60.     public function setApellidos($apellidos) {
  61.         $this->apellidos = $apellidos;
  62.     }
  63.  
  64.     public function setDni($dni) {
  65.         $this->dni = $dni;
  66.     }
  67.  
  68.     private function setSueldoAnual($sueldoAnual) {
  69.         $this->sueldoAnual = $sueldoAnual;
  70.     }
  71. }

Código PHP:
Ver original
  1. class Tabulador
  2. {
  3.  
  4.     private $sueldoAnual;
  5.  
  6.     public function __construct($sueldoAnual)
  7.     {
  8.         $this->sueldoAnual = $sueldoAnual;
  9.     }
  10.  
  11.     public function ascender($porcentaje = 0) {
  12.         $nuevoSueldo = $this->sueldoAnual + $this->porcentaje($porcentaje);
  13.         return $nuevoSueldo;
  14.     }
  15.  
  16.     private function porcentaje($porcentaje) {
  17.         return $this->sueldoAnual * $porcentaje / 100;
  18.     }
  19. }
Código PHP:
Ver original
  1. class RecursosHumanos
  2. {
  3.     private $tabulador;
  4.  
  5.     /**
  6.      * @var Empleado
  7.      */
  8.     private $empleado;
  9.  
  10.     private $sueldo = null;
  11.  
  12.     public function __construct(Tabulador $tabulador)
  13.     {
  14.         $this->tabulador = $tabulador;
  15.     }
  16.  
  17.     public function contratar(Array $persona = [])
  18.     {
  19.         $this->empleado = $persona;
  20.  
  21.         return $this;
  22.     }
  23.     public function promover(Empleado $empleado)
  24.     {
  25.         $this->empleado = $empleado;
  26.  
  27.         return $this;
  28.     }
  29.  
  30.     public function para($puesto)
  31.     {
  32.         switch($puesto){
  33.             case 'Programador':
  34.                     $this->sueldo = $this->tabulador->ascender();
  35.                     break;
  36.             case 'Lider':
  37.                     $this->sueldo = $this->tabulador->ascender(10);
  38.                     break;
  39.         }
  40.  
  41.         if (is_array($this->empleado)) {
  42.             array_push($this->empleado, $this->sueldo);
  43.             return Empleado::contratar(...$this->empleado);
  44.         } else {
  45.             return $this->empleado->promover($this->sueldo);
  46.         }
  47.     }
  48. }
Ejempo de uso
Código PHP:
Ver original
  1. $sueldo_base = 40000.00;
  2.  
  3.         $persona = [
  4.             'Juan Carlos',
  5.             'Rodriguez',
  6.             123456,
  7.         ];
  8.  
  9.         $tabulador = new Tabulador($sueldo_base);
  10.         $rh =  new RecursosHumanos($tabulador);
  11.  
  12.         $empleado = $rh->contratar($persona)->para('Programador');
  13.  
  14.         print_r($empleado->getSueldoAnual());
  15.  
  16.         $empleado = $rh->promover($empleado)->para('Lider');
  17.  
  18.          print_r($empleado->getSueldoAnual());
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.