代码之家  ›  专栏  ›  技术社区  ›  Anyname Donotcare

如何验证工厂方法?[关闭]

  •  1
  • Anyname Donotcare  · 技术社区  · 6 年前

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

      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
    
                };
            }
    
    • 具体号码?或者这种类型的验证应该在 MVC 不在域层?还是两者兼而有之?
    • if (numberOfHours > MaxWorkDayHours) 我应该抛出一个例外吗 numberOfHours reach the limit 或者返回null?
    3 回复  |  直到 6 年前
        1
  •  2
  •   VoiceOfUnreason    6 年前

    可以检查特定字段不能大于特定数字吗?

    是的-当我们使用领域不可知类型(比如字节)来表达特定领域的概念时,这是一个正常的做法。

    这种类型的验证应该在MVC模型中,而不是在域层?

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

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

    返回null将是我的最后一个选择—这对我来说有点含蓄;我更希望通过返回一个集合来显式显示从方法返回0或1个对象的事实。看到了吗 Optional

    返回可能包含验证错误列表的或类型基本上与引发包含验证错误列表的异常是双重的。异常允许您更容易地将异常处理与愉快路径分开,但这有好处也有代价。

    请问您所说的返回或类型是什么意思?

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

    Or<Left,Right>
    

    在模式匹配是首要关注点的语言中,可以使用switch语句来“解包”类型。在没有这些结构的语言中,通常通过传递一对回调来完成工作

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

    Execute将调用 onLeft(Left x) onRight(Right x)

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

        2
  •  1
  •   Ali Ezzat Odeh    6 年前

    我建议你做以下几点:

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

    null 值,除非抛出异常以明确知道问题所在,而不是仅返回空实例而不知道问题所在。

        3
  •  0
  •   VoiceOfUnreason    6 年前
    1. 是否可以检查特定字段不能大于
      具体号码?或者这种类型的验证应该在模型中 MVC不在域层吗?还是两者兼而有之?

      从我的观点来看,我认为您可以在创建WorkTime对象的地方检查它是否比从model更好(在本文中,它在create()方法中)。

      另外,将来,可能会在许多地方使用Create(),如果对Create()方法进行输入输出验证,则需要反复验证,并生成一个重复的代码。

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

    尊敬!