面向对象博大精深,能力超群,可以解决头痛的软件设计问题。看着大师们酷酷的UML图、美妙的理论,感觉那就是我的方向! 每件是都需要过程,说要成为专家,至少需要10年艰苦的努力。面向对象设计也是一样的,需要在实践中慢慢摸索,慢慢体会。 不要以为大师们的UML图是一下子画出来的,也是经过无数次修改而得来的。不要以为把大师们的UML图搬过来就可以用,也许它不能解决你的问题。 要做好的软件设计必须要对业务精通。第一,是软件本身,潘爱民老师说:” 没有足够的代码量,很多程序设计的概念是很难体会到的”。第二,是实际的业务,如果没有明确了解业务,那设计也是不存在的,即使做出来了,也是空洞的。 大师还是很少的,那,不是大师怎么办呢?像潘老师说得那样,从日常的编码过程中,慢慢提高。理论要联系实际,当你在实践中真正看到它的效果的时候,它才是属于你的。 看一下,本站短信模块代的码重构过程,希望能通过这个例子说明我的意图。 短信模块的目的:为本站会员提供,在站内及时交流的工具,短信模块有以下功能, -发送短信 -读短信 -删除 -查看短信邮箱 没有重构前的代码结构如下, 查看代码 这段代码,功能上是没有问题的,但类中方法比较多,看起来不方便,最苦恼的是,每当要添加新邮箱时,需要在每个CASE里加一条语句,来判断新邮箱该怎样处理。这应该就是大师所提及的code smell吧。 重构的思路是这样的, -定义一个邮箱父类,然后让新邮箱类、已读邮箱类、已发邮箱类、系统邮箱类继承邮箱父类。 -定义一个函数负责生成具体的邮箱类,这样,在添加新邮箱时,只要继承父类,在生成函数中,加入if语句就可以了。 -定义一个邮局类,负责发送短信和生成用户所需要的邮箱。原来的类中含有多种功能,思路不明确。 查看代码 重构之后的代码,思路明确,维护和扩展都很方便了。 在这个例子里我学到了,明确了, -Factory Method工厂模式 -Open-Closed Principle 开-关闭 原则 -Single Responsibility Principle 单一职责原则 面向对象的世界里,像原则、设计模等理论的东西很多,这些原则和设计模式是起指导作用的,而不是让我们把它硬生生地放到设计里。其实在上面的例子里,如果只有两个邮箱,那,不重构也是可以的,因为没有必要。 上面的例子更像是敏捷所提倡的方法,先编码,后重构。要是没有敏捷方法的出现,谁会赞同上面的方法是正确的呢?所以,做自己的面向对象,让别人说去吧。 |
java 代码
- /**
- * 短信类
- * small_msg表中 msg_type ,1-系统信息,2-群发短信
- */
- class biz_msg{
- var $db; //数据库链接
- var $user_id; //用户ID
- var $msg_box; //信箱信息数组
- /**
- * 构造函数
- */
- function biz_msg($db,$user_id){
- $this->db = $db;
- $this->user_id = $user_id;
- }
- /**
- * 获得短信
- * @param int $page_no 页号
- * @param int $per_page 每页显示的记录数
- * @param int $box_id 信箱ID
- */
- function get_msg_list($page_no,$per_page,$box_id){
- switch($box_id){
- case 1:
- return $this->get_new_msg_list($page_no,$per_page);
- break;
- case 2:
- return $this->get_read_msg_list($page_no,$per_page);
- break;
- case 3:
- return $this->get_send_msg_list($page_no,$per_page);
- break;
- case 4:
- return $this->get_system_msg_list($page_no,$per_page);
- break;
- }
- }
- /**
- * 获得新短信列表
- * @param int $page_no 页号
- * @param int $per_page 每页显示的记录数
- */
- private function get_new_msg_list($page_no,$per_page){
- }
- /**
- * 获得已读短信列表
- * @param int $page_no 页号
- * @param int $per_page 每页显示的记录数
- */
- private function get_read_msg_list($page_no,$per_page){
- }
- /**
- * 获得已发短信列表
- * @param int $page_no 页号
- * @param int $per_page 每页显示的记录数
- */
- private function get_send_msg_list($page_no,$per_page){
- }
- /**
- * 获得系统短信列表
- * @param int $page_no 页号
- * @param int $per_page 每页显示的记录数
- *
- */
- private function get_system_msg_list($page_no,$per_page){
- }
- /**
- * 获得短信个数
- * @param int $box_id 信箱ID
- */
- private function get_msg_count($box_id){
- switch($box_id){
- case 1:
- return $this->get_new_msg_count();
- break;
- case 2:
- return $this->get_read_msg_count();
- break;
- case 3:
- return $this->get_send_msg_count();
- break;
- case 4:
- return $this->get_system_msg_count();
- break;
- }
- }
- /**
- * 获得新短信个数
- */
- private function get_new_msg_count(){
- }
- /**
- * 获得已读短信个数
- */
- private function get_read_msg_count(){
- }
- /**
- * 获得已发短信个数
- */
- private function get_send_msg_count(){
- }
- /**
- * 获得已发短信个数
- */
- private private function get_system_msg_count(){
- }
- /**
- * 获得下一封短信
- * @param int $box_id 信箱ID
- * @param int $msg_id 短信ID
- */
- function get_next_msg($box_id,$msg_id){
- switch($box_id){
- case 1:
- return $this->get_new_next_msg($msg_id);
- break;
- case 2:
- return $this->get_read_next_msg($msg_id);
- break;
- case 3:
- return $this->get_send_next_msg($msg_id);
- break;
- case 4:
- return $this->get_system_next_msg($msg_id);
- break;
- }
- }
- /**
- * 获得新短信下一封短信
- * @param int $msg_id 短信ID
- */
- private function get_new_next_msg($msg_id){
- }
- /**
- * 获得已读短信下一封短信
- * @param int $msg_id 短信ID
- */
- private function get_read_next_msg($msg_id){
- }
- /**
- * 获得发送短信下一封短信
- * @param int $msg_id 短信ID
- */
- private function get_send_next_msg($msg_id){
- }
- /**
- * 获得系统消息下一封短信
- * @param int $msg_id 短信ID
- */
- private function get_system_next_msg($msg_id){
- }
- /**
- * 获得上一封短信
- * @param int $box_id 信箱ID
- * @param int $msg_id 短信ID
- */
- function get_prev_msg($box_id,$msg_id){
- switch($box_id){
- case 1:
- return $this->get_new_prev_msg($msg_id);
- break;
- case 2:
- return $this->get_read_prev_msg($msg_id);
- break;
- case 3:
- return $this->get_send_prev_msg($msg_id);
- break;
- case 4:
- return $this->get_system_prev_msg($msg_id);
- break;
- }
- }
- /**
- * 获得已读短信上一封短信
- * @param int $msg_id 短信ID
- */
- private function get_read_prev_msg($msg_id){
- }
- /**
- * 获得发送短信上一封短信
- * @param int $msg_id 短信ID
- */
- private function get_send_prev_msg($msg_id){
- }
- /**
- * 获得系统消息上一封短信
- * @param int $msg_id 短信ID
- */
- private function get_system_prev_msg($msg_id){
- }
- /**
- * 查看有没有邮件
- * @param int $box_id 信箱ID
- * @param 数组 $msgs 信箱ID数组
- */
- private function is_valid_msg($box_id,$msgs){
- }
- /**
- * 获得邮件信息
- * @param int $box_id 信箱ID
- * @param int $msg_id 短信ID
- */
- function get_msg_info($box_id,$msg_id){
- }
- /**
- * 设置邮件状态为已读
- */
- function set_msg_read($msg_id){
- }
- /**
- * 发送邮件
- * @param object $biz_account 帐户对象
- * @param int $to_user_id 收信人
- * @param string $title 标题
- * @param string $content 内容
- * @return 1-成功,2-标题为空,3-内容为空,4-收信人不存在,5-被加黑
- */
- function send_msg($biz_account,$to_user_id,$title,$content){
- }
- /**
- * 删除邮件
- * @param int $box_id 信箱ID
- * @param 数组 $msgs 短信ID数组
- * @return 1-成功,2-没有邮件
- */
- function delete_msgs($box_id,$msgs){
- }
- }
java 代码(new)
- /**
- * 短信邮局类
- * 负责短信发送和邮箱管理
- */
- class biz_msg_office{
- var $db;
- /**
- * 构造函数
- */
- function biz_msg_office($db){
- $this->db = $db;
- }
- /**
- * 获得邮箱
- * @param $user_id //用户ID
- * @param $box_id; //信箱ID
- */
- function get_msg_box($user_id,$box_id){
- $msg_box = new biz_msg_box($db,$user_id);
- if($box_id==1)//新邮件
- $msg_box = new biz_new_msg_box($this->db,$user_id);
- if($box_id==2)//已读
- $msg_box = new biz_read_msg_box($this->db,$user_id);
- if($box_id==3)//发送
- $msg_box = new biz_send_msg_box($this->db,$user_id);
- if($box_id==4)//系统
- $msg_box = new biz_system_msg_box($this->db,$user_id);
- return $msg_box;
- }
- /**
- * 发送邮件
- * @param string $to_user_id 发信人
- * @param string $to_user_id 收信人
- * @param string $title 标题
- * @param string $content 内容
- */
- function send_msg($user_id,$to_user_id,$title,$content){
- }
- }
- /**
- * 短信邮箱类
- */
- class biz_msg_box{
- var $db; //数据库链接
- var $user_id; //用户ID
- var $msg_box; //信箱信息数组
- /**
- * 构造函数
- */
- function biz_msg($db,$user_id){
- $this->db = $db;
- $this->user_id = $user_id;
- }
- /**
- * 获得短信
- * @param int $page_no 页号
- * @param int $per_page 每页显示的记录数
- */
- function get_msg_list($page_no,$per_page){
- }
- /**
- * 获得短信个数
- */
- private function get_msg_count(){
- }
- /**
- * 获得下一封短信ID
- * @param int $msg_id 短信ID
- */
- function get_next_msg_id($msg_id){
- }
- /**
- * 获得上一封短信ID
- * @param int $msg_id 短信ID
- */
- function get_prev_msg_id($msg_id){
- }
- /**
- * 查看有没有邮件
- * @param 数组 $msgs 信箱ID数组
- */
- private function is_valid_msg($msgs){
- }
- /**
- * 获得邮件信息
- * @param int $box_id 信箱ID
- * @param int $msg_id 短信ID
- */
- function get_msg_info($msg_id){
- }
- /**
- * 设置邮件状态为已读
- */
- function set_msg_read($msg_id){
- }
- /**
- * 删除邮件
- * @param int $box_id 信箱ID
- * @param 数组 $msgs 短信ID数组
- * @return 1-成功,2-没有邮件
- */
- function delete_msgs($msgs){
- }
- }
- /**
- * 新短信邮箱类
- * small_msg表中 msg_type ,1-系统信息,2-群发短信
- */
- class biz_new_msg_box extends biz_msg_box{
- /**
- * 获得短信
- * @param int $page_no 页号
- * @param int $per_page 每页显示的记录数
- */
- function get_msg_list($page_no,$per_page){
- }
- /**
- * 获得短信个数
- */
- private function get_msg_count(){
- }
- /**
- * 查看有没有邮件
- * @param 数组 $msgs 信箱ID数组
- */
- private function is_valid_msg($msgs){
- }
- /**
- * 获得邮件信息
- * @param int $msg_id 短信ID
- */
- function get_msg_info($msg_id){
- }
- /**
- * 删除邮件
- * @param int $box_id 信箱ID
- * @param 数组 $msgs 短信ID数组
- * @return 1-成功,2-没有邮件
- */
- function delete_msgs($msgs){
- }
- }