解惑

解己之惑,解人之惑

2007年1月 (第2页共4页)

OO设计模式和设计原则(转帖)

很好的文章,下面是摘录,请直接下载原文阅读

1.1 设计正在“腐烂”的征兆(Symptoms of Rotting Design)
有四个主要的征兆告诉我们该软件设计正在“腐烂”中。它们并不是互相独立的,而是互相关联,它们是过于僵硬、过于脆弱、不可重用性和粘滞性过高。
1. 过于僵硬Rigidity
Rigidity 致使软件难以更改,每一个改动都会造成一连串的互相依靠的模块的改动,项目经理不敢改动,因为他永远也不知道一个改动何时才能完成。
2. 过于脆弱Fragility
Fragility 致使当软件改动时,系统会在许多地方出错。并且错误经常会发生在概念上与改动的地方没有联系的模块中。这样的软件无法维护,每一次维护都使软件变得更加难以维护。(恶性循环)
3. 不可重用性immobility
immobility 致使我们不能重用在其它项目中、或本项目中其它位置中的软件。工程师发现将他想重用的部分分离出来的工作量和风险太大,足以抵消他重用的积极性,因此软件用重写代替了重用。
4. 粘滞性过高viscosity
viscosity有两种形式:设计的viscosity和环境的viscosity。
当需要进行改动时,工程师通常发现有不止一个方法可以达到目的。但是这些方法中,一些会保留原有的设计不变,而另外一些则不会(也就是说,这些人是hacks)。一个设计如果使工程师作错比作对容易得多,那么这个设计的viscosity 就会很高。
环境的viscosity高是指开发环境速度很慢且效率很低。

2 面向对象的类设计原则
2.1 开放关闭原则The Open Closed Principle (OCP)
A module should be open for extension but closed for modification.一个模块应该只在扩展的时候被打开(暴露模块内部),在修改的时候是关闭的(模块是黑盒子)。
在所有的面向对象设计原则中,这一条最重要。该原则是说:我们应该能够不用修改模块的源代码,就能更改模块的行为。

2.1.1 动态多态性(Dynamic Polymorphism)
2.1.2 静态多态性(Static Polymorphism)
另外一种使用OCP的技术就是使用模板或范型,如Listing 2-3。LogOn函数不用修改代码就可以扩展出多种类型的modem。
阅读全文

表现层是最难解决的问题

在Web开发中,表现层是最难于通用化的,个人的感觉,Tapestry是一个不错的思路,可惜学习起来并不简单,而且也需要积累才能真正的简化开发。其它的表现层框架我都不是很看好,目前我的思路倾向于使用类生成页面,和模型层绑定,这样在产品或者大型项目中可以大大的简化工作量,也减少很多问题。目前,公司的产品中虽然是使用的这种思路,但是力度不够,组件太少,和模型的绑定也不够,需要写的代码太多,一种问题在不同的地方都需要小心,搞得QA也是很不爽。
而且表现层似乎也是搞开发的人中最不喜欢做的部分,因为“技术含量太少”,基本上堆代码肯定可以搞定。虽然我也不喜欢做表现层的工作,但是必须承认,如果能够实现一个易于使用的表现层框架,对于整个项目的贡献是很大的,至少有30%的代码量,因此可以简化的工作量实际上很多。公司考虑将更多的工作转移到中国来做,希望自己有机会能够改变这个情况,让表现层的工作更加的简单。

时间不够用

最近感觉时间严重不够,可能是年关将近,而且又开始买房子。按照我的计划,今年的头等大事可以算是英语了,但是最近的一次面试很失败,呵呵,感觉自己的设计能力确实还不够,考虑问题时一面考虑得很清楚,但是另外一面就比较差了,所以技术似乎也要提高。面试的人说:我很多年前就像你这样,晕
前两天一个同事推荐了一个电视剧,星际之门,是我最喜欢的题材,这个让我的时间更加的紧张,恨不得一天有48个小时。
快30的人了,事情突然间都冒出来了,其实可能最大的原因还是因为要买房子要结婚,家里的经济基础不好,买房和结婚只能完全靠自己,还得给家里一点钱,压力很大,加上老婆的要求比较高,所以只能努力找更好的工作,但是要找更好的工作就必须全面的提高自己的能力,而每个公司好像都只招天才一样。

