`
fangang
  • 浏览: 876811 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
311c4c32-b171-3767-b974-d26acf661fb2
谈谈用例模型的那些事儿
浏览量:38637
767c50c5-189c-3525-a93f-5884d146ee78
一次迭代式开发的研究
浏览量:68804
03a3e133-6080-3bc8-a960-9d915ed9eabc
我们应当怎样做需求分析
浏览量:409923
753f3c56-c831-3add-ba41-b3b70d6d913f
重构,是这样干的
浏览量:91479
社区版块
存档分类
最新评论

一次软件编程技术的探讨之旅:重新理解一切皆对象

阅读更多
面向对象编程,多么熟悉而又遥远的概念啊,我们每天都在进行面向对象的编程,但也许只有刚毕业的,甚至还在大学读书的童鞋们才能说得清楚这个概念。根据我多年的经验,正是那些最简单的、最熟悉的、最令我们不屑一顾的东西,才是我们最没搞懂的、最似是而非的、最容易产生误解的东东。因此,今天,我带领大家重新审视一下这个既熟悉又陌生的概念,相信能带给你完全不同的认识。

一提到面向对象编程,我们就不得不提到面向过程编程。面向对象编程,就是设计出一个又一个的对象,以及它们的属性、方法,以此来运行我们的系统,这是所有人都明白的概念,但问题是,为什么我们要面向对象编程?怎样面向对象编程?它与面向过程编程的差别在哪里?正是因为有太多的程序员没有弄明白这几个问题,因此他们把面向对象的程序写成了面向过程的程序。

面向对象编程,它之所以能够替代面向过程编程,成为目前主流的编程方式,是因为它真实的模拟了现实世界的事物,使我们的软件更易于理解、更方便维护、更容易变更。我们说,软件,特别是管理软件,实质就是对真实世界的模拟。真实世界是什么样子,软件就应当设计成什么样子,这是软件设计的终极目标。然而,真实世界是纷繁复杂的,如实地模拟真实世界往往并不容易。经过前人多年的实践发现,我们的软件系统对真实世界的每个细节模拟得越细致,我们的软件设计就越容易、越易于理解与维护。这种对真实世界中细节的模拟,就是面向对象编程。真实世界中的事物,就是软件世界中的对象;真实世界中事物的特性,就是软件世界中对象的属性;真实世界中对事物所赋予的行为,就是软件世界中对象的方法。同时,软件世界中对象间的相互关系,反映的正是真实世界中这些事物的关系。

那么,什么是软件系统的业务需求变更呢?任何一个软件系统,都只是对真实世界某个部分的模拟,而不可能是对真实世界所有部分的模拟,这是毫无疑问的。这个部分我们称为软件系统的边界。但问题是,真实世界总是在发展变化的,而且是越变越复杂;同时,我们的软件系统也是在发展变化的,它模拟真实世界的范围在越来越扩大。正因为这两个动因,使得我们的软件在发生业务变更。

这个道理是如此的清晰和简单,但为什么我们就那么惧怕业务需求变更呢?许多软件经历几次需求变更以后就变得臃肿不堪而难于维护,为什么?因为当需求变更到来的时候,我们没有对真实世界进行仔细分析就草草开始设计编程。我们没有按照细致模拟真实世界的主线去继续我们的设计,最后的结果就是一处不顺则处处不顺,我们在别扭的设计中一路狂奔,直到无可救药。

说得有些抽象?我们来看看一些具体的场景吧。当你开始实现一段业务需求的时候,你为系统添加了一些类,你有没有思考过你所添加的类合理不合理?随后,你为了实现一些业务流程,为各个类添加了一些方法,但你思考没思考这些方法是应该属于这个类的吗?这些方法的业务流程是否还应该予以进一步拆分?

我见过一个类包含5000行的代码,我也见过一个方法包含2000行的程序。毫无疑问,这些同事误会什么是面向对象编程了,将面向对象编程写成了实质的面向过程编程。人类认识事物,总是随着对事物认识的深入,不停地做着划分。当小孩子认识动物的时候,这是兔子,那是老虎……但随着动物认识的越来越多,开始划分为这是猫科动物,那是灵长动物……我们编程也同样。当一个业务简单时,我们用一个方法就可以了。但是,当这个方法变得越来越复杂时,我们需要根据功能拆分为多个方法,甚至独立划分出多个类出来。

话是这么说,但对于许多初学者来说,常常很难做到这一点,一不小心就写出数千行代码出来。过去我们说编码前要做详细的设计,但我要说,这对于很多人来说是不可完成的任务。怎么办呢?我们不妨曲线救国,采用另一种更加简单的方法,那就是重构。当你写出数千行代码时,没有关系,照写不误。但是,当程序写好测试通过以后,我们开始重构。先把方法中的各个代码划分成功能独立的数个代码段。分析各个代码段间要传递的数据变量。最后将一个一个的代码段剥离出来,形成一个一个的方法,再进一步剥离,形成独立的类。注意,每小改一下,测试通过,再小改一下,再测试通过。通过这样的过程,能让我们的重构更加平稳。

经过重构后的代码无疑功能结构更加清晰,会更易于阅读、更易于复用,也更易于维护。好的面向对象编程讲究的就是高内聚。什么是高内聚?就是在一个类中各个功能高度地相关,说得通俗点儿就是“单一职责原则(SRP)”,是业务需求变化的一个原因。这是一个很大的话题,有许多的原则与思想帮助我们去分析与设计,我们将在后面再详细解读。

一次软件编程技术的探讨之旅
重新理解一切皆对象
重新审视代码复用

(续)
分享到:
评论
7 楼 fangang 2013-08-29  
huang305585796 写道
有个疑问 希望请教下。总被人说你一个工作两年的IT人。别人工作四年都6-7千了。为什么你工作两年才2-3千。 指望你还有两年的时间会涨到别人那样吗(那人在移动,据说技术挺牛)。求指导。

这个社会都是凭实力说话,当你再过2年成为一个牛人,老板就会十分焦虑怕你跑了,涨工资是他唯一选择;如果你还是原地踏步就不好说了,老板可能还会想怎么还不走人。
当老板也是很不容易的,能人都跑了,留下的不是能人,明白这个道理你就知道你该怎么做了
6 楼 huang305585796 2013-07-17  
有个疑问 希望请教下。总被人说你一个工作两年的IT人。别人工作四年都6-7千了。为什么你工作两年才2-3千。 指望你还有两年的时间会涨到别人那样吗(那人在移动,据说技术挺牛)。求指导。
5 楼 zytore 2013-01-30  
 
4 楼 fangang 2012-08-22  
赞一个 ,态度决定一切,相信你能。
3 楼 ml0685833 2012-08-21  
恩,你说的我在书上思想里也有,我晓得你的意思, 所以觉得自己差好多,现在就是抓紧学啊,每天晚上自己看,白天能用我就用用,我觉得只要我保持天天看,1年后大有改观,到时候我换个相对更重视代码质量的公司,就会进入良性循环,需要努力啊
2 楼 fangang 2012-08-20  
ml0685833 写道
你的3篇文章都看过了,作为1个一年半的菜鸟,现在越来越在意这方面,最近也在看大话设计设计模式,我想关于怎么样设计出易维护、扩展与复用的代码最大阻碍就是有时候开发周期过短,所以需要失败的经验

其实所有的项目都是这样,这不奇怪。过去我们总是期望一次性完全设计到位,但现在看来非常不现实。比较好的办法就是在有限的设计的基础上进行重构,什么意思呢?

有限的设计,就是基于现在对系统理解基础上的设计,这个设计不一定是完美的,但在目前来说是合理的设计,没有过度设计。随着软件的进一步开发,甚至日后的升级变更,我们发现原有的设计需要修改。这时候我们去重构原有的设计,即在外部接口不变的基础上调整内部的实现,既保证原有功能的正常运行,又满足新功能的需求。这就是在有限的设计的基础上进行的重构。我在后面的文章中还会详细讲述这样一个过程。
1 楼 ml0685833 2012-08-20  
你的3篇文章都看过了,作为1个一年半的菜鸟,现在越来越在意这方面,最近也在看大话设计设计模式,我想关于怎么样设计出易维护、扩展与复用的代码最大阻碍就是有时候开发周期过短,所以需要失败的经验

相关推荐

    Cocos2D游戏之旅:贝塞尔曲线画心形——源代码和工具

    在这个“Cocos2D游戏之旅:贝塞尔曲线画心形”中,我们将深入探讨贝塞尔曲线这一重要的图形绘制技术及其在Cocos2D中的应用。 首先,让我们理解什么是贝塞尔曲线。贝塞尔曲线是一种在计算机图形学中广泛使用的参数...

    Python中的“实例化对象”:从零开始的探索之旅.pdf

    文章最后探讨了类的继承等主题的重要性,强调应持续跟进更多编程技术和新理念。 适用人群:具备初步Python编程基础的学习者或者希望提升对象化思维能力的技术工作者。 使用场景及目标:①帮助初学者建立对Python面向...

    主流的编程技术

    ### 主流编程技术之C++ #### 一、引言 本教材是一本经典的国外IT教材,专注于介绍C++编程语言的基础及其高级特性。教材内容丰富、真实可靠,并且极具科学性,非常适合C++编程初学者作为学习和研究的参考资料。 ##...

    设计模式之工厂奇旅:解锁高效编程新境界,让你的代码焕发活力!

    综上所述,工厂模式不仅是一种编程技术,更是一种思考问题的方式。它帮助我们在面对复杂多变的需求时,能够快速响应变化,实现高效的编程。在今后的学习和工作中,我们应该不断地深化对工厂模式的理解,并将其灵活...

    ASP.NET AJAX客户端编程之旅.zip

    在这个"ASP.NET AJAX客户端编程之旅"的压缩包中,很显然,我们将探讨如何在客户端使用ASP.NET AJAX进行高效的开发。 1. **基本概念** - **AJAX**:AJAX不是一种单一的技术,而是多种技术的集合,包括JavaScript、...

    Winsdows游戏编程之旅(八)

    对于"Windows游戏编程之旅(八)"这个主题,我们将关注消息定时器,因为它更适合简单且对实时性要求不那么高的游戏应用。以下是创建消息定时器的基本步骤: 1. **创建定时器**:调用`SetTimer`函数,该函数需要指定...

    .NET实践之旅(源代码)

    《.NET实践之旅》是一本深入探讨.NET框架和C#编程的书籍,其源代码提供了丰富的实例和练习,帮助读者加深对.NET平台的理解并提升实际编程技能。在本书的源代码中,我们可以发现一系列与.NET开发相关的知识点,包括但...

    C++实用编程技术百例精编与妙解

    根据提供的文件信息,“C++实用编程技术百例精编与妙解”这本书旨在通过一系列精心挑选的示例来提升读者的C++编程技能。接下来,我们将深入探讨几个关键的知识点,这些知识点通常会在该类书籍中被重点介绍,并且对于...

    Winsdows游戏编程之旅(四)

    在Windows游戏编程之旅的第四部分,我们探讨了关键的贴图技术,这是任何游戏或图形应用程序不可或缺的一部分。贴图技术让游戏世界变得丰富多彩,通过在2D或3D表面上应用图像,赋予游戏对象以视觉真实感。在这个环节...

    DOM探索之旅.rar

    在这个“DOM探索之旅”中,我们将深入理解这些概念,并通过实践来熟悉DOM的操作。无论是初学者还是经验丰富的开发者,都会从中受益匪浅,因为DOM是构建交互式和动态Web页面的基础。通过学习和掌握DOM,你将能够更好...

    Winsdows游戏编程之旅(二)

    在Windows游戏编程之旅的第二部分,我们将深入探讨如何在Windows环境下绘制线条,这是构建图形界面或游戏的基础元素。线条在视觉表现中起着至关重要的作用,无论是简单的指示、复杂的路径描绘还是美观的设计元素,都...

    哦哦哦哦哦哦哦哦哦哦哦哦哦

    李河汛作为一名ASP.NET软件开发工程师,他的工作不仅涵盖了编程技术,还包括项目管理、需求分析、系统设计等多个方面。我们将通过他的工作经验和项目案例,揭示ASP.NET开发中的关键技术和实践策略。" 【标签】: ...

    Winsdows游戏编程之旅(十)

    在“Windows游戏编程之旅(十)”这一章节中,我们将探讨如何在游戏中实现冒泡排序算法以及如何模拟怪兽的自由移动。这两个主题都是构建动态、交互式游戏的关键组成部分。 首先,让我们来深入理解冒泡排序。冒泡...

    cocos2dx3.x游戏开发之旅电子版

    《Cocos2d-x 3.x游戏开发之旅》是一本深度探讨Cocos2dx 3.x框架的游戏开发专著,适合对游戏编程有兴趣并有一定基础的开发者。Cocos2dx是一个开源的游戏开发框架,它基于C++,同时支持多种语言,如Lua和JavaScript,...

    动态网页编程技术教程

    动态网页编程技术是现代互联网应用的核心,它使得网站可以与用户进行实时互动,提供个性化的内容和服务。本教程将深入探讨动态网页编程的各个方面,旨在帮助初学者快速掌握这一技术。 一、网页编程基础 动态网页...

    Winsdows游戏编程之旅(三)

    在本篇“Windows游戏编程之旅(三)”中,我们将深入探讨如何在Windows环境中实现字体的绘制。 首先,Windows API提供了一种称为“GDI”(Graphics Device Interface)的图形设备接口,它允许程序员创建和操作图形...

    计算机软件-编程源码-游戏编程指南.zip

    游戏编程是计算机科学的一个重要分支,它涉及到设计、开发、测试和优化电子游戏的过程。这份“计算机软件-编程源码-游戏编程指南...通过深入学习和实践,你可以掌握创建引人入胜游戏的技能,从而开启你的游戏编程之旅。

    面向对象系统设计师之路

    面向对象系统设计师的成长之路是一条涉及深度理解和熟练应用面向对象技术的探索之旅。在这个过程中,设计模型的构建和理解是至关重要的。面向对象(Object-Oriented,简称OO)是一种编程范式,它以对象为中心,强调...

    C++语言及编程技巧

    根据提供的标题、描述和部分内容,我们可以总结出一系列关于C++语言及其编程技巧的重要知识点。以下内容将详细探讨这些方面: ### C++语言简介 ...希望以上内容能为您的学习之旅提供有价值的参考。

    软件工程课件(英文)

    《软件工程:理论与实践——基于东北大学精品课程英文课件》 软件工程是一门涉及软件开发、维护和管理的综合性学科,它旨在通过系统化、规范化的...无论你是初学者还是经验丰富的开发者,这都将是一次宝贵的学术之旅。

Global site tag (gtag.js) - Google Analytics