1

私の PeriodService には、次のメソッドがあります。

private IEnumerable<DateTime> GetAllWeekStartingDays(DateTime start, DateTime end, DayOfWeek firstDayOfWeek)
        {
             return Enumerable
                    .Range(0, end.Subtract(start).Days + 1).Select(offset => start.AddDays(offset))
                    .Where(d => d.DayOfWeek == firstDayOfWeek);             
        }

firstDayOfWeek は、ビジネス オブジェクト XXX からのパラメーターです。上記の方法は、おそらく期間内の月曜日/日曜日であるすべての日を取得します。

このメソッドを Period Service (atm) 内にプライベート インスタンス メソッドとして配置するか、ビジネス オブジェクト Period.cs に public static メソッドとして配置するか、それから拡張メソッドを作成して、本当に気に入らないもの (追跡が難しい/それらを見つけます...)

4

3 に答える 3

1

あなたがSRPのファンなら、あなたはこれをあなたの生理サービスに入れないでしょう。これは、期間サービスに変更する別の理由を与えるためです。たとえば、この方法で将来何らかのタイムゾーンの問題が発生した場合です。

拡張メソッドが隠されすぎていると思われる場合は、PeriodServiceにDateService注入できるクラスにリファクタリングすることができます。

更新:私のコメントによると、オプションが開いている場合、私はこれに拡張メソッドを使用することを選択します:

public static IEnumerable<DateTime> GetAllWeekStartingDays(this DateTime start, DateTime end, DayOfWeek firstDayOfWeek)
        {
             return Enumerable
                    .Range(0, end.Subtract(start).Days + 1).Select(offset => start.AddDays(offset))
                    .Where(d => d.DayOfWeek == firstDayOfWeek);             
        }
于 2013-02-26T15:41:33.383 に答える
1

クラスはこのPeriodメソッドの適切な場所ではありません、ピリオド:)。Period状態に依存しないため、動作ではありませんPeriod。それが OO の概要です。つまり、状態と動作を組み合わせます。次のようなメソッドを持つPeriod ことができます

IEnumerable<DateTime> GetWeekStartingDays(DayOfWeek firstDayOfWeek)

独自の開始日と終了日 (それらが存在する場合) を使用して結果を返します。

に属している可能性がありPeriodServiceます。サービスは通常、リポジトリや Web サービスなどの依存関係を持つクラスであり、基本的にこれらの依存関係のラッパーとして機能します。これらの依存関係を使用しないメソッドは、サービスを「ビジー」にするだけであり、サービスのパブリック メソッドをサポートするプライベート ユーティリティ メソッドを除いて、通常は別の場所に属します。したがって、メソッドがPeriodService所属する場所でプライベートメソッドとしてのみ使用される場合、そのスコープ(プライベート)は可能な限り小さいためです。それ以外の場合は、Eli Gassert が提案するように、内部 (?) 静的ユーティリティ メソッドにします。

于 2013-02-26T20:11:55.277 に答える
0

あなたがそれをどのように呼んでいるのかわかりますか?

つまり、あなたはすでにIEnumerable<DateTime>電話をかける場所を持っていると感じました。電話をかけるたびに、開始日と終了日を把握するための繰り返し作業を行います。この場合、の拡張メソッドを使用すると、IEnumerable<DateTime>自分自身を繰り返す必要がなくなります。

public static IEnumerable<DateTime> GetDays(this IEnumerable dates, DayOfWeek day)
{
     var start = dates.Min();
     var end = dates.Max();
     return Enumerable
            .Range(0, end.Subtract(start).Days + 1).Select(offset => start.AddDays(offset))
            .Where(d => d.DayOfWeek == day);             
}

次に、次のように簡単に呼び出すことができます。

var mondays = mydates.GetDays(DayOfWeek.Monday);

それでも前のものを使用することを主張する場合は、単にオーバーライドを使用できます。

private IEnumerable<DateTime> GetDays(DateTime start, DateTime end, DayOfWeek day)
{
    return new List<DateTime>(){ start, end }.GetDays(day);
}

メソッドの機能よりも狭い目的を推測するため、メソッドの名前を変更したことに注意してください。つまり、同じ方法を使用して、週の開始日だけでなく、範囲内の任意の平日を取得できます。この問題により、たとえば、他のコーダーが水曜日を取得するための新しいメソッドを作成できなくなります。

于 2013-02-27T17:05:23.653 に答える