Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

PHP OO ¿ Estaría el código bien orientado a objetos ?

Estas en el tema de ¿ Estaría el código bien orientado a objetos ? en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas compis!!, ando intentando cambiar la forma de programar de estilo por procedimientos a estilo orientado a objetos, y me preguntaba si este sencillo ejemplo ...
  #1 (permalink)  
Antiguo 02/08/2016, 08:33
Avatar de rodrypaladin
Moderador
 
Fecha de Ingreso: abril-2010
Ubicación: Madrid
Mensajes: 2.127
Antigüedad: 14 años
Puntos: 468
¿ Estaría el código bien orientado a objetos ?

Buenas compis!!, ando intentando cambiar la forma de programar de estilo por procedimientos a estilo orientado a objetos, y me preguntaba si este sencillo ejemplo que he hecho estaría bien planteado y que cumple con todos los requisitos para que esté orientado a objetos correctamente

Código PHP:
Ver original
  1. <?php
  2.  
  3. class Empleado {
  4.     private $nombre;
  5.     private $apellidos;
  6.     private $dni;
  7.     private $sueldoAnual;
  8.  
  9.     public function Empleado($nombre, $apellidos, $dni, $sueldoAnual) {
  10.         $this->setNombre($nombre);
  11.         $this->setApellidos($apellidos);
  12.         $this->setDni($dni);
  13.         $this->setSueldoAnual($sueldoAnual);
  14.     }
  15.  
  16.     public function ascender($porcentaje) {
  17.         $nuevoSueldo = $this->getSueldoAnual() + $this->porcentaje($porcentaje);
  18.         $this->setSueldoAnual($nuevoSueldo);
  19.     }
  20.  
  21.     public function descender($porcentaje) {
  22.         $nuevoSueldo = $this->getSueldoAnual() - $this->porcentaje($porcentaje);
  23.         $this->setSueldoAnual($nuevoSueldo);
  24.     }
  25.  
  26.     public function porcentaje($porcentaje) {
  27.         return $this->getSueldoAnual() * $porcentaje / 100;
  28.     }
  29.  
  30.     public function getPrimerApellido() {
  31.         $porcion = explode(" ", $this->getApellidos());
  32.         return $porcion[0];
  33.     }
  34.  
  35.     public function getSegundoApellido() {
  36.         $porcion = explode(" ", $this->getApellidos());
  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.     public function setSueldoAnual($sueldoAnual) {
  69.         $this->sueldoAnual = $sueldoAnual;
  70.     }
  71.  
  72. }
  73.  
  74.  ?>

Un saludo!!
__________________
No te olvides de dar +1 a quien te echa un cable ;)

Última edición por rodrypaladin; 02/08/2016 a las 10:27
  #2 (permalink)  
Antiguo 02/08/2016, 16:42
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: ¿ Estaría el código bien orientado a objetos ?

Me puedes explicar cual es el propósito de tu clase y que es lo que hace ?
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #3 (permalink)  
Antiguo 02/08/2016, 23:16
Avatar de rodrypaladin
Moderador
 
Fecha de Ingreso: abril-2010
Ubicación: Madrid
Mensajes: 2.127
Antigüedad: 14 años
Puntos: 468
Respuesta: ¿ Estaría el código bien orientado a objetos ?

Guardar los datos de un empleado y su sueldo. Solo quiero saber si está bien orientado a objetos el código. No es una clase que vaya a usar para nada, es solo un ejercicio práctico
__________________
No te olvides de dar +1 a quien te echa un cable ;)
  #4 (permalink)  
Antiguo 03/08/2016, 06:42
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: ¿ Estaría el código bien orientado a objetos ?

En cuanto a tu clase, el método porcentaje tiene pinta de ser privado, y no público.

Como mejora, convierte el salario en una nueva clase Salario, que contenga esos métodos para incrementarla o decrementarla, y deja limpia tu clase Empleado limpia de métodos que solo sirven para el salario.

Clases pequeñas, y que cada clase resuelva sus mierdas.
  #5 (permalink)  
Antiguo 03/08/2016, 12:35
Avatar de rodrypaladin
Moderador
 
Fecha de Ingreso: abril-2010
Ubicación: Madrid
Mensajes: 2.127
Antigüedad: 14 años
Puntos: 468
Respuesta: ¿ Estaría el código bien orientado a objetos ?

Eso es loq ue estaba mirando para aprender ahora. Estoy creando la clase Sueldo, pero lo que no se es como comunicarlas, que es lo que me has recomendado que haga, ¿No?
__________________
No te olvides de dar +1 a quien te echa un cable ;)
  #6 (permalink)  
Antiguo 03/08/2016, 14:57
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: ¿ Estaría el código bien orientado a objetos ?

