Soy relativamente novato en términos de POO, y aún no he encontrado mi "instinto" en cuanto a la forma correcta de hacerlo. Como ejercicio, estoy tratando de averiguar dónde crearías la línea entre diferentes tipos de objetos, usando las bebidas en mi escritorio como ejemplo.OOP. Elección de objetos
Suponiendo puedo crear un objeto Drink
, que tiene atributos como volume
y temperature
, y métodos como pour()
y drink()
, estoy luchando para ver dónde 'tipos' de bebida específica entran en juego.
Decir que tengo una bebida tipos de Tea
, Coffee
o Juice
, mi primer instinto es la subclase Drink
ya que tienen atributos y métodos en común.
El problema entonces se convierte en tanto Tea
y Coffee
tienen atributos como sugars
y milk
, pero Juice
no lo hace, mientras que los tres tienen una variant
(Earl Grey, descafeinado y naranja respectivamente).
Del mismo modo, Tea
y Coffee
tienen un método addSugar()
, mientras que eso no tiene sentido para un objeto Juice
.
Lo que significa que la superclase debe tener esos atributos y métodos, incluso si todas las subclases no los necesitan, o los defino en las subclases, especialmente para atributos como variant
, donde cada subclase tiene su propia lista de valores válidos?
Pero luego termino con dos métodos addSugar()
, en las subclases Tea
y Coffee
.
O dado que termino poniendo todos los atributos y métodos en la superclase, ya que la mayoría se comparte entre al menos un par de tipos de bebidas, me pregunto cuál fue el objetivo de subclasificar en absoluto?
Me temo que estoy tratando de abstraer demasiado, pero no quiero respaldarme en una esquina si quisiera agregar un nuevo tipo, como Water
-con variant
todavía o destellando en el camino.
No es una respuesta directa a su pregunta, pero me pareció útil: aparte de los libros y fuentes de OOP, busque también * refactoring * material (por ejemplo, Refactorización de M. Fowler).Puede encontrar ejemplos concretos de códigos y acciones apropiadas para solucionarlos. Algunos ejemplos (Reemplazar condicional con polimorfismo, Generalizar tipo, etc.) le muestran algunas de las mejores prácticas simples en OOP, y pueden ayudar a reconocer el problema en el diseño en la fase inicial. – Groo