2009-08-28 7 views
2

私は、スケジューリングを処理するためのC#のプログラムを書いています。今、各従業員が能力を必要とする元のための彼らのスケジュールに制限があります。社員制限

サリーは唯一

ビリーはわずか5 pm-9pm

から日曜日、木曜日、火曜日作業することができます9 am-3pmから月曜日、水曜日、金曜日に仕事ができます

サリーはだけなので、そのため日まで9 am-3pm から月曜日、水曜日、金曜日に仕事することができ、その後、彼女は時間と曜日の異なるセットを働かせることができます。

これらは、私は、各従業員オブジェクトに適用する必要がある制限のいくつかの例です。私が望んでいたのは、これをできるだけ効率的かつ包括的に構築する方法に関する提案でした。明らかに、私はこのデータにアクセスし、これらの制限を適用できるようにしなければなりません。たとえば、マネージャーがスケジュールを立てようとしているときに、彼が火曜日にSallyを予定しているときにそれを見ることができるようにする必要があるのは問題です。また、各従業員のこのデータをどのように保存する必要がありますか?

答えて

1

何か:

public class Employee 
{ 
    public string Name { get; set; } 
    // other important info 

    private List<WorkTime> _availability = new List<WorkTime>(); 
    public List<WorkTime> Availability 
    { 
     get { return _availability; } 
     internal set { _availability = value; } 
    } 
} 

public class WorkTime 
{ 
    public DayOfWeek Day { get; private set; } 
    public int StartHour { get; private set; } 
    public int EndHour { get; private set; } 

    public WorkTime(DayOfWeek day, int startHour, int endHour) 
    { 
     // validation here (e.g. day and time range during store hours, start<end, etc.) 

     Day = day; 
     StartHour = startHour; 
     EndHour = endHour; 
    } 
} 

と従業員のコレクション全体、およびいくつかのシフトを満たすために時間を持つ人を見つけるために、各従業員の可用性に照会するLINQ(またはforeachの)を使用します。

また、ビジネスルールに基づいてWorkTimeオブジェクトを比較するためのいくつかのユーティリティ機能(エクステンション)を作成するために役に立つかもしれないが

(例えばIsAvailableは2つのWorkTimeオブジェクトを比較し、それは同じダウの場合はtrueを返し、少なくとも4時間が重複します)

これはデータベースに格納される可能性が高いので、クラスのプロパティのようなフィールドを持つテーブルをモデル化します。

0

私は時間範囲を持つやパターンなどの特定の日付として「時間をoff」に格納する機能を与えることを示唆しています。私は、組合規則及び従業員ば可用性を扱うのは非常に複雑な方法を持っていたスケジューリングシステムのカップルで働いている、これは私たちがそれを取り扱う方法です。

従業員は、私がチェックしやすいか、希望していた、またはしたくないパターンを定義できると思います(たとえば、私は金曜日に働きたくありません)。特定のシフトにそれらを適用することがセットルールを破ったか(休み)、特定のパターンと一致しなかったかどうかをチェックすることができます。

はまた、どのように私は、各従業員のこのデータを保存する必要がありますか?

従業員の特定の例外を格納するためのテーブルがあります。私はy日からz日までの日Xが欲しいです。従業員には日付と時間帯があります。ものすごく単純。

パターンに関しては、ある種のスキーマを考え出す必要があります。タイプや何かがある。

このように、休日を表す単純な文字列として格納される1週間の休業日数を格納する 'weekly off pattern'のようなタイプを持つことができます:1000001。最初のビットが日曜日であると仮定すると、これは週末を休みたい。パターンを文字列などの形で格納してから、定義された型に基づいて文字列を処理する方法を知ることができます。

これは、非常に複雑な問題でも簡単な問題でもかまいません。うまくいけば、これはあなたにあなたを始めさせるのに十分なアイデアを与えます。

自動スケジュールの生成は、サポートする必要がある例外/ルールによってはさらに複雑です。

+1

基本的には良いデザインを - しかし - 私はこのように「上の時間を」反転でしょうあなたが保存するものである:私は似た何かを書いていたとき、それは非常に有用であることが判明しました。これはあなたが本当に興味を持っていることのすべてです。ビットマップは魅力的ですが、実際には苦痛に終わる可能性があります。私はおそらくemp、available_from、avalable_toとしてdbにこれを格納します。これはマネージャに "Satautday Afternoon"の "whos in"を照会する能力を与えます。また、ビットマップでは、ここにはデータがありますか、ここにはデータがありません。 –

+0

私が持っている例はどんなパターンでもありました。何かを保存することができました。時間があることを考えれば、時間切れよりも一般的です。私は、可用性データを保存するスケジューリングシステムは見ていません。データ。 – Kelsey

0

「建築家このように効率的かつ包括的に同じくらい可能」

これらは相互に排他的ではなく、それ自体は、しかし、効率的とジェネリックは特に上で、やってのける本当に難しいですスケジューリングシステム。スケジューリングは軽微な問題ではない。

あなたの質問はおそらく "これを開始するにはどのような本を読むべきですか?"および/またはこれをコミュニティのwikiにする。

0

これはgraph-matchingの問題に類似しており、Constraint Satisfaction Problemとしてモデル化することもできます。あなたは、私がこれに似た何かをやったし、私がやったことは共通のインタフェースを作成し、異なるシナリオのための別の実装を作成しているNSolver役立つ、またはCassowary.Net

0

を見つけることができます。インターフェイスには、チェックIsInSchedule(dateTime)が設定されている可能性があります。次に、必要に応じてさまざまな実装を作成できます。このような

1

strategy patternを使用してRulesに行きます。

public interface Rule 
{ 
    bool Satisfies(Employee employee); 
} 

public class ScheduleRule : Rule 
{ 
    ScheduleRule(Schedule schedule) 
    { ... } 

    bool Satisfies(Employee employee) 
    { 
     // Ensure the employee is available 
    } 
} 

public class HolidayRule : Rule 
{ 
    HolidayRule(Datetime date) 
    { ... } 

    bool Satisfies(Employee employee) 
    { 
     // Checks if the employee as volunteered for this holiday 
    } 
} 

このパターンは、拡張性と保守性を容易にします。

利用可能な情報(およびその他のルール関連情報)は、従業員に保管することができます(Mike Jacobの回答を参照)。ただし、従業員と一緒に保管することも、別個のテーブルに保管することもできます。

ルールに関連する大量の情報が必要な場合は、この可用性情報を従業員と区別することもできます。この場合、Rulesは、別のクラスをターゲットにできます。

... 
bool Satisfies(RuleInfo info) 
...