OK, como otros señalan que el código no es excelente porque está bloqueando el código de una jerarquía específica. Puede presentar problemas de depuración, y no es agradable de leer, pero el punto principal es que el código que toma una tarea sabe demasiado sobre cómo atravesar para obtener algo de carpeta. De dólares a donuts, alguien querrá insertar algo en el medio. (todas las tareas están en una lista de tareas, etc.)
Salir en una extremidad, ¿son todas estas clases solo nombres especiales para la misma cosa? es decir, ¿son jerárquicos, pero cada nivel tiene quizás algunas propiedades adicionales?
Por lo tanto, desde un ángulo diferente, voy a simplificar a una enumeración y una interfaz, donde las clases secundarias delegan la cadena si no son lo que se solicita. Por el bien de la discusión, los estoy llamando carpetas.
enum FolderType { ActionPlan, ClientFile, Client, etc }
interface IFolder
{
IFolder FindTypeViaParent(FolderType folderType)
}
y cada clase que implementa iFolder probablemente sólo hace
IFolder FindTypeViaParent(FolderType folderType)
{
if(myFolderType == folderType)
return this;
if(parent == null)
return null;
IFolder parentIFolder = (IFolder)parent;
return parentIFolder.FindTypeViaParent(folderType)
}
Una variación es hacer que la interfaz de iFolder:
interface IFolder
{
FolderType FolderType { get; }
IFolder Parent { get; }
}
Esto le permite externalizar el código de recorrido. Sin embargo, esto les quita el control de las clases (tal vez tengan padres múltiples) y expone la implementación. Bueno y malo.
[divagaciones]
A primera vista esto parece ser una jerarquía bastante caros de instalar. ¿Necesito instanciar de arriba hacia abajo todo el tiempo? es decir, si algo solo necesita una tarea, ¿tiene que instanciar todo de abajo hacia arriba para asegurarse de que todos esos punteros funcionan? Incluso si es una carga lenta, ¿necesito subir la jerarquía solo para obtener la raíz?
Por otra parte, ¿la jerarquía es realmente una parte de la identidad del objeto? Si no es así, quizás podría externalizar la jerarquía como un árbol n-ario.
Como nota al margen, es posible que desee considerar el concepto de agregación DDD (Domain Driven Design) y determinar quiénes son los principales jugadores. ¿Cuál es el último objeto propietario que es responsable? p.ej. ruedas de un auto. En un diseño que modela un automóvil, las ruedas también son objetos, pero son propiedad del automóvil.
Quizás le funcione, quizás no. Como dije, esto es solo un tiro en la oscuridad.
Aunque tenga en cuenta que puede ser exagerado. Llamar a.getName(). Equals ("blah") no necesariamente va a torpedear su proyecto simplemente porque no ha escrito un método compareNameTo() en ... –
Todo se trata de get(). Llamar a Get(). Equals() está bien ya que solo hay 1 get. Hacer Get(). Get(). Equals() debería comenzar a disparar las alarmas. – Quibblesome
¡Pero el pobre Demeter nunca se debe aplicar a ciegas! De acuerdo en los consigue, sin embargo. –