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 中,或者从中制作一个我真正不喜欢的扩展方法(难以跟踪/找到他们...)

4

3 回答 3

1

如果你是SRP的粉丝,那么你不会把它放在你的 Period Service 中。这是因为它会给定期服务另一个改变的理由。例如,如果此方法将来有某种时区问题。

如果您认为扩展方法过于隐藏,您可以将其重构为一个DateService可以注入您的 Period Service 的类。

更新:根据我的评论,如果选项是打开的,我会选择为此使用扩展方法:

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 回答