Ver Mensaje Individual
  #11 (permalink)  
Antiguo 07/05/2014, 10:30
Avatar de guardarmicorreo
guardarmicorreo
 
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: Duda con funcionamiento y organización de Traits

:) creía que me había quedado claro, pero veo que no.

Italico76 dijo que los Traits se pueden evitar desacoplando en mayor medida las clases, cosa que creo que es discutible y que no tienen mucho que ver una cosa con la otra.

Pero en general entendí que los Traits, por muy útiles que sean, no están contemplados en el futuro de la mayoría de lenguajes porque es algo que lleva a crear código dañino a la vista (como el mío :D ).

Pero ahora llegais hhs y dashtrash y le dais un nuevo enfoque. Fascinante :D

vamos a ver si me entero sobre código

Esto sería la herencia simple en PHP
Código PHP:
Ver original
  1. <?php
  2.  
  3. abstract class A {
  4.  
  5.     public static function saymethodsA() {
  6.         return get_class_methods('A');
  7.     }
  8.  
  9. }
  10.  
  11. class B extends A {
  12.  
  13.     public function printmethods() {
  14.         ?>
  15.         <pre>
  16.         <?php
  17.         var_dump(parent::saymethodsA());
  18.     }
  19.  
  20. }
  21.  
  22. B::printmethods();
  23. /*
  24.  * imprime
  25.  *
  26.    array(1) {
  27.     [0]=>
  28.     string(11) "saymethodsA"
  29.    }
  30.  *
  31.  */

Esto es el uso de Traits para simular la herencia múltiple solucionando ciertos problemas que conlleva la herencia múltiple como tal.
Código PHP:
Ver original
  1. abstract class E {
  2.  
  3.     public static function saymethodsE() {
  4.         return get_class_methods('C');
  5.     }
  6.  
  7. }
  8.  
  9. Trait coreEF{
  10.     public static function saymethods($class){
  11.         return get_class_methods($class);
  12.     }
  13. }
  14.  
  15. class F{
  16.     use coreEF;
  17. }
  18.  
  19. ?>
  20. <pre>
  21. <?php
  22. var_dump(F::saymethods('A'), F::saymethods('B'), F::saymethods('E'), F::saymethods('F'));
  23.  
  24. /*
  25.  * imprime
  26.  */
  27. //array(1) {
  28. //  [0]=>
  29. //  string(11) "saymethodsA"
  30. //}
  31. //array(2) {
  32. //  [0]=>
  33. //  string(12) "printmethods"
  34. //  [1]=>
  35. //  string(11) "saymethodsA"
  36. //}
  37. //array(1) {
  38. //  [0]=>
  39. //  string(11) "saymethodsE"
  40. //}
  41. //array(1) {
  42. //  [0]=>
  43. //  string(10) "saymethods"
  44. //}

¿Cómo se podría resolver el problema de los Traits desacoplando las clases unas de otras?

(Entiendo desacoplar como la estrategia de componer/construir/escribir clases de manera que unas dependan de las otras lo menos posible)

A mi solo se me ocurren dos posibilidades y no estoy seguro de la segunda:

1) metiendo en clases funcionalidades que no guardan relación entre si, por lo tanto se estaría rompiendo lo que es el concepto de POO.

2) utilizando los namespaces de manera tal que dentro de las propias clases se utilicen otras clases.

EDITO:

hhs no me confundas más!! jaja que me costó mucho entender la gran enorme diferencia entre interfaz (algo raro que no entiendo su utilidad relevante) y el resto de código ejecutable y útil, como clases y traits :D
__________________
Ayúdame a hacerlo por mi mismo.

Última edición por guardarmicorreo; 07/05/2014 a las 10:38