作者swpoker (swpoker)
看板java
标题Re: [战] getter / setter
时间Thu Mar 13 09:39:28 2014
※ 引述《cyclone350 (老子我最神)》之铭言:
: 先举一个例子,虽然猴大已经举过了
: 有一个 class Person
: 对应 method 如下
: void setName(String name);
: void setName(String name, Locale locale);
: String getName();
: String getName(Locale locale);
: 我们可以用如以下方式使用
: //从资源库取一个Person instance
: Person person = Repository.create(Person.class);
: person.setName("myNameByDefault");
: person.setName("myNameByEnglish",Locale.UK);
: //把Person存取到持久层
: Repository.save(person);
: 从以上来例子看...我们知道一个 Person 有名字,而且可以有多个语系的名字
: 如果我们把 getter/setter 拿掉,所有使用Person这个class的人,都需要知道
: 这个class里面复杂的架构... 但是这是不必要的,我们只要知道,Person有Name
: 而且是多国语系,这样就好了。
: 这应该是 Java 语言本身就很强调的... 抽象化的概念?
: 当然,如果一个class只是个data structure (或称作简单的Java bean?),
: 且class里面的每一个member都必须是可以被外部class可以access的,
: 我也觉得 getter/setter 在这种情况是多余的
: (这种情况意指这个class并没有做任何商业逻辑)
其实封装的最大用意
就是避免直接碰触最直接的成员
就语法跟结果
person.name="myName";
persion.setName("myName");
两者的结果都是一样的
差别在於
对於属性name的控制权是不一样的
person.name的控制权是在於呼叫方
person.setName()的控制权变成在於Person,而呼叫方仅止於呼叫而已
以上述的例子来说
如果我想要针对name作验证的话
person.name要怎麽做验证?
验证会变成在於呼叫方要做的事
例如
String name=result.get("name");
if(name=null || name.isEmpty()){
name="no name...ha!ha!";
}
person.name=name;
这样会造成person.name会混乱
因为可能第二个呼叫会改成
throw new RuntimeException("name is null or empty");
那?????
因此person.name的控制到底要由谁来负责比较好呢
所以为了避免这个问题发生,也同时要厘清这个问题
因此
void setName(String name){
if(name == null){
throw new RuntimeException("name is null");
}
if(name.isEmpty()){
name="default name is ha ha ";
}
if(name.find("shit") > 0){
name=name.replace("shit","");
}
......
//经过千辛万苦之後
this.name=name;
}
然後可以针对setName去AOP~去外挂~可以做的事情非常多
然而权责都会在於Person身上~或是针对Person的AOP实作
前提是
void setName()
当然如果专案本身根本就不需要那些有的没的
那麽person.name就好
我自己的原则是如果范围仅限於类别本身,则不用这麽麻烦,直接呼叫就好了
但超过类别的话,则要检视是否有需要,如果看起来没有甚麽需要,还是直接呼叫就好
之後有需要AOP之类的~再用重构改善程式码就好
: : → Lordaeron:我已经说过, 我看过的PROJECT 都是一堆get/set 03/12 16:04
: : → Lordaeron:请问@f先生还要问什麽呢?CODE 又不止我写的,有问题? 03/12 16:06
: : → Lordaeron:而我往往只负责收尾,只是看到一堆GET/SET很好笑. 03/12 16:08
: L大所述 "只会一直无意义get/set很XX",
: L大说法换个说法应该是说 "只会无脑写程式的人很XX"
: 这种说法有点吊诡... 我们假设世界上真的有无脑的工程师
: 既然他们不会动脑,那他们职位可能就是猴大所述的"工人"
: 既然不会动脑,那何来getter/setter呢?
: 想必是照着leader开出的规格写的
: 所以如果真的是XX,那应该也是上面的人XX,而不是这群工人XX吧?
: 就好像设盖房子一开始设计图就画错了,结果却怪罪底下的工人乱做一通一样...
: 我们是软体工程师 (好啦也许只有我是...)
: 我们可以根据不同的情况找出不同的解法
: 既然在某些请况真的不适合使用 getter/setter
: 那可以跟当初的定规则的人讨论,提出看法或解法
: 而不是在那边说 "很可笑,很白X",不是吗?
主要还是有没有一个话事的SD比较重要
--
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 163.29.29.131
1F:推 henry4343:所以有需要就加,没需要就不用加 03/13 12:24
2F:→ swpoker:对阿~但要注意就是过度开放到时要靠重构收回来~不然会乱 03/13 13:35