冒号和他的学生们(连载26)——访问控制 - 编程入门网
修改涉及到package成员,只需检查该类所在的package内的所有类。虽然这些类可能很多,但仍可控制,毕竟package是封闭的;如果修改涉及到protected成员,则不仅要检查该类所在的package内的所有类,还需检查该类的子类,如果该类本身是public,涉及的类可以超出该package的范围,已难以真正掌控;如果修改涉及到public成员,那就意味着任何类都可能调用该接口,也就可能因此而无法编译、运行和工作。因此访问控制越松的成员,辐射范围越广,软件重用的效率越高,承担的责任越大,修改的代价也越大。成熟的程序员对public和protected接口的设计一定是慎之又慎,往往在其上花的功夫更甚于具体代码的编写。”
逗号似有些不服:“可是谁又能保证接口永远不变呢?” “所以Java和C#才分别提供了deprecated和obsolete以将方法标记为过时啊。”冒号笑言以对,“当然这是不得已而为之的下策,可以理解为设计者对使用者的一种致歉。” 见众人并无共鸣,冒号心道:响鼓也需重锤,遂言:“看来你们感触还不深,原因是缺乏一种关键的意识——客户意识。客户意识对一个程序员的重要性,丝毫不亚于对一个企业的重要性。” 逗号忍不住问:“您一再提到客户,究竟什么是客户?” “这里的客户当然不是一般所指的软件终端消费者,而是指软件中间消费者或重用者,即调用该软件的代码或代码编写者。”冒号作了个名词解释,“客户意识的缺乏有几种原因。首先,不是每个人都有机会开发大型、关键的软件,许多程序员的客户主要是他自己或少数几个开发组成员,修改软件影响到的代码不多,影响到的人也不多,没有真正吃过设计不当的苦头。其次,开发库和框架的人毕竟是少数,大多数人开发的代码主要是自己调用或针对终端消费者的。即使他们写了一些可重用的代码,如果代码质量不被认可,也可能无人采用。当一个人习惯于自弹自唱时,是很难培养客户意识的。最后,正如我们在对象范式中指出的,过程式编程鼓励自顶向下,而OOP鼓励自底向上。显然,顶是底的客户。问题是许多OOP程序员仍习惯于过程式编程的风格,所设计的类或接口主要是调用其他的类或接口,而不是被调用。换句话说,他们设计的代码主要角色是客户,而不是客户的服务者。” 一番理论令众人心服口服。 引号关心地问:“如何培养客户意识呢?” “如果认识到客户意识的重要性,培养起来并不难。”冒号带着安慰的口吻,“谨记一点:轻诺者,必寡信。每一个public类、每一个非private成员,都是一份承诺。在没有明确职责、没有准备承担变更后果之前,请采用最严格的访问控制。有了客户意识,才有接口责任感。千万不要为追求廉价的重用而轻易扩大接口范围,莫以自身之便而致客户之不便,莫以一时之便而致长期之不便。另外,单元测试对培养客户意识很有帮助。它不仅仅能发现程序的逻辑缺陷,还能发现程序的设计缺陷。因为测试代码就是最典型的客户代码,它能让你站客户的角度重新审视自己的接口设计。” |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |