如何验证工厂方法?

How to validate a factory method?

如何验证工厂方法(对象的构造)。

  public static readonly byte MaxWorkDayHours = 12;

  public static WorkTime Create(Guid WorkTimeRegulationId, String name, byte numberOfHours, byte numberOfShortDays, ICollection<WorkTimeActivation> activations = null)
        {
            if (activations == null) { activations = new List<WorkTimeActivation>(); }
            if (numberOfHours > MaxWorkDayHours) return null;
            return new WorkTime()
            {
                Name = name,
                NumberOfWorkHours = numberOfHours,
                NumberOfShortDays = numberOfShortDays

            };
        }

我建议您执行以下操作:

public class Worktime
{
    int _maxWork;
    int _workHours;

    public Worktime(int maxWork)
    {
        _maxWork = maxWork;
    }

    public int NumberOfWorkHours
    {
        get { return _workHours; }
        set
        {
            if (value > _maxWork)
                throw new ArgumentOutOfRangeException("Work hours should not exceed " + _maxWork);

            _workHours = value;
        }
    }
}

然后域层应该捕获异常并处理通知用户,我更喜欢工厂应该总是 return 一个有效的实例而不是 null 值,除非抛出异常以明确知道问题不只是 return 在不知道问题出在哪里的情况下使用空实例。

Is it okay to check that a specific field can't be greater than a
specific number ? or this type of validation should be in the model of MVC not in the domain layer ? or in both ?

在我看来,我认为您可以检查它在何处创建 WorkTime 对象比从模型创建更好(在这种情况下,它在您的 Create() 方法中)。

想一想:如果将来另一个团队成员使用你的 Create() 方法,而他不知道这个验证,他也不会关心那个。 => 在这里检查将帮助您处理这个风险点。

另外,以后可能你在很多地方用到你的Create(),如果你对Create()方法进行in out验证,那么你就需要反复验证,再做一个duplicate代码。

If I make a check like this if (numberOfHours > MaxWorkDayHours) Should I throw an exception say that numberOfHours reach the limit or return null ?

这取决于你如何处理结果。如果需要向用户显示一些详细信息,则需要抛出异常,并在某个地方捕获它以向用户显示问题信息。如果没有,您可以选择更简单的解决方案:return null.

Is it okay to check that a specific field can't be greater than a specific number ?

是的 - 当我们使用域不可知类型(如字节)来表达某些域特定概念时,这是正常的事情。

this type of validation should be in the model of MVC not in the domain layer ?

肯定是领域层;但在模型中这样做也可能有意义。在模型中检查值约束的动机是您希望限制代码中需要检查的不同位置的数量。

中引入一个代表领域概念的Value Object是一个常见的模式;检查是在创建值的构造函数(或工厂方法)中实现的,使用该值的代码可以依赖类型检查器来知道验证已经发生。

If I make a check like this if (numberOfHours > MaxWorkDayHours) Should I throw an exception say that numberOfHours reach the limit or return null ?

视情况而定。还有另一种选择,即 return or 类型;工厂 return 对象或验证错误列表。

返回 null 将是我最后的选择——这对我的口味来说有点含蓄;我宁愿通过 returning 集合使您 return 0 或 1 个来自该方法的对象显式化。例如,参见 Optional

返回可能包含验证错误列表的 or 类型基本上与抛出包含验证错误列表的异常是双重的。异常允许您更轻松地将异常处理与快乐路径分开,但这有利也有弊。

Could I ask What did u mean by return an or-type ?

Or 类型是一种将保存一种类型或另一种类型的值的类型。

Or<Left,Right>

在模式匹配是第一个 class 问题的语言中,您可以使用 switch 语句来 "unpack" 类型。在没有这些结构的语言中,您通常通过传递一对回调来完成工作

Or<Left,Right> thing = ...
thing.execute( onLeft , onRight )

执行将调用 onLeft(Left x)onRight(Right x),具体取决于内部设置的值。

一个穷人的 OrType 可能看起来像一个有两个成员的 Type,其中至少一个总是 null