Lugar adecuado para la representación legible por humanos de la clave basada en la entidad

Primero algunos antecedentes. Recientemente pasamos de una solución basada en Zend_Db_Table a una solución basada en entidades (Doctrine). A medida que crecía nuestra aplicación, las clases de tablas se volvían más y más feas. Algunas de las tablas usaban columnas ENUM para almacenar claves basadas en cadenas, que se convertían en cadenas legibles por humanos con métodos estáticos. Algo como esto:

public static function getProductType($productKey)
{
    if (!array_key_exists($productKey, self::$productTypes)) {
        return null;
    }
    return self::$productTypes[$productKey];
}

public static function getProductTypes()
{
    return self::$productTypes;
}

Al pasar al sistema basado en entidades, traté de evitar los métodos estáticos en la medida de lo posible. Moví la clave para valorar las traducciones a un asistente de vista y lo detuve. Al final, descubrí que no era suficiente, ya que necesitábamos devolverlos en objetos JSON, lo que ocurría fuera de la capa de presentación (es decir, sin acceso directo a los asistentes de visualización).

¿Alguien tiene alguna teoría sobre el lugar adecuado para este tipo de métodos? ¿Debo crear objetos separados para hacer la traducción de la clave al valor legible por humanos, implementar métodos estáticos en el objeto de la entidad o algo más?

preguntado el 01 de julio de 12 a las 20:07

1 Respuestas

Bueno, mi teoría es que esto debería hacerse en el propio modelo. Pero a veces, cuando trato con un modelo complejo, me gusta crear una clase separada que maneje cualquier "presentación" especial de ese modelo. Toma el modelo como argumento y encapsula la lógica de presentación.

Entonces, usando tu ejemplo, tal vez algo como esto:

class Model_Product
{
    public static function getAllTypes()
    {
        return array(/* key-value pairs */);
    }

    //returns non human readable value
    public function getType()
    {
        return $this->_type;
    }
}

class Model_Product_Presenter
{
    protected $_model;

    public function __construct(Model_Product $model)
    {
        $this->_model = $model; 
    }

    //returns human readable value
    public function getType()
    {
        $types = $this->_model->getAllTypes();

        if (!array_key_exists($this->_model->type, $types)) {
            return null;
        }
        return $types[$this->_model->type];
    }

    public function getDateCreated($format = "Y-m-d")
    {
        return date($format,$this->_model->timestamp);
    }
}

Puede ir más allá y crear una clase de presentador base para definir cualquier tarea común, es decir, convertir marcas de tiempo en fechas, dar formato a números, etc.

Actualizar: Para el acceso anónimo a una lista de tipos de productos, no veo ningún daño en hacer que sea responsabilidad del modelo del producto a través de un método estático. No todos los métodos estáticos son malos. En mi opinión, el uso de métodos estáticos para este propósito está bien, porque declara una constante global.

En un escenario más complejo, delegaría esta responsabilidad a una clase separada como Model_ProductType. Aquí hay un ejemplo de un modelo tan complejo en producción:

https://github.com/magento/magento2/blob/master/app/code/core/Mage/Catalog/Model/Product/Type.php

Respondido 03 Jul 12, 18:07

¿Qué pasa con una situación en la que todos los datos clave => valor deben usarse para decir... un elemento desplegable? Si solo estoy tratando con entidades, la elección es simple, pero fuera de esa construcción, cuando no estoy usando ninguna entidad pero necesito datos relacionados con una entidad teórica, todavía estoy en el punto de partida. - webjawns.com

En mi opinión, mantener una lista de tipos de productos y las descripciones legibles por humanos asociadas debería ser responsabilidad de un modelo. En su ejemplo, dependiendo de la complejidad, podría ser parte del modelo Product o quizás un modelo ProductType. Si existe un requisito para el acceso anónimo a la lista mantenida, que así sea. Actualizaré mi respuesta con un ejemplo de modelo de producto del código fuente de Magento. Sus requisitos de Producto/Tipo parecen bastante complejos y obviamente garantizan una clase propia. - hamburguesa cristiana

Gracias por las respuestas, Cristian. Ha sido útil leer su opinión sobre estos asuntos. En lo que respecta a Magento, creo que Magento es una gran aplicación, pero su estructura es un poco diferente a la nuestra. Tienden a usar el patrón singleton y los métodos estáticos para impulsar su aplicación, mientras que nosotros no lo hacemos. Eso no quiere decir que no podamos encontrar algunas buenas ideas. Examinaré más a fondo lo que has sugerido aquí y veré si encaja. ¡Gracias de nuevo! - webjawns.com

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.