2012-06-16 10 views
11

Scala tiene dos instrumentos para expresar la composición de objetos: concepto original de self-type y composición trivial bien conocida. Soy curioso qué situaciones debo usar que en.cómo distinguir la composición y los casos de uso de auto-tipado

Hay diferencias obvias en su aplicabilidad. El tipo propio requiere que uses rasgos. La composición de objetos le permite cambiar extensiones en tiempo de ejecución con la declaración var.

Dejando los detalles técnicos detrás Puedo encontrar dos indicadores para ayudar con la clasificación de los casos de uso. Si algún objeto se utiliza como combinador para una estructura compleja como árbol o simplemente tiene varias partes similares escritas (relación de 1 automóvil a 4 ruedas), debe usar composición. Hay un caso de uso extremadamente opuesto. Supongamos que un rasgo se vuelve demasiado grande para observarlo claramente y se divide. Es bastante natural que use auto-tipos para este caso.

Las reglas no son absolutas. Puede hacer un trabajo extra para convertir código entre estas técnicas. p.ej. puede reemplazar la composición de 4 ruedas con auto-tipado sobre Product4. Puede usar Cake[T <: MyType] {part : MyType} en lugar de Cake { this : MyType => } para dependencias de patrones de torta. Pero ambos casos parecen contradictorios y le dan trabajo adicional.

Aunque hay muchos casos de uso de límite. Las relaciones uno-a-uno son muy difíciles de decidir. ¿Existe alguna regla simple para decidir qué tipo de técnica es preferible?

self-type te hace clases abstractas, la composición hace que tu código sea detallado. self-type te da problemas para mezclar espacios de nombres y también te da tipeo extra gratis (no solo tienes un cóctel de dos elementos, sino un cóctel de gasolina y aceite de motor conocido como bomba de gasolina).

¿Cómo puedo elegir entre ellos? ¿Qué consejos hay?

Actualización:

Vamos a discutir el siguiente ejemplo:

adapter. ¿Qué beneficios tiene con los enfoques de composición y selt-typing?

+0

Parece como si hubieras cubierto la mayoría de las compensaciones. Yo agregaría que es probable que la composición sea más familiar para los equipos menos capacitados. Puede tomar esto como una razón para usar la composición, ** o ** una razón para desalentar su uso en los casos fronterizos que anote, a fin de fomentar el aprendizaje y el crecimiento.En igualdad de condiciones, tiendo a escribir automáticamente solo por razones de verbosidad. No hay mucha ayuda aquí, me temo, por eso es un comentario en lugar de una respuesta. Excelente pregunta –

+0

¿Has encontrado la respuesta satisfactoria? – Optimight

+0

Tengo algunas respuestas filosóficas sin precisión técnica que deberían usarse en informática * ciencia *. La pregunta en sí es inapropiada – ayvango

Respuesta

3

Las siguientes sugerencias se derivan del enfoque heurístico (método de prueba y error de resolución de problemas utilizado cuando un enfoque algorítmico no es práctico) y no es compatible con ninguna fórmula (razonamiento basado en las matemáticas).

*** Las sugerencias que se proporcionan aquí deben evaluarse en referencia a los consejos que lo acompañan, ninguna sugerencia es una regla perfecta para distinguir la composición y los casos de uso de auto-tipado.

(Mientras que sigue a continuación se menciona consejos, no me importa o se centran en la verbosidad o el número de líneas de código de las entradas de esfuerzo o de programación.)

composición (significado del diccionario): el acto de la combinación de partes o elementos para formar un todo (Composición Trivial)

rasgo (Diccionario significado): una cualidad característica o distintivo

pistas para Trivial Composición (que se puede conseguir de super - mecanismo de la clase sub o relación de asociación) (por ejemplo, Coche y ruedas):

  • Que se pueden contar discretamente (ej.Ruedas)

  • que pueden clasificarse futher (basado en criterios) (por ejemplo, las ruedas - ruedas de aleación, rueda de acero, etc.)

  • que puede ser añadido o eliminado. (Nota: Cuando decimos que la rueda se detuvo, es en realidad la velocidad de rotación de la rueda se detiene, cuando decimos que el corazón se detuvo, en realidad la velocidad pulsante del corazón es cero)

  • generalmente aplicable a unos pocos (en el universo Algunos vehículos y algunas maquinarias tienen ruedas) (pocos pueden tener 10-15 o millones también - Para explicar, entendamos la afirmación: cuando el geólogo habla sobre el tiempo y lo dice hace algún tiempo, que significa Hace pocos millones de años, que depende del sujeto real)

Consejos para la Auto Tipo (Rasgo) (por ejemplo. Coche y velocidad):

  • Cuál es unidimensional (no en términos de la física), se pueden trazar en una recta numérica (cualquiera que sea la unidad física es) (por ejemplo, velocidad)

  • que no puede clasificarse de forma más natural (por ejemplo, velocidad) (o al menos no lo clasificarás más) Aquí, naturalmente, la palabra utilizada para transmitir el significado de que para clasificarla tendrás que depender de tus propios criterios y habrá una posibilidad definitiva de clasificarla en millones de subtipos. Múdate, puedes tener millones de subtratamientos de movimiento ... como mover en zigzag, rotar y avanzar, ... (posibilidad de millones con varias combinaciones de permutación).

  • que puede aumentarse o disminuirse o stoped (por ejemplo. La velocidad, la ira, el amor, etc.)

  • que por lo general se ve/se puede ver en las clases muy lejanamente colocados (por ejemplo, velocidad de la luz, velocidad de la tierra, la velocidad del corredor)

  • generalmente aplicable a muchos (en la mayoría universo (aquí todos los) objeto tiene velocidad)

    de desarrollo de software es como hacer su propio universo y como creador se define todo. Se verá un rasgo entre las clases ubicadas a distancia en su dominio (su propio universo).

