閉鎖のために、私は自分の努力の結果で投稿を更新すると思いましたが、私は正しい道に私を送ったことに対してブランドンとフロリアンの両方に答えたと信じています。
Brandonが提案したように、IHaveRecurrenceと呼ばれるインターフェイスが次のように定義されました。
public interface IHaveRecurrence
{
DateTime? LastOccurrence { get; }
RecurrenceType RecurrenceType { get; }
Int32 RecurrenceValue { get; }
Boolean IsDue();
}
私のMaintainableTool(base)クラスは、このインターフェースを実装するようになりました。IsDueメソッドは、Recurrenceクラスに委任することによって実装されます。
public Boolean IsDue()
{
return Recurrence.IsDue(this);
}
漸化式は、Florianによって提案された抽象的な基本クラスです。DailyRecurrence、WeeklyRecurrenceなど、いくつかのサブクラスがあります。各サブクラスは、RecurrenceType列挙の値のいずれかに対応し、IHaveRecurrenceインターフェイスを介してRecurrenceValueプロパティとLastOccurrenceプロパティに基づいてPMの期限が到来するかどうかを判断する適切なロジックを実装します。
Recurrenceは、内部RecurrenceFactoryクラスを使用して、使用するサブクラスを解決します。
internal sealed class RecurrenceFactory
{
public Recurrence GetRecurrence(RecurrenceType type)
{
switch (type)
{
case Daily: return new DailyRecurrence;
:
}
}
}
また、Recurrenceは次のように実装されます。
public abstract class Recurrence : IDisposable
{
public static Boolean IsDue(IHaveRecurrence recurringObj)
{
using (var recurrence = RecurrenceFactory.GetRecurrence(recurringObj.RecurrenceType))
{
return recurrence.GetIsDue(recurringObj);
}
}
protected abstract Boolean GetIsDue(IHaveRecurrence recurringObj);
}
次に、たとえば、DailyRecurrenceクラスは次のように実装されます。
public sealed class DailyRecurrence : Recurrence
{
protected override Boolean GetIsDue(IHaveRecurrence recurringObj)
{
if (recurringObj.LastOccurred.HasValue)
return recurringObj.LastOccurred.AddDays(recurringObj.RecurrenceValue) <= DateTime.Now;
return true;
}
}
このモデルは非常に拡張性が高く、各再発パターンを解決するために必要なロジックをカプセル化し、ビジネスオブジェクトをクリーンに保つため、このモデルが気に入っています。