这些年来,我不得不忽略了"告诉,不要问"OOP原则,因为我刚刚第一次了解它.
但是上下文是关于验证代码的讨论,该代码已经从ASP.NET Web表单页面转移到数据/业务对象中,并且没有"Validate()"方法,只是一个本身进行验证的save方法. (据说)提出了一个例外.我问为什么这是以这种方式设计的,我被引导到OOP的"告诉,不要问"原则,这是我从未听说过的,所以我们一起看了谷歌,我立即接受了教育.;)
然而,某些东西闻不到正确,不应该在将数据从用户转移到处理和/或收集的业务层之前清除数据,而不是反过来?我对如何做好设计感到困惑.
这似乎是规则"出来,不问"是关于你不应该问目标对象的状态下,目标对象的想法,并认为这一原则从来没有真正打算应用到数据传递到了目标对象.
我同意 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 方法,它不会抛出异常。