迪米特法则相关

时间:2008-06-05 13:55:44   来源:论坛整理  作者:  编辑:chinaitzhe


最近重读朱天华的《java与模式》,感觉作者对于小国寡民以及使民无知等等与软件工程的联系,的确很有见地。
但作者说,java程序设计中,应该把成员私有化,然后提供公有的setget,但是这样不是还能够基本上没有限制地对他进行修改么?设计模式上,还是提供了违反迪米特法则的途径啊,恳请大家讨论
网友回复:what did you say?
网友回复:迪米特法则的核心可是一个软件的实体应当与尽可能少的其他实体发生相互作用.
网友回复:应该把成员私有化,然后提供公有的setget,但是这样不是还能够基本上没有限制地对他进行修改么?

是有限制的(或者说可以有限制)
因为 成员public的时候 获取和设置完全是 一个等式在直接操作

封装成属性后 成员的 获取和设置 实际上是方法的调用
方法里可以包含自己的逻辑(比如在set时检查一个值是否超出范围)

而且属性和内部成员不一定是有映射的
比如 四边形对象有个面积属性 可能没有相应的包含面积值的成员 只是返回 属性[长]*属性[宽]
网友回复:『迪米特法则』
迪米特法则(LoD)’ 也叫最少知识原则,简单的说,就是假如两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。假如其中一个类需要调用另一
个类的某一个方法的话,可以通过第三者转发这个调用。迪米特法则还是在讲如何减少耦合的问题,类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,
不会对有关系的类造成波及。也就是说,信息的隐藏促进了软件的复用。

假如不必直接通信,那么就不应当发生直接的相互作用,即双向依靠!而get/set和这个不冲突;
事实上,针对设计模式以及OOD原则,要在个人理解的基础上,有自己的见解和使用;而不必完全拘泥于设计模式本身!
网友回复:谢谢大家的帮助,基于你们的文字,我做了一个小例子,大家看,一个私有的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();

}
}
网友回复:还真是不懂
网友回复:属性私有 setergeter访问器这是javabean规范,不是哪个国内作者说的。
一个类除了内部使用的帮助方法、对外的方法当然要暴露、否则这个类还怎么用?
但是属性不应暴露在外,所以通过访问器方法访问,这个很自然,不必死扣。
大量开源东东都是遵循这个原则处理的:spring注入属性、各种用到反射的地方...
就按这个用就得。
网友回复:thanks everyone ,the credits are offerred and served
关键字:迪米,法则,相关,
上一篇:弱弱的提问~~~

相关文章

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面