Intuición vs principios de diseño

Si bien la composición tiene muchos beneficios sobre la herencia, no hay nada de malo en usar la herencia donde se siente natural (es decir, en un verdadero is-a relación). Si es natural, adelante y úsalo.

Respuesta 1

La composición significa que A tiene una B, y la herencia significa que A es una especie de B. En su caso tiene el 100% de razón: la herencia debe usarse: latee es un café y un café es una bebida.

¿Por qué lo consideras frágil? Por ejemplo, latee debe tener todas las propiedades del café, pero puede implementarlas de manera diferente. Nada frágil aquí, es un polimorfismo. Si desea restringir la anulación de los métodos de los padres, márquelos como finales.

Como ejemplo de composición, hay Car and Wheel. El auto tiene una rueda. El coche necesita ruedas para trabajar, pero son objetos completamente diferentes. El automóvil se puede abrir, cerrar, arrancar, etc. - la rueda no. La rueda puede revolverse y desinflarse. El auto no puede.

PD: Oh, creo que entendí lo que quieres decir con "frágil". Aquí hay un artículo sobre él http://www.javaworld.com/article/2076814/core-java/inheritance-versus-composition--which-one-should-you-choose-.html Para mí esta "composición en lugar de la herencia "todavía se parece a un hackeo OOP (especialmente, el ejemplo en el artículo: apple IS A fruit, no hay forma de evitarlo :)) Cada vez que vea este hack en uso, probablemente pensaría en un diseñador de API para ser imprevisto .

Respuesta: 2

Creo que en los primeros patrones de diseño de la cabecera del libro, el ejemplo que usan es que la clase latte puede tener varias configuraciones. Mediante el uso de la composición, puede crear clases personalizadas en tiempo de ejecución en lugar de durante el diseño

También puede extenderse desde una sola clase, lo que puede ser un factor limitante dependiendo de lo que esté haciendo.

Respuesta: 3

Sí, a primera vista, la herencia aquí parece ir bien con el argumento de que, donde sea que sea natural, tiene sentido tener herencia. El café es una bebida y el café con leche es un café, por lo que la herencia está bien.

Aunque tiene sentido, ¿qué pasa si tenemos más tipos de cafés: cappuccino, frappe, etc. Entonces, hacemos más subtipos? Creo que entonces podemos usar un patrón de decorador donde Latte extiende el café y será un café, etc. En este caso haremos uso de la composición y la herencia juntas. Entonces, torciendo un poco el argumento, en este caso necesitamos tanto Composición como Herencia y no uno u otro.

Habiendo dicho eso (y si compraste lo que dije anteriormente), ¿qué pasaría si seguimos decorando este Latte al tener variantes Latte americano y Latte francés? Entonces, ¿cuál es nuestra clase base para un decorador? ¿Es café o café con leche? Si elegimos Café, entonces el Latte Americano está compuesto por Latte que está compuesto por Café. La composición es unir todo. Sin embargo, si decimos que es Latte, entonces hacemos otro componente de decorador base, es decir, Latte. Luego tenemos 2 niveles de decoradores: uno centrado alrededor del café y otro (1 nivel por debajo) centrado alrededor del café con leche, lo que lo hace demasiado confuso. Por lo tanto, tiene más sentido tener a Coffee como decorador abstracto y usar la composición para traer Latte y luego café con leche francés / americano. Entonces, la composición tiene una ventaja sobre la herencia aquí.

Respuesta: 4

He estado usando la estructura de datos Counter () en Python como un almacén de valores clave que me permite ordenar los objetos según su valor utilizando el método most_common. Más información aquí. Esta ahí ...

Tengo una cadena que se parece a esto: "n AÑOS n MESES SEMANAS n DÍAS" (tenga en cuenta que las constantes pueden o no estar pluralizadas) Necesito convertir esto a un objeto del Período Joda o un ...

Si tengo las siguientes propiedades en application.yaml: myPro: prop1: prop1value prop2: prop2value .... ¿Hay alguna forma de cargar esto en un objeto de Propiedades de Java?

Estoy tratando de usar la última versión 3.4.0 de Selenium en un proyecto maven. Importé todos los frascos de Selenium usando la siguiente dependencia: - <dependencia> <groupId> org.seleniumhq.selenium </ ...