Ver Mensaje Individual
  #10 (permalink)  
Antiguo 24/07/2013, 22:17
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 5 meses
Puntos: 379
Respuesta: Duda modelando usando POO

Cita:
Iniciado por wigglyUtrera Ver Mensaje
Hola, antes de hacer el código en PHP, tengo un modelo UML y me ha surgido una duda de concepto...

Tengo el siguiente modelo UML:



¿Cómo se modelaría esa situación? ¿Valdría tal y como está y sería en BD donde tengo la restricción de qué estado se usa para un problema determinado?
Viendo tu diagrama de clases y leyendo el hilo completo, lo que quieres explicar es que necesitas representar un objeto que depende de su estado interno, en otras palabras lo que necesitas es un objeto que cambie su comportamiento cuando cambie su estado. Asi como tienes el diagrama no es suficiente para que alguien mas sepa que va hacer con el. Necesitas agregarle notas y documentarlo para saber que hace y agregarle sus respectivos diagramas de secuencia y colaboración y en este caso en particular el diagrama de estados que representa tu modelo.
Si lo que comente antes es lo que necesitas, ya no tienes que hacerlo dos veces ya se le ocurrio a alguien mas en particular tu caso se le conoce como State Pattern y puedes ver su diagrama de clases y explicacion en el siguiente enlace: http://www.dofactory.com/Patterns/PatternState.aspx

Las clases concretas implementan la interface State la solicitudes de cambio en el estado se solicitan a través del contexto
Usando el ejemplo de Italico76 podemos implementar el patron.
Código PHP:
Ver original
  1. <?php
  2.         //interface
  3.             interface IProblemState{
  4.            
  5.                 public function assigned();
  6.                 public function pending();
  7.                 public function resolved();
  8.            
  9.             }
  10.         //Contexto
  11.             class Problem{
  12.            
  13.                 private $assigned;
  14.                 private $pending;
  15.                 private $resolved;
  16.                 private $state;
  17.                
  18.                 public function __construct(){
  19.                
  20.                     $this->assigned = new ProblemAssignedState($this);
  21.                     $this->pending = new ProblemPendingState($this);
  22.                     $this->resolved = new ProblemResolvedState($this);
  23.                     $this->state = $this->assigned;
  24.                 }
  25.                
  26.                 public function setState(IProblemState $state){
  27.                
  28.                     $this->state = $state;
  29.                
  30.                 }
  31.                
  32.                 public function getState(){
  33.                
  34.                     return $this->state;
  35.                
  36.                 }
  37.                
  38.                 public function assigned(){
  39.                
  40.                     $this->state->assigned();
  41.                
  42.                 }
  43.                
  44.                 public function pending(){
  45.                
  46.                     $this->state->pending();
  47.                
  48.                 }
  49.                
  50.                 public function resolved(){
  51.                
  52.                     $this->state->resolved();
  53.                
  54.                 }
  55.                
  56.                 public function getAssigned(){
  57.                
  58.                     return $this->assigned;
  59.                
  60.                 }
  61.                
  62.                 public function getPending(){
  63.                
  64.                     return $this->pending;
  65.                
  66.                 }
  67.                
  68.                 public function getResolved(){
  69.                
  70.                     return $this->resolved;
  71.                
  72.                 }
  73.                
  74.             }
  75.            
  76.             //Clases concretas
  77.  
  78.             class ProblemAssignedState implements IProblemState{
  79.            
  80.                 private $problem;
  81.                
  82.                 public function __construct(Problem $problem){
  83.                
  84.                     $this->problem = $problem;
  85.                
  86.                 }
  87.                
  88.                 public function assigned(){
  89.                     echo 'Problema asignado!!! <br>';
  90.                
  91.                 }
  92.                
  93.                 public function pending(){
  94.                    
  95.                     echo 'Estado del problema: Pendiente <br>';
  96.                     $this->problem->setState($this->problem->getPending());
  97.                 }
  98.                
  99.                 public function resolved(){
  100.                
  101.                     echo 'Este problema todavia no esta pendiente <br>';
  102.                
  103.                 }
  104.            
  105.             }
  106.            
  107.             class ProblemPendingState implements IProblemState{
  108.            
  109.                 private $problem;
  110.                
  111.                 public function __construct(Problem $problem){
  112.                
  113.                     $this->problem = $problem;
  114.                
  115.                 }
  116.                
  117.                 public function assigned(){
  118.                     echo 'Estado del problema pendiente <br>';
  119.                
  120.                 }
  121.                
  122.                 public function pending(){
  123.                    
  124.                     echo 'Problema Pendiente!!! <br>';
  125.                    
  126.                
  127.                 }
  128.                
  129.                 public function resolved(){
  130.                
  131.                     echo 'Estado del problema resuelto <br>';
  132.                     $this->problem->setState($this->problem->getResolved());
  133.                 }
  134.            
  135.             }
  136.            
  137.             class ProblemResolvedState implements IProblemState{
  138.            
  139.                 private $problem;
  140.                
  141.                 public function __construct(Problem $problem){
  142.                
  143.                     $this->problem = $problem;
  144.                
  145.                 }
  146.                
  147.                 public function assigned(){
  148.                     echo 'Estado del problema resuelto <br>';
  149.                
  150.                 }
  151.                
  152.                 public function pending(){
  153.                    
  154.                     echo 'Estado del problema resuelto <br>';
  155.                
  156.                 }
  157.                
  158.                 public function resolved(){
  159.                
  160.                     echo 'Problema resuelto!!! <br>';
  161.                     //$this->problem->setState($problem->getResolved());
  162.                
  163.                 }
  164.            
  165.             }
  166.            
  167.             $problem = new Problem();
  168.             $problem->assigned();
  169.             $problem->resolved();
  170.             $problem->pending();
  171.             $problem->assigned();
  172.             $problem->resolved();
  173.             $problem->resolved();
  174.        
  175.         ?>
Espero haber aclarado tu duda.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.