Código PHP:
Ver original
  1. <?php
  2.  
  3. class Empleado {
  4.     private $nombre;
  5.     private $apellidos;
  6.     private $dni;
  7.     private $sueldoAnual;
  8.  
  9.     public function __construct($nombre, $apellidos, $dni, Salario $sueldoAnual) {
  10.         $this->setNombre($nombre);
  11.         $this->setApellidos($apellidos);
  12.         $this->setDni($dni);
  13.         $this->setSueldoAnual($sueldoAnual);
  14.     }
  15.  
  16.     public function getPrimerApellido() {
  17.         $porcion = explode(" ", $this->getApellidos());
  18.         return $porcion[0];
  19.     }
  20.  
  21.     public function getSegundoApellido() {
  22.         $porcion = explode(" ", $this->getApellidos());
  23.         return $porcion[1];
  24.     }
  25.  
  26.     public function getNombre() {
  27.         return $this->nombre;
  28.     }
  29.  
  30.     public function getApellidos() {
  31.         return $this->apellidos;
  32.     }
  33.  
  34.     public function getDni() {
  35.         return $this->dni;
  36.     }
  37.  
  38.     public function getSueldoAnual() {
  39.         return $this->sueldoAnual;
  40.     }
  41.  
  42.     public function setNombre($nombre) {
  43.         $this->nombre = $nombre;
  44.     }
  45.  
  46.     public function setApellidos($apellidos) {
  47.         $this->apellidos = $apellidos;
  48.     }
  49.  
  50.     public function setDni($dni) {
  51.         $this->dni = $dni;
  52.     }
  53.  
  54.     public function setSueldoAnual(Salario $sueldoAnual) {
  55.         $this->sueldoAnual = $sueldoAnual;
  56.     }
  57.  
  58. }
  59.  
  60. class Salario {
  61.  
  62.     private $cantidad;
  63.  
  64.     public function __construct($cantidad) {
  65.         $this->setCantidad($cantidad);
  66.     }
  67.  
  68.     public function getCantidad() {
  69.         return $this->cantidad;
  70.     }
  71.  
  72.     public function setCantidad($cantidad) {
  73.         $this->cantidad = $cantidad;
  74.     }
  75.  
  76.     public function modificar($porcentaje) {
  77.         $nuevaCantidad= $this->getCantidad() + $this->porcentaje($porcentaje);
  78.         $this->setCantidad($nuevaCantidad);
  79.     }
  80.  
  81.     public function porcentaje($porcentaje) {
  82.         return $this->getSueldoAnual() * $porcentaje / 100;
  83.     }
  84.  
  85. }
  86.  
  87.  ?>

Todo esto es muy bonito como introducción a la programación orientada a objetos, pero programar aplicaciones tochas es muchísmo más complejo.
KISS, DRY, principios SOLID, patrones de diseño, arquitectura de software, código limpio, refactorización...
  #7 (permalink)  
Antiguo 03/08/2016, 16:39
Avatar de rodrypaladin
Moderador
 
Fecha de Ingreso: abril-2010
Ubicación: Madrid
Mensajes: 2.127
Antigüedad: 14 años
Puntos: 468
Respuesta: ¿ Estaría el código bien orientado a objetos ?

Gracias por el ejemplo. Claro, esto es introductorio, supongo que hay mucho más que espero ver poco a poco.

En el ejemplo cuando pasas por parámetro: Salario $salarioAnual estás creando un nuevo objeto Salario llamado SalarioAnual de la misma manera que se hace con $salarioAnual = new Salario() ??
__________________
No te olvides de dar +1 a quien te echa un cable ;)
  #8 (permalink)  
Antiguo 04/08/2016, 14:42
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: ¿ Estaría el código bien orientado a objetos ?

No, en realidad esta indicando que ese método puede recibir como argumento una instancia de Salario tendrías que crear Salario y pasarlo como argumento
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #9 (permalink)  
Antiguo 05/08/2016, 12:57
Avatar de rodrypaladin
Moderador
 
Fecha de Ingreso: abril-2010
Ubicación: Madrid
Mensajes: 2.127
Antigüedad: 14 años
Puntos: 468
Respuesta: ¿ Estaría el código bien orientado a objetos ?

De acuerdo, entonces supongo que en el constructor en el momento que le asigno el sueldo, es ahí donde tendría que crear la instancia de la clase Salario. rectificarme si me equivoco ;)
__________________
No te olvides de dar +1 a quien te echa un cable ;)
  #10 (permalink)  
Antiguo 06/08/2016, 14:33
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: ¿ Estaría el código bien orientado a objetos ?

Claro que es posible hacerlo de esa forma, todo depende de lo que requieras
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #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, 9 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.

Etiquetas: objetos, orientado, php
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:08.