继续读《代码整洁之道》。
对象和数据结构
不要轻易的就写 getter 方法获取类内的属性值,是思考目的是什么,有时用有意义的函数返回这个值,可以隐藏自己内部的细节
“著名的得墨忒耳律(The Law of Demeter)认为,模块不应了解它所操作对象的内部情形……方法不应调用由任何函数返回的对象的方法。”
代码语言:javascript复制final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();
上面的代码,违反了规则,一连串的调用,通常被认为是肮脏的风格。是吗?项目中这么使用并不少见。
说是 getOptions 返回的对象,不应该再去知道它的内部细节,想想这原则不可能实现啊。
如果 Options 和 ScratchDir 中间插了一层,但是如果是数据结构(没有方法,只有属性的类),用 getOptions().getScratchDir()
就不行了。
ctxt.options.scratchDir.absolutePath
就没关系,说提供一个方法,比如在 ctxt 中加一个 getOptionScratchPath()
返回,这样隐藏了细节,可以理解,但按这理论这方法内部调用还应该继续这样,去 options 内部再定义方法。
错误处理
有时 catch 异常需要对好多异常匹配判断,但是若明白自己想要的是什么,可能根本不关注到底是哪个异常,一般直接匹配一个 Exception 了,其实不太好,通用的 Exception 无法定位是这里抛出的。
可以将调用,异常处理单独封装到一个类,然后所有异常都抛出自定义的异常。还有一个好处,如果是第三方的 API 定义的异常类型,不需要在外部调用时出现这 API 里特有的异常,而是出现自己的异常。
方法不要返回 null 值,这是个好建议。可以返回特例对象,甚至可以抛出异常,如果是第三方的,可以自己这样封装,将 null 值处理了,不要返回去。
别将 null 值作为参数传递,和上面一条一样,都是减少检查 null 的代码逻辑,减少漏减少发生异常的概率。