0

さまざまな機器で予防保守を実行する必要があるときに、基本的にユーザーにプロンプ​​トを表示するアプリケーションを開発しています。各機器 (ツールと呼びます) には、異なる再発パターンがあります。90 日ごとなど、時間に基づくものもあれば、使用状況などの他の要因に基づくものもあります。たとえば、特定のツールが X 回チェックアウトされた後、PM が必要になる場合があります。

すべてのツールは個人に割り当てられるため、そのユーザーがアプリケーションにサインインするときに、その時点で PM を必要とするツールのリストを表示する必要があります。PM が完了すると、これらのアイテムはリストから削除され、日付が変更されたり、ツールがベビーベッドにチェックインされたりするなどの他の状況が発生すると、ツールが追加されます。

このリストを返すサービス メソッドの設計から始めて、リスト内の項目を解決するために使用するアプローチに関するヘルプを探しています。入力には、ユーザーの識別子と現在の日付が含まれます。その上で、ツールのリストを照会し、ツールの繰り返しパターン、最後に PM が実行された時刻、および最後の PM 以降に発生したイベントに基づいて、そのアイテムをリストに表示するかどうかを判断する必要があります。

うまくいけば、それは理にかなっています。このロジックにどのようにアプローチすべきかについての考えやガイダンスに感謝します。

4

3 に答える 3

2

閉鎖のために、私は自分の努力の結果で投稿を更新すると思いましたが、私は正しい道に私を送ったことに対してブランドンとフロリアンの両方に答えたと信じています。

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;
    }
}

このモデルは非常に拡張性が高く、各再発パターンを解決するために必要なロジックをカプセル化し、ビジネスオブジェクトをクリーンに保つため、このモデルが気に入っています。

于 2011-04-11T15:49:22.707 に答える
1

次のような抽象クラス Recurrence を定義します。

abstract class Recurrence
{
      public abstract bool IsDue(DateTime dateAndTime);
}

Recurrence を Equipment のプロパティにします。

abstract class Equipment
{
      protected abstract Recurrence PMRecurrence
      {
            get;
      }

      public bool IsPMDue(DateTime dateAndTime)
      {
             return PMRecurrence.IsDue(dateAndTime);
      }
 }

次に、TimeRecurrence、UsageRecurrence などの Recurrence の適切なサブクラスを定義し、それらのインスタンスを Hammer、Tractor などの Equipment の適切なサブクラスに割り当て、必要に応じて実装できます。これにより、柔軟性と保守性の適切なバランスが実現されます。

頑張ってください、やりがいのある仕事のようです!

于 2011-04-01T17:32:18.993 に答える
1

各ツールには、PM が必要かどうかを判断するための独自のロジックがあるように思えます。したがって、次のようないくつかの列挙型を使用して IEquipment インターフェイスを定義します。

public enum RecurrenceType
{
    //Values
}

public enum RecurrenceFrequency
{
    //Values
}

public interface IEquipment
{
    bool IsPMRequired();

    RecurrenceType RecurrenceType { get; }
    RecurrenceFrequency RecurrenceFrequency { get; }
    //You may want to choose something other than object, or eliminate this property
    object RecurrenceValue { get; set; } 
}

次に、各タイプの機器がインターフェイスを実装し、PM が必要かどうかを判断するロジックを実装できます。

public class Tractor : IEquipment
{
    public bool IsPMRequired()
    {
        //Implement logic here specific to a Tractor
        throw new NotImplementedException();
    }

    public RecurrenceType RecurrenceType
    {
        get { throw new NotImplementedException(); }
    }

    public RecurrenceFrequency RecurrenceFrequency
    {
        get { throw new NotImplementedException(); }
    }

    public object RecurrenceValue
    {
        get
        {
            throw new NotImplementedException();
        }
        set
        {
            throw new NotImplementedException();
        }
    }
}

次に、これらのオブジェクトを使用するロジックは次のようになります。

List<IEquipment> equipment = new List<IEquipment>();
//Populate equipment
List<IEquipment> display = equipment.Where(e => e.IsPMRequired()).ToList();
//Display the equipment that needs PM

また、共通のメソッド/プロパティ定義を配置する Equipment の基本クラスを用意することも理にかなっている場合があります。

于 2011-04-01T17:15:24.857 に答える