`

面向对象设计是过程,而不是结果

阅读更多

面向对象博大精深,能力超群,可以解决头痛的软件设计问题。看着大师们酷酷的UML图、美妙的理论,感觉那就是我的方向!

    每件是都需要过程,说要成为专家,至少需要10年艰苦的努力。面向对象设计也是一样的,需要在实践中慢慢摸索,慢慢体会。

    不要以为大师们的UML图是一下子画出来的,也是经过无数次修改而得来的。不要以为把大师们的UML图搬过来就可以用,也许它不能解决你的问题。

    要做好的软件设计必须要对业务精通。第一,是软件本身,潘爱民老师说:” 没有足够的代码量,很多程序设计的概念是很难体会到的”。第二,是实际的业务,如果没有明确了解业务,那设计也是不存在的,即使做出来了,也是空洞的。

    大师还是很少的,那,不是大师怎么办呢?像潘老师说得那样,从日常的编码过程中,慢慢提高。理论要联系实际,当你在实践中真正看到它的效果的时候,它才是属于你的。

看一下,本站短信模块代的码重构过程,希望能通过这个例子说明我的意图。

短信模块的目的:为本站会员提供,在站内及时交流的工具,短信模块有以下功能,
-发送短信
-读短信
-删除
-查看短信邮箱
没有重构前的代码结构如下,
查看代码

这段代码,功能上是没有问题的,但类中方法比较多,看起来不方便,最苦恼的是,每当要添加新邮箱时,需要在每个CASE里加一条语句,来判断新邮箱该怎样处理。这应该就是大师所提及的code smell吧。

重构的思路是这样的,
-定义一个邮箱父类,然后让新邮箱类、已读邮箱类、已发邮箱类、系统邮箱类继承邮箱父类。
-定义一个函数负责生成具体的邮箱类,这样,在添加新邮箱时,只要继承父类,在生成函数中,加入if语句就可以了。
-定义一个邮局类,负责发送短信和生成用户所需要的邮箱。原来的类中含有多种功能,思路不明确。
查看代码


重构之后的代码,思路明确,维护和扩展都很方便了。
在这个例子里我学到了,明确了,
-Factory Method工厂模式
-Open-Closed Principle 开-关闭 原则
-Single Responsibility Principle 单一职责原则

面向对象的世界里,像原则、设计模等理论的东西很多,这些原则和设计模式是起指导作用的,而不是让我们把它硬生生地放到设计里。其实在上面的例子里,如果只有两个邮箱,那,不重构也是可以的,因为没有必要。

上面的例子更像是敏捷所提倡的方法,先编码,后重构。要是没有敏捷方法的出现,谁会赞同上面的方法是正确的呢?所以,做自己的面向对象,让别人说去吧。

java 代码
  1. /**  
  2. * 短信类  
  3. * small_msg表中 msg_type ,1-系统信息,2-群发短信  
  4. */  
  5. class biz_msg{   
  6.        
  7.     var $db;             //数据库链接   
  8.     var $user_id;        //用户ID   
  9.     var $msg_box;        //信箱信息数组   
  10.     /**  
  11.     * 构造函数  
  12.     */  
  13.     function biz_msg($db,$user_id){   
  14.   
  15.         $this->db = $db;   
  16.         $this->user_id = $user_id;   
  17.     }   
  18.   
  19.     /**  
  20.     * 获得短信  
  21.     * @param int $page_no 页号  
  22.     * @param int $per_page 每页显示的记录数  
  23.     * @param int $box_id 信箱ID  
  24.     */  
  25.     function get_msg_list($page_no,$per_page,$box_id){   
  26.   
  27.         switch($box_id){   
  28.             case 1:   
  29.                 return $this->get_new_msg_list($page_no,$per_page);   
  30.                 break;   
  31.             case 2:   
  32.                 return $this->get_read_msg_list($page_no,$per_page);   
  33.                 break;   
  34.             case 3:   
  35.                 return $this->get_send_msg_list($page_no,$per_page);   
  36.                 break;   
  37.             case 4:   
  38.                 return $this->get_system_msg_list($page_no,$per_page);   
  39.                 break;   
  40.         }   
  41.     }   
  42.        
  43.     /**  
  44.     * 获得新短信列表  
  45.     * @param int $page_no 页号  
  46.     * @param int $per_page 每页显示的记录数  
  47.     */  
  48.     private function get_new_msg_list($page_no,$per_page){   
  49.     }   
  50.   
  51.     /**  
  52.     * 获得已读短信列表  
  53.     * @param int $page_no 页号  
  54.     * @param int $per_page 每页显示的记录数  
  55.     */  
  56.     private function get_read_msg_list($page_no,$per_page){   
  57.     }   
  58.   
  59.     /**  
  60.     * 获得已发短信列表  
  61.     * @param int $page_no 页号  
  62.     * @param int $per_page 每页显示的记录数  
  63.     */  
  64.     private function get_send_msg_list($page_no,$per_page){   
  65.     }   
  66.   
  67.     /**  
  68.     * 获得系统短信列表  
  69.     * @param int $page_no 页号  
  70.     * @param int $per_page 每页显示的记录数  
  71.     *   
  72.     */  
  73.     private function get_system_msg_list($page_no,$per_page){   
  74.     }   
  75.   
  76.     /**  
  77.     * 获得短信个数  
  78.     * @param int $box_id 信箱ID  
  79.     */  
  80.     private function get_msg_count($box_id){   
  81.            
  82.         switch($box_id){   
  83.             case 1:   
  84.                 return $this->get_new_msg_count();   
  85.                 break;   
  86.             case 2:   
  87.                 return $this->get_read_msg_count();   
  88.                 break;   
  89.             case 3:   
  90.                 return $this->get_send_msg_count();   
  91.                 break;   
  92.             case 4:   
  93.                 return $this->get_system_msg_count();   
  94.                 break;   
  95.         }   
  96.     }   
  97.   
  98.     /**  
  99.     * 获得新短信个数  
  100.     */  
  101.     private function get_new_msg_count(){   
  102.     }   
  103.   
  104.     /**  
  105.     * 获得已读短信个数  
  106.     */  
  107.     private function get_read_msg_count(){   
  108.     }   
  109.   
  110.     /**  
  111.     * 获得已发短信个数  
  112.     */  
  113.     private function get_send_msg_count(){   
  114.     }   
  115.   
  116.     /**  
  117.     * 获得已发短信个数  
  118.     */  
  119.     private private function get_system_msg_count(){   
  120.     }   
  121.   
  122.     /**  
  123.     * 获得下一封短信  
  124.     * @param int $box_id 信箱ID  
  125.     * @param int $msg_id 短信ID  
  126.     */  
  127.     function get_next_msg($box_id,$msg_id){   
  128.   
  129.         switch($box_id){   
  130.             case 1:   
  131.                 return $this->get_new_next_msg($msg_id);   
  132.                 break;   
  133.             case 2:   
  134.                 return $this->get_read_next_msg($msg_id);   
  135.                 break;   
  136.             case 3:   
  137.                 return $this->get_send_next_msg($msg_id);   
  138.                 break;   
  139.             case 4:   
  140.                 return $this->get_system_next_msg($msg_id);   
  141.                 break;   
  142.         }              
  143.     }   
  144.   
  145.     /**  
  146.     * 获得新短信下一封短信  
  147.     * @param int $msg_id 短信ID  
  148.     */  
  149.     private function get_new_next_msg($msg_id){   
  150.     }   
  151.   
  152.     /**  
  153.     * 获得已读短信下一封短信  
  154.     * @param int $msg_id 短信ID  
  155.     */  
  156.     private function get_read_next_msg($msg_id){   
  157.     }   
  158.   
  159.     /**  
  160.     * 获得发送短信下一封短信  
  161.     * @param int $msg_id 短信ID  
  162.     */  
  163.     private function get_send_next_msg($msg_id){   
  164.     }   
  165.   
  166.     /**  
  167.     * 获得系统消息下一封短信  
  168.     * @param int $msg_id 短信ID  
  169.     */  
  170.     private function get_system_next_msg($msg_id){   
  171.     }   
  172.   
  173.     /**  
  174.     * 获得上一封短信  
  175.     * @param int $box_id 信箱ID  
  176.     * @param int $msg_id 短信ID  
  177.     */  
  178.     function get_prev_msg($box_id,$msg_id){   
  179.   
  180.         switch($box_id){   
  181.             case 1:   
  182.                 return $this->get_new_prev_msg($msg_id);   
  183.                 break;   
  184.             case 2:   
  185.                 return $this->get_read_prev_msg($msg_id);   
  186.                 break;   
  187.             case 3:   
  188.                 return $this->get_send_prev_msg($msg_id);   
  189.                 break;   
  190.             case 4:   
  191.                 return $this->get_system_prev_msg($msg_id);   
  192.                 break;   
  193.         }              
  194.     }   
  195.   
  196.     /**  
  197.     * 获得已读短信上一封短信  
  198.     * @param int $msg_id 短信ID  
  199.     */  
  200.     private function get_read_prev_msg($msg_id){   
  201.     }   
  202.   
  203.     /**  
  204.     * 获得发送短信上一封短信  
  205.     * @param int $msg_id 短信ID  
  206.     */  
  207.     private function get_send_prev_msg($msg_id){   
  208.     }   
  209.   
  210.     /**  
  211.     * 获得系统消息上一封短信  
  212.     * @param int $msg_id 短信ID  
  213.     */  
  214.     private function get_system_prev_msg($msg_id){   
  215.     }   
  216.   
  217.   
  218.     /**  
  219.     * 查看有没有邮件  
  220.     * @param int $box_id 信箱ID  
  221.     * @param 数组 $msgs 信箱ID数组  
  222.     */  
  223.     private function is_valid_msg($box_id,$msgs){   
  224.     }   
  225.   
  226.     /**  
  227.     * 获得邮件信息  
  228.     * @param int $box_id 信箱ID  
  229.     * @param int $msg_id 短信ID  
  230.     */  
  231.     function get_msg_info($box_id,$msg_id){   
  232.     }   
  233.   
  234.     /**  
  235.     * 设置邮件状态为已读  
  236.     */  
  237.     function set_msg_read($msg_id){   
  238.     }   
  239.   
  240.     /**  
  241.     * 发送邮件  
  242.     * @param object $biz_account 帐户对象  
  243.     * @param int $to_user_id 收信人  
  244.     * @param string $title 标题  
  245.     * @param string $content 内容  
  246.     * @return 1-成功,2-标题为空,3-内容为空,4-收信人不存在,5-被加黑  
  247.     */  
  248.     function send_msg($biz_account,$to_user_id,$title,$content){   
  249.     }   
  250.   
  251.   
  252.     /**  
  253.     * 删除邮件  
  254.     * @param int $box_id 信箱ID  
  255.     * @param 数组 $msgs 短信ID数组  
  256.     * @return 1-成功,2-没有邮件  
  257.     */  
  258.     function delete_msgs($box_id,$msgs){   
  259.     }   
  260. }   

 

java 代码(new)
  1. /**  
  2. * 短信邮局类  
  3. * 负责短信发送和邮箱管理  
  4. */  
  5. class biz_msg_office{    
  6.        
  7.     var $db;   
  8.     /**  
  9.     * 构造函数  
  10.     */  
  11.     function biz_msg_office($db){   
  12.   
  13.         $this->db = $db;   
  14.     }   
  15.   
  16.     /**  
  17.     * 获得邮箱  
  18.     * @param $user_id     //用户ID  
  19.     * @param $box_id;     //信箱ID  
  20.     */  
  21.     function get_msg_box($user_id,$box_id){   
  22.   
  23.         $msg_box = new biz_msg_box($db,$user_id);   
  24.   
  25.         if($box_id==1)//新邮件   
  26.             $msg_box = new biz_new_msg_box($this->db,$user_id);   
  27.         if($box_id==2)//已读   
  28.             $msg_box = new biz_read_msg_box($this->db,$user_id);   
  29.         if($box_id==3)//发送   
  30.             $msg_box = new biz_send_msg_box($this->db,$user_id);   
  31.         if($box_id==4)//系统   
  32.             $msg_box = new biz_system_msg_box($this->db,$user_id);   
  33.   
  34.         return $msg_box;   
  35.     }   
  36.   
  37.     /**  
  38.     * 发送邮件  
  39.     * @param string $to_user_id 发信人  
  40.     * @param string $to_user_id 收信人  
  41.     * @param string $title 标题  
  42.     * @param string $content 内容  
  43.     */  
  44.     function send_msg($user_id,$to_user_id,$title,$content){   
  45.     }   
  46. }   
  47.   
  48. /**  
  49. * 短信邮箱类  
  50. */  
  51. class biz_msg_box{   
  52.        
  53.     var $db;             //数据库链接   
  54.     var $user_id;        //用户ID   
  55.     var $msg_box;        //信箱信息数组   
  56.     /**  
  57.     * 构造函数  
  58.     */  
  59.     function biz_msg($db,$user_id){   
  60.   
  61.         $this->db = $db;   
  62.         $this->user_id = $user_id;   
  63.     }   
  64.   
  65.     /**  
  66.     * 获得短信  
  67.     * @param int $page_no 页号  
  68.     * @param int $per_page 每页显示的记录数  
  69.     */  
  70.     function get_msg_list($page_no,$per_page){   
  71.     }   
  72.        
  73.     /**  
  74.     * 获得短信个数  
  75.     */  
  76.     private function get_msg_count(){              
  77.     }   
  78.   
  79.     /**  
  80.     * 获得下一封短信ID  
  81.     * @param int $msg_id 短信ID  
  82.     */  
  83.     function get_next_msg_id($msg_id){   
  84.     }   
  85.   
  86.     /**  
  87.     * 获得上一封短信ID  
  88.     * @param int $msg_id 短信ID  
  89.     */  
  90.     function get_prev_msg_id($msg_id){   
  91.     }   
  92.   
  93.     /**  
  94.     * 查看有没有邮件  
  95.     * @param 数组 $msgs 信箱ID数组  
  96.     */  
  97.     private function is_valid_msg($msgs){   
  98.     }   
  99.   
  100.     /**  
  101.     * 获得邮件信息  
  102.     * @param int $box_id 信箱ID  
  103.     * @param int $msg_id 短信ID  
  104.     */  
  105.     function get_msg_info($msg_id){   
  106.     }   
  107.   
  108.     /**  
  109.     * 设置邮件状态为已读  
  110.     */  
  111.     function set_msg_read($msg_id){   
  112.     }   
  113.   
  114.     /**  
  115.     * 删除邮件  
  116.     * @param int $box_id 信箱ID  
  117.     * @param 数组 $msgs 短信ID数组  
  118.     * @return 1-成功,2-没有邮件  
  119.     */  
  120.     function delete_msgs($msgs){   
  121.     }   
  122. }   
  123.   
  124. /**  
  125. * 新短信邮箱类  
  126. * small_msg表中 msg_type ,1-系统信息,2-群发短信  
  127. */  
  128. class biz_new_msg_box extends biz_msg_box{   
  129.   
  130.     /**  
  131.     * 获得短信  
  132.     * @param int $page_no 页号  
  133.     * @param int $per_page 每页显示的记录数  
  134.     */  
  135.     function get_msg_list($page_no,$per_page){   
  136.     }   
  137.        
  138.     /**  
  139.     * 获得短信个数  
  140.     */  
  141.     private function get_msg_count(){              
  142.     }   
  143.   
  144.     /**  
  145.     * 查看有没有邮件  
  146.     * @param 数组 $msgs 信箱ID数组  
  147.     */  
  148.     private function is_valid_msg($msgs){   
  149.     }   
  150.   
  151.     /**  
  152.     * 获得邮件信息  
  153.     * @param int $msg_id 短信ID  
  154.     */  
  155.     function get_msg_info($msg_id){   
  156.     }   
  157.   
  158.     /**  
  159.     * 删除邮件  
  160.     * @param int $box_id 信箱ID  
  161.     * @param 数组 $msgs 短信ID数组  
  162.     * @return 1-成功,2-没有邮件  
  163.     */  
  164.     function delete_msgs($msgs){   
  165.     }   
  166. }   
分享到:
评论

相关推荐

    面向对象软件开发过程

    面向对象的编程(OOP)是面向对象软件开发过程中的第三个阶段,是指将 OOD 的系统设计模型用面向对象的程序设计语言予以具体实现,具体而言,OOP 是实现在面向对象设计模型中的各个对象所规定的任务。面向对象的编程...

    面向对象设计理论

    下面将详细阐述面向对象设计的基本概念、原则以及在两个文档——"面向对象分析与设计"和"面向对象的思考过程"中可能涵盖的关键知识点。 1. **面向对象的基本概念**: - **对象**:对象是类的实例,具有属性(数据...

    面向对象的程序设计语言与面向过程的程序设计语言.docx

    面向对象设计的重点在于描述对象在整个问题解决过程中的行为,而非具体的步骤。如同五子棋游戏,面向过程会按步骤设计,而面向对象则会创建“玩家”、“棋盘”和“规则”等类,让它们各自负责相应的功能。 面向对象...

    面向对象的软件开发过程.

    ### 面向对象的软件开发过程 #### 5.1 软件开发过程 **软件开发过程**指的是为了创建或更新软件产品而执行的一系列有序活动。这些活动包括但不限于软件描述、软件开发、软件有效性验证以及软件演进。不同软件开发...

    面向对象的思考过程(英文版).zip

    这个压缩包文件《面向对象的思考过程(英文版)》很可能提供了一个深入探讨面向对象设计原则、概念和技术的详细指南。 1. **对象与类**:对象是OOP中的核心单元,它包含属性(也称为成员变量或字段)和方法(成员函数...

    面向对象设计UML实践课后答案

    面向对象设计(Object-Oriented Design,OOD)是一种软件开发方法,它基于“对象”的概念,将现实世界的问题域转化为计算机程序。UML(Unified Modeling Language)是面向对象设计的一种标准化建模语言,用于可视化...

    面向对象分析与设计.pdf

    面向对象设计是在分析的基础上进行的,它关注于如何将需求转化为软件系统的内部结构。设计阶段的输出通常包括更详细的类图、活动图、序列图、状态图和组件图等UML模型。设计过程还会确定系统组件的接口和协作方式。 ...

    23种面向对象设计模式

    面向对象设计模式是软件开发中的一种重要思想,它通过总结和提炼在软件设计过程中常见的问题和解决方案,形成了可复用的设计规范。标题提到的“23种面向对象设计模式”涵盖了设计模式的主要分类,这些模式在Java、...

    面向过程与面向对象区别

    面向过程的设计思路适合小型项目和简单的系统,而面向对象的设计思路适合大型项目和复杂的系统。 面向对象的设计思路还具有很高的可扩展性和可移植性,例如要把五子棋游戏改为围棋游戏,只需要改动规则对象就可以了...

    面向对象和面向过程的区别

    面向对象编程(Object-Oriented Programming, OOP)和面向过程编程(Procedural Programming)是两种不同的编程范式,它们在解决问题的方式上有着本质的区别。 面向过程编程是一种自底向上的编程思想,它关注的是...

    面向过程、面向对象、面向组件、面向服务软件架构的分析与比较

    面向过程、面向对象、面向组件、面向服务软件架构的分析与比较 软件开发历程与架构演进 软件开发从汇编语言、过程式语言、面向对象、面向组件发展到面向服务,这一进程不仅反映了编程技术的不断进步,更是软件工程...

    面向对象分析与设计UML2.0(PDF)

    详细介绍了面向对象的分析与设计,全面探讨了面向对象概念、软件开发过程、UML和多层技术。本书使用最常见的技术和方法,通过一个贯穿全书的案例分析,对面向对象的软件开发过程和使用面向对象技术的编程过程进行了...

    面向对象设计之3_基于UML的图书管理系统的分析与设计说明.pdf

    面向对象设计之3_基于UML的图书管理系统的分析...本资源摘要信息主要介绍了面向对象设计和UML在图书管理系统中的应用,强调了面向对象设计的基本思想和UML的主要容,描述了基于UML的图书管理系统模型的设计和分析过程。

    面向对象的设计过程(有案例)

    本文将深入探讨面向对象的设计过程,结合IBM提供的实例,揭示其简洁而实用的设计方法。 1. **问题识别与需求分析** 在设计开始前,我们需要明确项目的目标,理解用户的需求。这包括收集业务规则、系统边界、交互...

    面向对象VS面向过程

    ### 面向对象与面向过程编程:对比与分析 #### 一、引言 在计算机科学领域,程序设计范式是定义如何构建和组织软件系统的基础。两种主要的编程范式包括面向对象编程(Object-Oriented Programming,简称OOP)与...

    面向对象系统分析与设计.pdf

    4. 继承:继承是面向对象设计中的一个核心机制,它允许创建一个新类来继承现有类的属性和方法。这使得软件设计可以复用和扩展。 5. UML(统一建模语言):UML是一种标准的图形化建模语言,用于软件系统的设计和文档...

    面向对象设计方法与面向过程设计方法比较

    而面向对象设计方法是一种更为现代的编程范式,以数据为核心,通过将数据和处理数据的过程捆绑成对象,模拟现实世界实体的特性。 面向对象设计方法的三个基本特点:封装性、继承性和多态性是面向对象编程的核心概念...

    UML面向对象设计与分析

    《UML面向对象设计与分析》是清华大学出版社出版的一本专著,由牛丽平编著,主要探讨了面向对象设计的重要工具——统一建模语言(UML)。这本书深入浅出地介绍了UML的各种图表及其在软件开发过程中的应用,为读者...

Global site tag (gtag.js) - Google Analytics