Ver Mensaje Individual
  #5 (permalink)  
Antiguo 04/11/2008, 09:54
Casuis
 
Fecha de Ingreso: septiembre-2005
Mensajes: 142
Antigüedad: 18 años, 8 meses
Puntos: 3
Respuesta: Problema con objetos

Dios cuanta sobrecarga de herencia para tan poca funcionalidad. La POO está para ayudar y clarificar el código no para ofuscarlo.


Tienes 3 problemas fundamentales:

1) PHP4 desaparece. Si estas haciendo un site nuevo ves pensando seriamente en hacerlo con PHP5.

2) Problemas de responsabilidades entre objetos.

3) Documentacion

Creo que las clases heredadas no tienen porque tener la herencia de Idioma ya que tienen responsabilidades diferentes.

Hace tiempo que no escribo (un veterano de vuelta jaja) así que espero que me perdones por la parrafada asociada. Voy a intentar resolverte los 3 problemas con tus mismas clases:

clase Idiomas:
Código PHP:
/**
 * Gestion sobre la informacion del idioma. Mini I18N hehehe que frikada.
 * @category Idiomas
 * @package Idiomas
 */
class Idiomas 
{
      
/**
       * Idioma actual
       *
       * @var string con el idioma actual
       */
      
private $_idioma;
      
      
/**
       * Array con la informacion de cada lengua
       * tipos de archivos asociados, traduccion de las keys etc..
       *
       * @var array
       */
      
private $_idiomasArray;
      
      
/**
       * Instancia que se asegurara que solo haya un objeto del tipo Idiomas
       *
       * @var Idiomas
       */
      
private static $_instance null;
      
      
/**
       * constructor por defecto
       *
       */
      
private function __construct()
      {
          
// inicializamos las variables
          
$this->_idiomasArray = array(
                          
"Es" => array (
                                
"Nombre" => "Español",
                                
"Archivo" => "spanish.php"
                          
),
                          
"En" => array (
                                
"Nombre" => "English",
                                
"Archivo" => "english.php"
                          
)
                    );
                    
         
$this->_idioma = isset($_COOKIE["idioma"]) ? $_COOKIE["idioma"] : 'Es';
      }
      
      
/**
       * Singleton devuelve una unica instancia de la clase
       *
       * @return Idiomas
       */
      
public static function getInstance()
      {
          if(
self::$_instance == null)
              
self::$_instance = new self;
          return 
self::$_instance;
      }

      
/**
       * Devuelve un array con el idioma seleccionado
       * o por defecto el establecido
       *
       * @param string $idioma
       * @return array datos con el idioma
       */
      
public function getIdiomaInfo($idioma null)
      {
          if(
$idioma == null)
              
$idioma $this->_idioma;
                  
          return 
$this->_idiomasArray[$idioma];
      }
      
      
/**
       * devuelve el idioma actual
       *
       * @return string
       */
      
public function getIdioma(){
          return 
$this->_idioma;
      }
      
      
/**
       * Devuelve el nombre del idioma
       *
       * @param string $idioma
       * @return string nombre del idioma
       */
      
public function getNombre($idioma null)
      {
          if(
$idioma == null)
              
$idioma $this->_idioma;
              
          
$idioma_seleccionado $this->getIdiomaInfo($idioma);
          return 
$idioma_seleccionado['Nombre'];              
      }
      
      
/**
       * Devuelve el nombre del archivo de mensajes asociado al idioma
       *
       * @param string $idioma
       * @return string nombre del fichero asociado al idioma
       */
      
public function getArchivo($idioma null)
      {
          if(
$idioma == null
              
$idioma $this->_idioma;
              
          
$idioma_seleccionado $this->getIdiomaInfo($idioma);
          return 
$idioma_seleccionado['Archivo'];
      }


clase Mensajes:
Código PHP:
/**
 * Gestion sobre los mensajes a traducir.
 * @category Idiomas
 * @package Idiomas
 * 
 */
class Idiomas_Mensajes {

      
/**
       * Traducira un mensaje basado en el idioma establecido
       *
       * @param string $mensaje sera la key a traducir
       */
      
public static function imprimir($mensaje
      {
              
$fichero Idiomas::getInstance()->getArchivo();
              require_once 
'inc/' $fichero;
            echo 
$lit[$mensaje]; // ??? esto nose de donde sale;
      
}

clase Sitio:
Código PHP:
/**
 * Clase creada para bajar el benckMark del site.
 * @category Idiomas
 * @package Idiomas
 * 
 */
class Idiomas_Sitio 
{
    
    public function 
__construct()
    {
        echo 
'Idioma: 'Idiomas::getInstance()->getNombre();
    }

Idiomas: He tranformado la clase idiomas en un singleton ya que solo trabajaremos con un objeto así encapsulamos su responsabilidad y podemos gestionarlo desde cualquier parte.

Mensajes: su método es estático ya que su salida siempre será la misma. Evitamos tener copias de objetos repetidos que hacen la misma funcionalidad y sobre los que no vamos a operar.

Idiomas_Sitio: ejem.... No entiendo para que has creado esta clase. Con los cambios actuales solo tendrias que hacer esto: Idiomas::getInstance()->getNombre()

Espero que el código te ayude a comprender un poco las responsabilidades aunque no te preocupes mucho todo es práctica y todos hemos pasado por esto.

Saludos