Я использую составной шаблон, как показано на диаграмме классов ниже. В основном мой основной лист (Распределение) имеет единственное свойство, Длительность, которое я хочу накапливать в различных композитах.
Я также хочу иметь количество распределений и возможность возвращать распределения в виде коллекции, которую я могу использовать для привязки данных в презентациях.
Этот вопрос касается реализации C #, а именно:
- Здесь есть интересный пост , в котором есть расширение для рекурсивного выполнения, а также альтернативный подход, который полностью исключает рекурсию. Не могли бы вы найти общий способ распределения ресурсов, как я? Я еще не решил, если код, который я написал, чувствует себя неловко, потому что мне не нравится шаблон, или он является неловким!
- Видите ли вы здесь легкие возможности для кэширования результатов первой итерации и тем самым минимизировать дальнейшую итерацию?
Приветствия
Berryl
код в композитном классе
public class AllocationComposite : AllocationNode
{
protected readonly IList<AllocationNode> _children;
public AllocationComposite() { _children = new List<AllocationNode>(); }
#region Implementation of AllocationNode
public override void Adopt(AllocationNode node) ...
public override void Adopt(IEnumerable<AllocationNode> nodes)...
public override void Orphan(AllocationNode node)...
public override void Orphan(IEnumerable<AllocationNode> nodes)...
public override IEnumerable<AllocationNode> Descendants
{
get
{
return _children.Concat(_children.SelectMany(child => child.Descendants));
}
}
public override IEnumerable<Allocation> Allocations
{
get
{
return Descendants.OfType<Allocation>();
}
}
public override TimeSpan Duration {
get {
return Allocations.Aggregate(TimeSpan.Zero, (current, child) => current + child.Duration);
}
}
public override int Count { get { return Allocations.Count(); } }
#endregion
public override string ToString() {
return String.Format("{0} for {1}",
"allocation".PluralizeWithCount(Count),
"hour".PluralizeWithCount(Duration.TotalHours, "F2"));
}
}
}
Реализация по умолчанию в абстрактном компоненте
public abstract class AllocationNode: Entity, IAllocationNode
{
#region Implementation of AllocationNode
public virtual TimeSpan Duration { get { return TimeSpan.Zero; } set { } }
public virtual void Adopt(AllocationNode node) { throw new InvalidOperationException(...)); }
public virtual void Adopt(IEnumerable<AllocationNode> nodes) { throw new InvalidOperationException(...)); }
public virtual void Orphan(AllocationNode node) { throw new InvalidOperationException(...)); }
public virtual void Orphan(IEnumerable<AllocationNode> nodes) { throw new InvalidOperationException(...)); }
public virtual int Count { get { return 1; } }
public virtual IEnumerable<AllocationNode> Descendants { get { return Enumerable.Empty<AllocationNode>(); } }
public virtual IEnumerable<Allocation> Allocations { get { return Enumerable.Empty<Allocation>(); } }
#endregion
}