2011-03-24 12 views
6

Tengo una pregunta sobre dos operaciones que comúnmente se ven en un diagrama de clase compuesto de ejemplo.
* GetDescendents
* GetChild (int)preguntas de diseño de patrón compuesto

Un ejemplo común es la de archivos y directorios, me quedo con eso. Digamos que la operación de interés es Tamaño, por lo que el archivo tiene un tamaño real y el Directorio tiene un Tamaño derivado de la iteración recursiva de GetDescendents. Hasta aquí todo bien. Mi pregunta tiene que ver con el uso del cliente de GetDescendents. Digamos que necesita los archivos en un directorio que son imágenes para alguna operación dada. En la práctica, se usa una combinación de GetDescendents y Children para devolver los archivos de imagen (dependiendo de si el cliente quería todos los archivos de imágenes anidados o simplemente en el nivel raíz).

Así que la pregunta número uno es, ¿no es probable que tenga un método GetImageFiles en el compuesto en lugar de hacer que el cliente lo resuelva? Y suponiendo que sea así, ¿es GetDescendents práctico para exponer a las llamadas de los clientes (como el ImageViewer) fuera de la composición?

La segunda pregunta sobre GetChild (int); ¿Es el int índice de posición ordinal para devolver un solo hijo? Un nivel de profundidad en GetDescendents? ¿Cuál sería un ejemplo de cómo un cliente usaría ese método?

Saludos,
Berryl

Respuesta

4

Estas preguntas no son sobre el patrón compuesto per se, sino sobre el tema más importante de la forma de hacer el diseño de la API y comunicarse de forma inequívoca su intención como desarrollador de clase.

Por ejemplo, si quiere que su GetChild(int) le proporcione al hijo inmediato indexado, puede darle el nombre GetChildAtIndex(int index); si desea que le dé a los niños un cierto nivel en la jerarquía, puede ponerle el nombre GetChildrenAtLevel(int level) (tenga en cuenta que esto es plural y devuelve una colección).

Depende de usted como diseñador de la clase exponer las operaciones suficientes como para hacer que su clase sea comprensible y utilizable. Si cree que una operación muy común sería obtener los archivos de imagen en la estructura de su directorio, podría exponer un método GetAllImageFiles(). Sin embargo, para una clase de directorio más general, esta opción parece arbitraria y está en el nivel de abstracción incorrecto. ¿Por qué los archivos de imagen son tan especiales? En su lugar, podría proporcionar un método más general que obtenga todos los archivos en función de sus extensiones o un método que tome un predicado para filtrar los resultados según los criterios proporcionados por el cliente.

+0

Exactamente. Mi pregunta es si * siempre * tiene sentido exponer las operaciones de los niños a clientes que no forman parte de la composición, o al menos tienen una relación muy íntima con ella, es decir, son operaciones internas para producir una operación de consumo de cliente como GetFilesOfType.(). – Berryl

+0

@Berryl: depende de lo que represente su clase. El "patrón" es solo un detalle de implementación, lo importante es el "concepto". –