标签 程序员 下的文章

Effective Java阅读笔记-item13、14

Dreamhead把他用大把银子买来的“Effective Java”借给我阅读,我真是很感动亚,我只能用行动来感谢Dreamhead了。^_^

13、支持不变性(immutable)

我感觉我们只需记住书中列出的几条规则:
1. 不要提供任何"可修改对象內容"的方法
2. 保证没有可被子类override的方法
3. 令所有field为 final
4. 令所有field都是 private
5. 保证对任何可变组件的互斥存取

Immutable object优点:
- Immutable object本质上是线程安全的,不需要同步
- Immutable object可以被自由的share
- Immutable object对于其他对象来说,形成了很多构件

缺点:对于每一个不同的值,都要形成一个独立的object
如:
String newStr = “AB”+”CD”;
这样可能会带来的是效率问题。

14、复合(composition)优先于继承(extends not implements)

在本Item中,作者针对安全继承提出几个观点:
- 包内继承很safe,因为super class和sub class都在一个Programmer的control下。
- 继承自专门为继承而设计并有很好的文档的类也很安全。

相反越界继承就是不安全的。

关于继承的几个观点:
- 继承打破的封装性;
- 当subclass确实是superclass的子类型的时候,也就是确实是“is a”的关系时才使用继承。

继承将会传播 superclass API 的所有缺陷,而复合允许你设计新的 API,隐藏 superclass 的缺陷。

书里还提到了composition vs delegete的概念,以前我对delegate的概念也不是很清楚,这次正好顺便好好分析一下:
以书中的代码为例:

public class InstrumentedSet implements Set {
    private int addCount = 0;
    … …
    public InstrumentedSet(Set s) {
        this.s = s;
    }
}

针对这段代码作者观点:“有时,复合(composition)和转发(forwarding)这两项技术的结合被错误地引用为“委托(delegation)” 从技术的角度而言,这不是委托(delegation),除非包装对象把自己(InstrumentedSet)传递给一个被包装的对象(Set)”

关于delegate:GOF那本书中如是说“Delegation is a way of making composition as powerful for reuse as inheritance [Lie86, JZ91]. In delegation, two objects are involved in handling a request: a receiving object delegates operations to its delegate. This is analogous to subclasses deferring requests to parent classes. But with inheritance, an inherited operation can always refer to the receiving object through the this member variable in C++ and self in Smalltalk. To achieve the same effect with delegation, the receiver passes itself to the delegate to let the delegated operation refer to the receiver 。

The main advantage of delegation is that it makes it easy to compose behaviors at run-time and to change the way they're composed”。

下面的代码改自某论坛上一个网友的代码,我自己觉得这段代码对于正确理解delegate很有帮助。
Considering the following code:

//MyDelegatee.java
public class MyDelegatee {
     void methodB() {
     }
}

//MyDelegate.java
public class MyDelegate {
   MyDelegatee delegatee;
   void methodA() {
       delegatee.methodB();
   }
}

上面的代码就不是delegate,而是composition和forwarding,因为MyDelegate直接调用了MyDelegatee object的方法,这只是forwarding methods。

//MyDelegatee.java
public class MyDelegatee {
     void methodB(MyDelegate delegate) {
        delegate.do();
     }
}

//MyDelegate.java
public class MyDelegate {
   MyDelegatee delegatee;
   void methodA() {
       delegatee.methodB(this);
   }
   void do(){
   }
}

MyDelegate已经把自身pass给了MyDelegatee,并且MyDelegatee调用了MyDelegate的方法,这是一种indirection。也就是说delegatee一定会调用delegate的某些方法,因此你首先得把delegate传递给delegatee。

我们在举个实际一点的例子,董事长和总经理的故事:
Considering the following code:
//Chairman.java
public class Chairman {
    private GeneralManager gm = new GeneralManager();

    public void doThroughGM(){
        gm.investmentDecisionMaking(this);
    }
    
