"告诉,不要问"是否适用于用户输入验证?

Jon*_*vis 5 oop tell-dont-ask

这些年来,我不得不忽略了"告诉,不要问"OOP原则,因为我刚刚第一次了解它.

但是上下文是关于验证代码的讨论,该代码已经从ASP.NET Web表单页面转移到数据/业务对象中,并且没有"Validate()"方法,只是一个本身进行验证的save方法. (据说)提出了一个例外.我问为什么这是以这种方式设计的,我被引导到OOP的"告诉,不要问"原则,这是我从未听说过的,所以我们一起看了谷歌,我立即接受了教育.;)

然而,某些东西闻不到正确,不应该在将数据从用户转移到处理和/或收集的业务层之前清除数据,而不是反过来?我对如何做好设计感到困惑.

这似乎是规则"出来,不问"是关于你不应该问目标对象的状态下,目标对象的想法,并认为这一原则从来没有真正打算应用到数据传递了目标对象.

Pat*_*ald 2

我同意 AviewAview 的观点,但只有在用户告知时才会抛出异常(如果他询问则不会):

public Foo
{
  bool Validate(Baz bar)
  {
        if(!is_number(bar)) return false;
        return true;
  }

  AssignBar(Baz bar)
  {
        if (!Validate(bar)) throw numberexception();
  }
}
Run Code Online (Sandbox Code Playgroud)

告诉:

try
{
  foo.AssignBar(bar);
}
catch(numberexception e)
{
  alert('Not a number!');
}
Run Code Online (Sandbox Code Playgroud)

问:

if (foo.Validate(bar)
{
  foo.AssignBar(bar);
}
else
{
  alert('Not a number!');
}
Run Code Online (Sandbox Code Playgroud)

因此,AssignBar 期望一个 VALID bar,如果不是,则抛出异常,但我们还提供了一个 Validate 方法,它不会抛出异常。

  • 异常可以处理意外情况(内存不足/磁盘已满/连接关闭/分布式事务失败) - 验证用户提交的数据并不意外。使用“处理程序”方法 - 只需调用 validate_number(invalid_handler_callback) (3认同)