在这里我要对一个知识点做出解释
隔指令 与询问
函数要么做什么事,要么回答什么事,但二者不可得兼。函数应该修改某对象的状态,或是返回该对象的有关信息。两样都干常会导致混乱。看看下面的例子:
public boolean set (String attribute, String value) ;
该函数设置某个指定属性,如果成功就返回true,如果不存在那个属性则返回false。 这样就导致了以下语句:
if (set ("username", "unclebob"))...从读者的角度考虑- -下吧。这是什么意思呢?它是在问usemame属性值是否之前已设置为unclebob吗?或者它是在问username属性值是否成功设置为unclebob呢?从这行调用很难判断其含义,因为set 是动词还是形容词并不清楚。作者本意,set 是个动词,但在if语句的上下文中,感觉它像是个形容词。该语句读起来像是说“如果username属性值之前已被设置为uncleob",而不是“设置username属性值为unclebob,看看是否可行,然后.....”。要解决这个问题,可以将set 函数重命名为setAndCheckIfExists,但这对提高if 语句的可读性帮助不大。真正的解决方案是把指令与询问分隔开来、防止混淆的发生。使用异 常替代返回错误码从指令式函数返回错误码轻微违反了指令与询问分隔的规则。它鼓励了在if语句判断中把指令当作表达式使用。
if (deletePage (page) == E_ 0K)
这不会引起动词/形容词混淆,但却导致更深层次的嵌套结构。当返回错误码时,就是在要求调用者立刻处理错误。
if (deletePage (page) == E _0K) {
if (registry. deleteReference (page .name) == E_ 0K) {
if (configKeys .deleteKey (page . name .makeKey()) ==E _0K) {
logger .1og ("page deleted") ;
if (deletePage (page) == E _0K) {
if (registry. deleteReference (page .name) == E_ 0K) {
if (configKeys .deleteKey (page . name .makeKey()) ==E _0K) {
logger .1og ("page deleted") ;