No , un objeto no tiene que representar una entidad.
De hecho, diría que cuando dejas de pensar en los objetos como entidades físicas es cuando finalmente obtienes los beneficios que promete OOP.
Este no es el mejor ejemplo, pero el diseño de la cafetera es probablemente donde la luz comenzó a encenderse para mí.
Los objetos son sobre mensajes. Se trata de responsabilidades. No se trata de automóviles, usuarios u órdenes.
Sé que enseñamos a OO de esta manera, pero después de algunos intentos se hace evidente cuán fundamentalmente frustrante es descubrir adónde van las cosas cuando intentas hacer MVC, MVVM o MVWhatever. O tus modelos se vuelven ridículamente hinchados o tus controladores lo hacen. Para la navegabilidad, es bueno saber que todo lo que toca Vehículos está en el archivo Vehicle.ext, pero cuando su aplicación es sobre Vehículos, inevitablemente termina con 3000 líneas de espagueti en ese archivo.
Cuando tiene que enviar un nuevo mensaje, tiene al menos un nuevo objeto, y quizás un par de ellos. Entonces, en su pregunta sobre un conjunto de métodos, diría que potencialmente está hablando de un conjunto de mensajes. Y cada uno podría ser su propio objeto, con su propio trabajo que hacer. Y eso esta bien. Será evidente a medida que separas las cosas que realmente necesitan estar juntas. Y los pones juntos. Pero no deja caer inmediatamente todos los métodos en un cajón vagamente apropiado por razones de conveniencia si desea disfrutar de OO.
Hablemos de bolsas de funciones.
Un objeto puede ser solo una colección de métodos y seguir siendo OO, pero mis "reglas" son bastante estrictas.
La colección debe tener una única responsabilidad, y esa responsabilidad no puede ser tan genérica como "Hace cosas a los motores". Podría hacer algo como una fachada de capa de servicio, pero soy muy consciente de que soy flojo por razones de navegación / descubrimiento, no porque esté tratando de escribir código OO.
Todos los métodos deben estar en una capa consistente de abstracción. Si un método recupera objetos de Motor y otro devuelve Caballos de fuerza, probablemente eso esté demasiado separado.
El objeto debería funcionar en el mismo "tipo" de datos. Este objeto hace cosas a los motores (inicio / parada), este hace cosas con longitudes de manivela, este maneja la secuencia de encendido, este toma una forma html. Estos datos podrían ser campos del objeto y parecería coherente.
Generalmente construyo objetos de este tipo cuando estoy haciendo transformaciones, composición, o simplemente no quiero preocuparme por la mutabilidad.
Creo que centrarme en las responsabilidades objetivas me lleva a la cohesión. Tiene que haber cierta cohesión para ser un objeto, pero no es necesario que haya ningún campo ni mucho comportamiento para que sea un objeto. Si estuviera construyendo un sistema que necesitara esos 5 métodos motores, comenzaría con 5 objetos diferentes que hacen esas cosas. A medida que encontraba algo en común, comenzaba a fusionar las cosas o a usar objetos "auxiliares" comunes. Eso me lleva a inquietudes abiertas / cerradas: ¿cómo puedo extraer este bit de funcionalidad para que nunca tenga que modificar ese archivo en particular nuevamente pero aún así usarlo donde sea necesario?
Los objetos son sobre mensajes
Los campos apenas le importan a un objeto: obtener y establecer registros no cambia el mundo fuera del programa. Colaborar con otros objetos hace el trabajo. Sin embargo, la fortaleza de OO es que podemos crear abstracciones para no tener que pensar en todos los detalles individuales a la vez. Las abstracciones que se filtran o no tienen sentido son problemáticas, por lo que pensamos profundamente (demasiado, tal vez) sobre la creación de objetos que coincidan con nuestros modelos mentales.
Pregunta clave: ¿Por qué estos dos objetos necesitan comunicarse entre sí?
Piense en el objeto como un órgano en una persona: tiene un propósito predeterminado y solo cambia el comportamiento cuando recibe un mensaje específico que le interesa.
Imagina un escenario en el que estás en el cruce de peatones y un automóvil viene rápido. Como objeto del cerebro, detecto un factor estresante. Le digo al hipotálamo que envíe hormona liberadora de corticotropina. La glándula pituitaria recibe ese mensaje y libera la hormona corticotrófica suprarrenal. Las glándulas suprarrenales reciben ese mensaje y crean adrenalina. Cuando el objeto muscular recibe ese mensaje de adrenalina, se contrae. Cuando el corazón recibe el mismo mensaje, late más rápido. Hay toda una cadena de jugadores involucrados en comenzar el comportamiento complejo de correr a toda velocidad en la calle y son los mensajes lo que importan. El objeto cerebral sabe cómo hacer que el hipotálamo envíe la alerta, pero no conoce la cadena de objetos que eventualmente harán que el comportamiento suceda. Del mismo modo, el corazón no tiene idea de dónde viene la adrenalina,
Entonces, en este ejemplo ( simplificado ), el objeto de la glándula suprarrenal solo necesita saber cómo tomar ACTH y producir adrenalina. No necesita ningún campo para hacer eso, sin embargo, todavía me parece un objeto.
Ahora, si nuestra aplicación está diseñada solo para correr a través de la calle, es posible que no necesite la glándula pituitaria y los objetos de la glándula suprarrenal. O solo necesito un objeto de glándula pituitaria que solo haga una pequeña parte de lo que conceptualmente podríamos ver como el "modelo de glándula pituitaria". Todos estos conceptos existen como entidades conceptuales, pero es software y podemos hacer AdrenalineSender o MuscleContractor o lo que sea y no preocuparnos mucho por la "incompletitud" de nuestro modelo.