最近重读朱天华的《java与模式》,感觉作者对于小国寡民以及使民无知等等与软件工程的联系,的确很有见地。
但作者说,java程序设计中,应该把成员私有化,然后提供公有的setget,但是这样不是还能够基本上没有限制地对他进行修改么?设计模式上,还是提供了违反迪米特法则的途径啊,恳请大家讨论

解决方案 »

  1.   

    应该把成员私有化,然后提供公有的setget,但是这样不是还能够基本上没有限制地对他进行修改么?是有限制的(或者说可以有限制)
    因为 成员public的时候 获取和设置完全是 一个等式在直接操作封装成属性后 成员的 获取和设置 实际上是方法的调用
    方法里可以包含自己的逻辑(比如在set时检查一个值是否超出范围)而且属性和内部成员不一定是有映射的
    比如 四边形对象有个面积属性 可能没有相应的包含面积值的成员 只是返回 属性[长]*属性[宽]
      

  2.   

    『迪米特法则』  
      迪米特法则(LoD)’ 也叫最少知识原则,简单的说,就是如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一 
      个类的某一个方法的话,可以通过第三者转发这个调用。迪米特法则还是在讲如何减少耦合的问题,类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改, 
      不会对有关系的类造成波及。也就是说,信息的隐藏促进了软件的复用。如果不必直接通信,那么就不应当发生直接的相互作用,即双向依赖!而get/set和这个不冲突;
    事实上,针对设计模式以及OOD原则,要在个人理解的基础上,有自己的见解和使用;而不必完全拘泥于设计模式本身!
      

  3.   

    谢谢大家的帮助,基于你们的文字,我做了一个小例子,大家看,一个私有的List的内容,通过一个公有的访问方法,完全暴露在外面,可以读,可以写。
    这是类设计时所希望的么,如何避免呢,或者说,需不需要避免呢package innerClass;
    import java.util.List;
    import java.util.ArrayList;
    public class test {
    private List<Integer> abc = new ArrayList<Integer>();
    public List<Integer> getabc()
    {
    return abc;
    }
    public void showall()
    {
    for(Integer temp:abc)
    {
    System.out.println(temp);
    }
    }
    public test ()
    {
    abc.add((Integer)1);
    abc.add((Integer)2);
    }
    public static void main(String[] args)
    {
    test Atest=new test();
    Atest.showall();
    List<Integer>  a =Atest.getabc();
    a.add((Integer)3);
    System.out.println("after outside add,the outside reference is ");
    for(Integer temp:a)
    {
    System.out.println(temp);
    }
    System.out.println("after outside add,the inner reference is ");
    Atest.showall();

    }
    }
      

  4.   

    属性私有+setergeter访问器这是javabean规范,不是哪个国内作者说的。
    一个类除了内部使用的帮助方法、对外的方法当然要暴露、否则这个类还怎么用?
    但是属性不应暴露在外,所以通过访问器方法访问,这个很自然,不必死扣。
    大量开源东东都是遵循这个原则处理的:spring注入属性、各种用到反射的地方...
    就按这个用就得。
      

  5.   

    thanks everyone ,the credits are offerred and served