将更多的工作转移到中国

今天公司开会,主题就是将更多的工作转移到中国来做,特别是很多架构的工作,这个对于我们中国研发中心肯定是一个好消息,因为从这次的版本升级看,开发的瓶颈在于美国的SPEC完成的速度,很多SPEC都是在我们的一再催促下草草完成的,问题多多,而且有些新招的架构师对系统不是很熟悉,写出来的SPEC问题更多。这次的变化对于我们是一个机会也是一个挑战,但是最起码说明美国那边已经开始重视这边的能力,而且我相信很多的架构工作可以放到中国来做。虽然中国研发中心的开发人员只有不到20个人,但是阵容还是很强大的,可以说方方面面的人才都有,有些还是熟悉多种平台和语言的。相信中国研发中心可以做得更好!

升级诺顿

从8.0时代开始,我就使用免费的诺顿企业版客户端,这个客户端比收费的个人版占用的资源更少,后来就渐渐的升级到9.0,从去年的可能10月份左右,在升级的时候就出现问题了,主要是主程序不能升级,也就是病毒引擎不能升级,但是病毒库还是会自动升级的,特别是配置了自动更新的情况下。这几天公司的很多同事的电脑都出现问题,影响工作,据说都是中了病毒,纷纷寻找杀毒程序。我的电脑自从我很久以前开始使用诺顿后就没有中过病毒,因为我都是设置自动更新病毒库,并且是每天我肯定在使用电脑的时候(公司的电脑设置的早上10点,家里的是设置的晚上8点)。由于主程序不能更新,今天特意搜索了下诺顿企业版客户端的最新版本,发现已经是10了,不知道为什么主程序不能更新到这个版本。

成为专家

这段时间一直在看房子,而且我们只能买比较老的房子,因为这样的房子比较便宜,我们挑选的地点也从现在住的花木变到三林政府附近,而在这个过程中,我们几乎遇到了买二手房可能遇到的情况:

  1. 看中房子,准备签约,但是被人出价高抢走
  2. 看中房子,打电话约上家,房子被其他的中介介绍的人先下了订金
  3. 房子的产证有问题,房子有抵押
  4. 房子没有产证,是原来的老公房,要先办产证再卖给我们,要我们下订金帮他们办产证
  5. 房子的产证是新的,是刚刚继承过来的,不知道是否要交营业税
  6. 骗首付的(中介朋友的亲身案例)

可以说买二手房可能遇到的问题我们差不多都遇到了,都快成二手房注意事项专家了。惟一值得欣慰的是到目前为止还没有任何经济损失。

PHP的函数返回值

本来就是想修改下header.php,让我的标签列表以及分类列表的标题更好一些,因为原来的标签文章列表的标题和站点首页的是一样的,在搜索引擎收录信息里面都是一样的,不好区分,这么一个简单的功能,本来以为一分钟可以搞定的,结果因为不熟悉PHP的语法,足足弄了半个小时才搞定。原理很简单,就是取得页面的URI的值,然后判断是否包含/tag/或者/category/:
<?php if ( strpos($_SERVER["REQUEST_URI"],’/tag/’)==0 ) { ?> &raquo; 标签 &raquo; <?php  echo(urldecode(substr($_SERVER["REQUEST_URI"],5))); } ?> <?php if ( strpos($_SERVER["REQUEST_URI"],’/category/’)==0 ) { ?> &raquo; 分类 <?php } ?>
问题是strpos在没有匹配的时候返回FALSE,而PHP不是强类型语言,有匹配返回但是是第一个匹配的时候,返回的是0,而在弱类型的时候,FALSE的等价值就是0,所以上面的判断就是错的。
后来看下了手册里面,注意到里面特别提到了===判断,就是进行强类型检查的,所以修改为:
<?php if ( strpos($_SERVER["REQUEST_URI"],’/tag/’)===0 ) { ?> &raquo; 标签 &raquo; <?php  echo(urldecode(substr($_SERVER["REQUEST_URI"],5))); } ?> <?php if ( strpos($_SERVER["REQUEST_URI"],’/category/’)===0 ) { ?> &raquo; 分类 <?php } ?>

