David West en su libro Object Thinking (capítulo 10, sección 1, subsección 2) propuso que en un entorno ideal de OO, todos los objetos deberían ser capaces de presentarse a pedido; ya sea para humanos (como GUI), componentes no nativos (como JSON y / o XML), o cualquier otra parte interesada:
El pensamiento de objetos dice que una vista (a veces llamada interfaz), gráfica o de otro tipo, es un medio para que un objeto se comunique con otro objeto y nada más. La necesidad de una vista surge cuando un objeto necesita presentarse en forma "no nativa" a algún otro objeto (generalmente un ser humano) o aplicación (por ejemplo, una vista XML para objetos de datos que se comparten entre plataformas).
El descubrimiento de la necesidad y los parámetros que debe satisfacer una vista se manifiesta en los escenarios en los que participa el objeto. Cada vez que se le pide a un objeto que se muestre, debe usar una vista, una representación, apropiada para el remitente de ese mensaje. Si, por ejemplo, un objeto está tratando de instanciarse (obtener un valor para sí mismo), debe presentar una vista de sí mismo como una solicitud implícita a un ser humano (u otro objeto proveedor de servicios) de un valor. Si estamos creando una GUI que servirá como intermediario entre un objeto de software y un objeto humano, usaremos glifos para mostrar y widgets para interactuar.
Pero, ¿qué glifos y widgets deben incluirse en la GUI? Solo aquellos necesarios para completar el escenario o escenarios 4 de interés inmediato a medida que se ejecuta la aplicación. Esta perspectiva es contradictoria para la mayoría de los desarrolladores porque sugiere que se defina una GUI desde la aplicación.
Como ejemplo, considere una cervecería. A un lado hay cubas llenas de cerveza. En una línea de producción compleja que consiste en lavadoras de botellas, estaciones de llenado, máquinas tapadoras y ensambladores de paquetes. Por encima de todo, hay una estación de control que monitorea la cervecería y notifica a los gerentes humanos sobre el estado y los problemas. Es probable que los desarrolladores tradicionales comiencen su análisis y diseño de "un sistema de gestión de cervecería" desde el punto de vista del panel de control. Esto es análogo al diseño desde la interfaz en.
El pensamiento de objetos sugeriría, en cambio, que considere qué objeto es el principal cliente de la cervecería y todas sus innumerables máquinas. ¿En nombre de quién existe el complejo laberinto de equipos? La respuesta comercial correcta es, por supuesto, "El cliente". Pero una respuesta más reflexiva del pensamiento de objetos es: "La cerveza". Todos los escenarios están escritos desde la perspectiva de la cerveza, tratando de meterse en una botella, con una tapa, colocada en un paquete y residente en un camión. El panel de control es un observador pasivo 5 del estado de la cervecería. Si la cerveza encuentra un problema en algún momento, es responsabilidad de la cerveza solicitar la intervención de los operadores humanos enviando un mensaje al panel de control (o paneles de control específicos de la máquina) solicitando un servicio de intervención.
Esta perspectiva simplificará el diseño de la GUI y, lo que es más importante, eliminará la gran cantidad de objetos de administrador y controlador que parecen surgir inevitablemente al diseñar desde la perspectiva del panel de control (GUI).
Viniendo de un principiante en el mundo OO: ¿debería ser este el caso?
Tener objetos que sepan cómo representarse a sí mismos seguramente podría reducir la cantidad de objetos de controlador / administrador que West dijo repetidamente en su libro que un pensador de objetos supuestamente debería tratar de evitar a toda costa. ¿Pero acatar esta "regla" no romperá el SRP ?
Además (si resultó ser el caso), dada una implementación típica en, por ejemplo, una aplicación de Android: ¿Cómo podría uno lograr este tipo de objetivo? ¿Debería cada objeto que creamos saber presentarse como a View?