知识卡片
模块黑盒程度越高外部可定制性越低
内容
把行为封装进一个模块内部,好处是外部代码不用关心实现,坏处是外部也因此完全无法定制这个行为——想让一个日期解析函数多识别一种日期格式,唯一的办法是求模块原作者修改源码,自己在模块外部无论如何都无法重新定义它。这提示一个模块的黑盒程度并非越高越好:把某些环节以可替换的方式暴露出来,是在封装性和可定制性之间必须权衡的设计决策,不能只朝一个方向做到极致。
参考来源
- 位置:《架构之美》第13章《软件架构:面向对象与面向函数》13.3.2节《函数式方法的评价》(源文件:程序之美系列套装(6册)团队之美、项目管理之美、架构之美、数据之美、测试之美、安全之美/_epub-src/OEBPS/Text/part0258.xhtml)
- 结论依据:原文引用OCaml社区评论指出"在模块之外,很难对模块中的行为进行修改。假设使用了Time模块中定义的Time.date_of_string函数……但如果还想能够识别ISO8601扩展格式……那么很不幸,只能让该模块的开发人员来修改这个函数,无法在自己的模块中重新定义该函数"。
- 原始内容:在模块之外,很难对模块中的行为进行修改。假设使用了Time模块中定义的Time.date_of_string函数——用来解析ISO8601基本格式("YYYYMMDD"),但如果还想能够识别ISO8601扩展格式("YYYY-MM-DD")。那么很不幸,只能让该模块的开发人员来修改这个函数,无法在自己的模块中重新定义该函数。