我读过一次,一个方法应该具有返回值(并且是参照透明的),或者具有副作用,但不能同时具有两者。我找不到对此规则的任何引用,但想了解更多有关此规则的信息。
该建议的来源是什么?它是由什么人或社区产生的?
额外的功劳:遵循此建议有什么好处?
我读过一次,一个方法应该具有返回值(并且是参照透明的),或者具有副作用,但不能同时具有两者。我找不到对此规则的任何引用,但想了解更多有关此规则的信息。
该建议的来源是什么?它是由什么人或社区产生的?
额外的功劳:遵循此建议有什么好处?
Answers:
根据格雷格·扬(Greg Young)的说法,该思想源自Bertrand Meyer:命令查询分离。
它指出,每个方法都应该是执行操作的命令,或者是将数据返回给调用方的查询,但不能同时是两者。换句话说,提出问题不应改变答案。1 更正式地讲,方法仅在引用透明且没有副作用的情况下才应返回值。
1:Eiffel:软件工程幻灯片43-48 的语言
在域驱动设计中,这类似于Greg Young命名的命令查询读取分离/隔离(CQRS)。
格雷格·杨(Greg Young)从伯特兰(Bertrand)提出了CQS的想法,将其命名为CQRS,正如Martin Fowler在本CQRS文章中提到的那样
阅读Martin Fowler链接中的文章以获取更多信息。
我不知道它来自哪里,但这是一个很好的建议,而且很容易理解。
任何理智设计的程序都将分解为各个部分,以各种方式组合和组成。对某个特定部分的功能进行推理的难度越大,确保程序以可预测的方式做出响应的难度就越大。
隔离产生副作用的零件,可使其余零件更易于推理,测试和调试。减少确实产生副作用的每个零件中的副作用数量,将使该零件更易于以相同的方式使用。
如果进一步分解,则返回值是有效的。副作用是一种效果。一个功能(如果可能)应该只产生1个效果,因为一个功能具有更多的输入和效果,推理出它实际作用的难度就越大。
额外信用:遵循此建议的
最初要求的好处是什么?
将返回值与副作用分开的好处之一是,它消除了短路评估可能引起的潜在问题。
bool FooWithSideEffect() {
// do query
// do side effect
return resultOfQuery;
}
bool BarWithSideEffect() {
// do query
// do side effect
return resultOfQuery;
}
void BadShortCircuitEvaluation()
{
// the programmer's intent is to have side effects of both functions
if (FooWithSideEffect() && BarWithSideEffect() ) {
// do something
}
// in case FooWithSideEffect() returns true,
// then BarWithSideEffect() is not called at all
// because of short-circuit evaluation
}