    //董事长拥有的权利
    public void investmentDecisionMaking(){
        /*
         *董事长具有战略投资决策权,
         *董事长可将此权利授权给总经理
         */
         System.out.println("总经理被授权执行投资决策");
        
    }
    public static void main(String[] args) {
        Chairman chairman = new Chairman();
        chairman.doThroughGM();
    }
}

//GeneralManager.java
public class GeneralManager {
    public void investmentDecisionMaking(Chairman chairman){
        //总经理被授权获得的权利
        chairman.investmentDecisionMaking();
    }    
}
//output:
总经理被授权执行投资决策

上面的例子模仿了一个现实世界的过程,在现实世界中,假如董事长把权利授权给总经理,总经理一定会获取董事长才拥有的权利,它会利用这些权利来替公司做事。

举了这些例子后对delegate有些概念了吧^_^。

参考资料:
1、http://www.javaworld.com/javaworld/javaqa/2001-09/01-qa-0914-delegate.html
2、http://forum.javaeye.com/viewtopic.php?t=6120

Dominoo项目日记(二)

Dominoo项目从10月份启动到现在已有近2月,我们做了些工作,但是项目的进度缓慢也是我们几个人有目共睹的。针对前一阶段的工作上的不利局面,我们几个做了一次讨论。

最近两周的工作使我们的Dominoo有了很大进展,经过大家的讨论我们在一些技术问题上达成了共识。dreamhead建议我和toidi_xu结对编程,并将dmc的XML解析的工作交给我们来做(毕竟我在java编程上还属于菜鸟级),而dreadhead会腾出时间来完成下一步涉及技术问题的研究。不过在最近的讨论中我和toidi_xu也都积累了一些问题,今天我们就针对这些问题进行了讨论。

toidi_xu的问题让我们重新复习了一下Dominoo的提出的动机和设计思想。由于toidi_xu没能参加我们dominoo启动时的第一次讨论会,所以对有些Dominoo的“战略思想”问题有些疑惑。dreamhead带我们回顾的Dominoo的提出过程以及其中所蕴含的东西,让我又有了深刻的体会:

结合dreamhead和model_zhang的思想我把我们得到的结论说一下:
1、我们的Dominoo所处在软件开发流程中的位置
                
Domain problem  
———————————————————————————————————–
                                                    |
What(做什么)                                      |
                                                    |
——————————————————————————|
How(怎么做)  |  。logic(如一个业务逻辑            |
|       或是一个算法)                |   Solution            
                |      |                                |
                |      |                                |
                |  。adapter (将logic转换位            |
|      |         Do的实体)                |
|      |——-二进制代码                |
                |      |——-汇编代码                    |
                |      |——-高级语言(C/C++/Java)    |
                |      |——-Dominoo(面向设计)        |
                |      |——-XXXX(面向需求)
——————————————————————————————————–
Do(运行的实体)    |     CPU

说明一下上面的图,我们在解决问题的时候实际上都是在寻找问题域的一个解空间,在这个过程中我们要明确what , how , do。在how这个阶段,结合dreamhead和model_zhang产生的思想就是从what转换到logic,然后我们使用Adapter将我们的logic转换为可以运行在CPU上的产品,adapter的发展从binary code 到汇编到高级语言,再到我们所要实现的Dominoo(面向设计的工具或者说语言也可以),在这个发展过程中开发人员或者设计人员的关注程度逐渐从底层提高到问题领域,也许有一天我们使用自然语言描述需求,某个工具就能帮我们生成可运行的软件,这是我们理想的境界。不过我们现在做不到,我们必须脚踏实地的一点点向上攀登。

Dominoo提供给你一个可以快速验证你的设计是否可行有效的解决方案,同时也可以帮你生成最终的产品。你需要作的就是设计和少量动态语义的编码。

model_zhang曾经提出在我们的Dominoo上实现测试设计和执行的自动化,甚至是测试重构等概念。让我大开眼界。^_^

我这几天积蓄的问题大多集中在实现的细节上,这里就不详细说了。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats