2004年十一月月 发布的文章

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上实现测试设计和执行的自动化,甚至是测试重构等概念。让我大开眼界。^_^

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

Effective Java阅读笔记-item12

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

从item12~item18讨论的都是单个类或接口的设计技术。

12、使类和成员的可访问能力最小化
作者提出“你应尽可能的是每一个类或成员不被外界访问”

* 顶层类或接口的访问级别
  public — 意味着你的类是提供给客户API的一部分,你有义务永远支持它,维护它。
  package-private — 如果一个类或接口做成packge-private,那么意味着它实际上已成为包的实现的一个部分,而不是包提供给客户(使用者)的API的一部分。在以后包的维护过程中你对该类进行修改、替换和删除对客户并无影响。

* 类or接口内成员的访问级别

在几乎每一本java教科书中都有,我这里就不浪费文字了。不过书中有几个观点还是值得我们注意的:
- 如果一个方法改写了超类的一个方法,那么子类中该方法的访问级别低于超类中的访问级别是不允许的。这样可确保子类的实例可被用在任何超类实例使用的场合。

- 公有类不应该包含public field,例外情况通过公有的静态final field来暴露类中的常量是可以的。
- 如果类内的一个final field包含一个指向可变对象的引用,那么它具有非final field的一切缺点,虽然引用本身是final的不能被修改,但是它引用的对象却可以被修改,这将是一个很危险的安全漏洞。如果你非要这么做的话,请确保被 public static final field所引用的对象是不可变的。

Considering the following code :

public class TestItem12 {
public static final Integer[] intArray = { 1 , 4 , 5 , 6};//可以看出我们提供该final Integer的意图是其////不被修改,但实际上是可以被修改的。
    public static void main(String[] args) {
        System.out.println("Before modifying :");
        //这是我们的意图,我们要使用static final field的值。
        for (Integer i : TestItem12.intArray ){
            System.out.println(i);
        }

//这可不是我们的意图,但是这样做编译器不会告诉你你的final引用的对象被修改了,you //are in danger
        TestItem12.intArray[1] = 11;
        TestItem12.intArray[2] = 10;
        System.out.println("After modifying :");
        for (Integer i : TestItem12.intArray ){
            System.out.println(i);
        }
    }
}
//output:
Before modifying :
1
4
5
6
After modifying :
1
11
10
6
可以看到引用本身并未发生变化但是所引用对象的值发生了变化。我们改变一下:

public class TestItem12 {
    public static final Integer[] valuesOfArray(){
        return (Integer[])intArray.clone();
    }
    private static final Integer[] intArray = { 1 , 4 , 5 , 6};
    public static void main(String[] args) {
        Integer[] ia = TestItem12.valuesOfArray();
        for (Integer i : ia ){
            System.out.println(i);
        }
        a[2] = 123;
        for (Integer i : TestItem12.valuesOfArray() ){
            System.out.println(i);
        }            
    }
}
//output:
1
4
5
6
1
4
5
6

当然这样会牺牲一些性能。^_^在这个过程中顺便谈谈clone()这个方法吧,很有意思的,呵呵,看代码吧。

public class TestItem12 {
    public static final Integer[] valuesOfArray(){
        return (Integer[])intArray; // remove the clone() method
    }
        
    private static final Integer[] intArray = { 1 , 4 , 5 , 6};
    public static void main(String[] args) {
        Integer[] ia = TestItem12.valuesOfArray();
        for (Integer i : ia ){
            System.out.println(i);
        }
        a[2] = 123;
        for (Integer i : TestItem12.valuesOfArray() ){
            System.out.println(i);
        }
}
//output:
1
4
5
6
1
4
123
6

看到上面代码,remove the clone method后,输出了123,也就是说final reference所引用的对象的值被修改了。这样做是十分危险的,因为它直接暴露了类内部的成员。Clone的作用是它重新new了一块内存,并用intArray对其进行了初始化。这样实际上外部的引用就不会和内部的private引用指向同一块memory了。Simple吧.^_^

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 商务合作请联系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