问题搞定。

我的持久层规范

昨天说了我的这个大轮子的大致情况,就是尽量保持简单,而配置最多的可能就是持久层和Action的配置,我的框架会完全取消这两个的配置,先说说持久层的情况。

  1. 类名和表名直接关联,关系是类名前带 t_
  2. 类的成员和表字段直接关联,名称完全一致,全部的表都需要一个名字为ID的主键,类型为long,由系统自动在插入的时候产生
  3. 表关联根据类之间的关联决定,如果两个类对对方都是直接引用,就是一对一,如果一个是直接引用,例外一个是集合,则是一对多,如果两边都是集合,就是多对多,对于集合的成员,其成员名是类名加s。多对多的表名是t_加两个类名,中间用_分隔,字段名就是类名加_id,如果是一对多,则外键名就是类名加_id
  4. 类型现在是自动匹配,也就是数据库的类型和类中的对应字段的类型是匹配的
  5. 主键的值在系统初始化的时候会从数据库表中读取最大值,然后缓存在系统中,每次加一
  6. 缓存的大小根据系统启动时数据库对应表的记录数决定,记录数小于一千的缓存100%,一千到一万的缓存50%,一万以上的缓存10%,十万以上缓存1%
  7. 类名可以分布在多个包中,配置文件配置都有那些包可以存放这些持久化对应的类,类名不可重复

根据这个规则,我完全取消了持久层的配置,对于新项目,这个规则的要求并不高,符合绝大部分的需要。至于查询,目前还没有完全想好,但是我考虑的是大部分的简单情况,只提供一个简单的对象表达式语法,复杂的查询还是使用SQL。

具体的例子:
阅读全文

KISS

记得最开始学习Java的时候就被它的KISS原则深深吸引了,因为那个时候正在为c++的各种语法而头疼。做了这么多年的Java开发,也感觉Java确实在语法和跨平台上符合它的这个原则,现在,Java的内容扩展越来越广,学习Java,使用好Java越来越需要对OO、设计模式、敏捷开发等深入理解并实践。
随着struts、spring和hibernate在国内的普及,越来越多的人得到提高,当然,我们也看到了以EasyJF为代表的国内开源力量的发展,在那些通用框架的基础上,他们期望能够进一步简化,实际上,我也在做这个工作,虽然我很欣赏spring和hibernate的灵活性,但是那么多的配置文件也是一个很头疼的事情,根据我自己的经验,很多应用没有必要进行配置,根据一定的规则就可以直接得到配置,为什么还要配置呢?即使是使用JDK5的新特性元数据进行简单配置我也感觉不是很必要,所以,我开始了我的大轮子计划,为自己定制一个最精简,最快速(性能和开发速度)的框架,在验证自己的设计能力的同时也可以强迫自己去学习别人的代码(但是不会全部照搬,也不会过度设计,需要的时候再重构),而且,这个框架我打算几乎完全自己构建,能够自己写的一定自己写,目前为止只使用了log4j和cglib这两个第三方的包,连连接池都是自己写的。在构造这个大轮子的过程中,我会把自己的心得体会写下来和大家交流。

使用ThreadLocal消除循环依赖

昨天刚刚说了在用Cglib完成我的持久层的设计,我实现了一个通用的clone方法,但是有一个问题,因为我在后台保留了一个和数据库记录对应的对象,其他的部分要使用的时候都是从那个记录clone一个出来,为了防止潜在的修改,必须进行深度clone,刚开始我就是用了一个简单的递归clone,但是不行,在存在关系的时候就会无休止的clone下去,最后StackOverflowError了。本来想把刚刚创建的保存下来标记一下,但是多线程不太好处理,最后想到的就是使用ThreadLocal,把刚刚clone出来还未进行深度clone的那个对象保存到ThreadLocal,如果它的关系类clone的时候需要使用对应的记录就直接返回那个引用而不是再clone,这样就不会StackOverflowError了。

更早的文章 更新的文章

© 2025 解惑

本主题由Anders Noren提供向上 ↑