封装隐藏--包装的讲究

来源:互联网 发布:阿里云开通子域名 编辑:程序博客网 时间:2024/04/30 04:02

7.3封装隐藏 

1. 信息隐藏是一种原则,而封装是实现这种原则的一种技术

2.抽象意味着用户可以从高层的接口来看待或者使用一类对象,而不用关心他的底层实现,而黑盒封装意味着用户不需要也无权访问底层

3.访问控制不仅是一种语法限制,也是一种语义规范--标有public的是接口,标有private的是实现,泾渭分明。

4代码例子

class Person{

     private Date birthday;


    private boolean sex;


    private Person[] childrens;


    public Person(Date birthday, boolean sex){

           this.birthday = birthday;

          this.sex = sex;

    }


    get,set (birthday,sex,childrens)

}

   public int computeAge(){


   }

}


<1>如果一个方法返回一个可变域对象的引用,无异于前门紧闭后门洞开。

<2>信息隐藏原则固然重要,但不是金科玉律。在一定条件也是允许的。比如,仅作为数据存储之用的类甚至可以开发所有的云域方法

又比如,在非同类之间共享或传递同一个引用有时是必要的,此外,在一定范围之内为提高效率也可以采取变通之法,避免对象复制

带来的性能损耗

<3>这也是给本班的精神论:第一设计很重要也不容易,需要研究精神

第二,任何人都会犯错误,包括权威,需要批评精神

<4>getChildren,应该返回复制后的数据,但如果用户经常需要获取某一指定位置的child,不妨提供getChild(int index)接口 , 视具体情况而定

还可以引入getchildCount,getFirstChild,getLastChild之类的接口,这样做的好处是:实现代码因较少复制数组而高效,客户代码因较少操作数据

而简洁,甚至连getchildren都不再需要

<5>作为一个建议,不妨将getSex换成 isMale 和 isFemale两个接口,这也提醒诸位,不要陷入追求get和set的对称。

<6>方法 computeAge的问题不在其实现,而是其命名,该名称暗示年龄是计算出来的--尽管的确是事实--》这暴露实现方法,应改为getAge

要知道,信息隐藏中的信息不仅仅是数据结构,还包括实现方式和策略。

<7>领会OOp的精髓绝非一早一夕之功,但若以抽象和封装为钥,必可早些通达。


原创粉丝点击