Tenga en cuenta que no he visto ninguna palabra específica (aquí contraparte de rasgo) en cualquier idioma (sé muy pocos) para la parte que se utiliza para Trivial Composición.

una explicación más detallada:

Para obtener la respuesta que necesita para encontrar algún lugar profundo de la filosofía de la clase orientada o orientado a objetos aporach de desarrollo de software y la necesidad de comprender la mente y la lógica de los creadores de los lenguajes de programación tales como java y scala (o muchos más) que han inculcado el paradigma orientado a clases u orientado a objetos dentro de ese lenguaje.

Otra cosa que necesita es la comprensión profunda de la semántica (el estudio del significado o el estudio del desarrollo lingüístico clasificando y examinando cambios en el significado y la forma) que utilizamos para describir el mundo real y la semántica detrás de las palabras clave (en el lenguaje de programación) que usamos como programadores.

Creo que, cuando creamos una clase, queremos manifestar el mundo real en el software.La clase se convierte en representación de algo del mundo real, ya sea automóvil, humano, estrella, sueño, pensamiento o imaginación, etc.

Cuando alguien dice "Ruedas", tendrá una imagen nítida de su forma y aplicación y usted puede pensar en ruedas motrices o ruedas que ruedan en la carretera. La rueda siempre será parte de algo. Se puede contar en números discretos. Las ruedas se pueden clasificar en función de criterios como el material, la aplicación, el tamaño, etc. Las cosas con forma de rueda califican para la Composición Trivial.

Cuando alguien dice "Velocidad", no tendrá una imagen nítida ... sin forma ... sin color ... pero puede relacionarlo con cualquier parte móvil (relatividad) del universo. Es un rasgo característico. La velocidad no es parte de nada. Puede estar allí o no puede estar allí. Se puede trazar en una sola línea (ya sea dirección + o -). Es difícil clasificar "Velocidad". Velocidad como las cosas califica para el rasgo.

En mi opinión,

Si tomamos como un coche de clase (Objeto), "velocidad" como características debería ir tan rasgo en Scala. Y las partes similares a "ruedas", los componentes deberían entrar como "composición trivial". Las características de "velocidad" no tendrán una clasificación natural, donde "Ruedas" puede tener muchas clases y ellos mismos son objetos independientes (en realidad).

Si tomamos Human as a clase (Oject), "Ira, llanto, risa, etc." los comportamientos similares deben ir como rasgo y "manos, piernas, cerebro, corazón, etc." debería entrar como "Composición trivial" ya que ellos mismos son objetos independientes (en realidad).

Si pensamos en el nombre, se le puede dar a cualquier persona, cualquiera, es decir, nuestra estrella más cercana tiene un nombre "Sol", la montaña más alta tiene un nombre "Himalaya", mi perro tiene un nombre "Rocky", el río un nombre "Amazon" .... "Name" es un rasgo y no debe considerarse para "Trivial Composition".

Si pensamos en el corazón, los animales tienen corazón como su parte. Debe considerarse para "Composición Trivial" y no como un rasgo.

¿Qué es la clase?

Clase es una descripción o una impresión azul de un objeto en particular.

¿Qué es objeto?

El objeto es una realidad que se puede describir por la definición de clase.

(¿Huevo o gallina? ¿Qué fue primero?) Creo que el ingeniero de software primero piensa en Objetos y luego (para describirlos o hacerlos) (a partir de un plano) define la clase. (Tenga en cuenta que IN Modelado y Diseño Orientado a Objetos - Clase y Objeto complementan la existencia del otro.) ("¿Huevo o gallina? ¿Qué fue primero? Es por coexistencia de clase y objeto y no tiene relevancia con el famoso Círculo-Eclipse Problema (http://en.wikipedia.org/wiki/Circle-ellipse_problem) como más tarde se relaciona con la herencia o polimorfismo subtipo)

interfaz:. una cosa que permite elementos separados y, a veces incompatibles para coordinar eficazmente

El desarrollo de software es como crear su propio universo y como creador usted define todo. La composición debe preferirse a la de herencia (Pandilla de cuatro: patrones de diseño)

+0

el punto "que se puede clasificar más" también para el trabajo de autodescripción. p.ej. utilizamos el rasgo móvil y los subtratos que definen el movimiento estrecho, el movimiento del remolino, etc. – ayvango

+0

ser capaz de detener es mucho más para la composición que el auto-tipado. parte de ti no puede dejar de trabajar (ya que los humanos no pueden vivir con el corazón detenido). – ayvango

+0

hay una gran diferencia en la relación padre-hijo. Si el padre se compuso en dos partes a través de la composición que tiene el tamaño de los métodos(), puede calcular el tamaño total como máximo (a.size(), b.size()) o a.size() + b.size() y así sucesivamente. Si este caso está cubierto con auto-tipado, todas las partes son iguales y deben usar el patrón de rasgo apilable – ayvango