引用
本文同步发布在
译言。文章是关于软件设计方法论的简单介绍,源自Mark Watson的open content的一本正在写作中的书。Mark Watson是一位头发胡子皆白的grandpa级程序员,他
网站有很多有趣的内容 - http://www.markwatson.com/
软件开发方法的演化史绝对是一部寻找“银弹”的历史,即研究管理软件复杂度方法的历史。我个人的体会:开发复杂的软件系统的确,呃,复杂,由此带来不菲的时间和金钱的花费。下面我们看一下5种软件方法论的发展及应用。
4.1 结构化编程(Structured programming)
在结构化编程思想提出之前几年,我就已经开始了(始于1973)职业编程生涯。结构化编程涉及正确使用代码块,过程调用以及各种循环结构。还有一条黄金法则:go-to是有害的。
程序结构应该清晰、流程控制易于理解,这点在今天看来是毋庸质疑的。同时我也认为,结构化编程的想法已经融入后来所有的编程方法论之中。
4.2 面向对象编程(Object oriented programming)
面向对象编程(OOP)方法自然也是从结构化编程思想演化而来。OOP通过封装代码与代码使用的数据来管理软件复杂度。我们习惯于处理真实世界的物理对象,在OOP中,我们可以为真实世界的对象建模(如编写模拟程序,这也是OOP概念开始提出的地方),并对非具体概念如进程、信息组织方法等建立软件模型。
程序里“对象”维护自己的内部状态,这与结构化编程非常地不同。在结构化编程里面,代码是以一种结构化的、容易理解的方式组织,全局共享数据对于软件系统的各个部分都是可见的,包括那些并不需要访问或修改那些共享数据的部分。
4.3 设计模式(Design patterns)
睿智的人关注他们世界的各种模式。学生时候,我们可能会注意班上同学的良好学习习惯所形成的学习模式带给他们优异的成绩。我们学习烹饪时,可能注意到有经验的厨师做菜的模式,如烹饪前先备料,加调料的时候不断的尝一下等。
在软件开发领域,设计模式的使用是基于对某些项目失败而另外类似项目成功的观察(这些也可能是管理模式,计划模式,测试模式等等)。在软件设计过程中,模式的使用是基于对一些通用的设计方式在成功项目中的重复使用的进一步研究的结果。
4.4 极限编程(Extreme programming)
极限编程基于对客户需求的快速确认,快速开发与快速交付使用。极限程序员与客户交流过程中使用简单的设计,并以迭代方式优先开发软件最被需要的部分。
极限编程与传统开发方式背道而驰。传统开发方式是开发者与客户花费大量时间来试图事先将一切细节写入文档,这种开发方式占用相当长的时间。有经验的开发者知道,阶段性的完成编码对设计流程有正面影响。极限编程尤其适合那些需求复杂、或需求事先无法达成一致的情况。
在学习本书中的UML时候,我们会涉及个人如何使用软件系统的例子。极限编程有类似的概念,叫做"user stories"(这个词不知道应该如何正确翻译-by译者),即客户提供的他们感觉软件系统应该如何使用的信息。User stories会被用来估计开发时间,并帮助建立自动测试用例——用于开发测试和交付用户测试。
极限编程经常被描述为——对于我而言更加容易理解——测试驱动的编程,在编码前即编写测试代码!然后编写足够的能通过测试的代码即可。在所有单元测试通过之前,软件代码不允许改动。使用像JUnit(www.junit.org) 这样的工具来编写自动测试。
4.5 面向切面编程(Aspect oriented programming)
面向切面编程(AOP)后面的主要思想是对软件系统不同关注点的分离,开发者通过拦截方法调用并在方法调用前后添加辅助代码来实现。切面可以在对象里除了行为之外新定义特定的切面数据(aspect-specific data)。原理上,这种哲学允许系统开发更加模块化,这种模块化的实现通过程序员不同的关注点来驱动。对于Java程序员,我推荐看一下AspectJ项目(eclipse.org/aspectj). 下面是从AspectJ站点引用的:
”AspectJ 通过对以下关注点的横切达到简洁的模块化:错误检测和处理,同步,对上下文敏感的行为,性能优化,监控及日志,调试支持,多对象协议”
无论是免费的Eclipse还是商业的IntelliJ Java IDE都支持AspectJ. AspectJ 是Java语言的扩展,需要预处理。我在为开源web框架Jaffa做收费咨询的时候用过Java的切面。在使用动态语言像Ruby和Lisp时,切面更加有用。Ruby和Common Lisp允许在任何源文件为一个类增加方法,这种优势意味着特殊的目的以及特定应用的对库的扩展可以与库的源代码相分离。
一个简单的使用切面的例子如下:你有一个类库来处理收发邮件,然后来了一个商业方面的需求,按收信人和发信人分类,记录邮件的数目和大小。分离的切面就能让你通过代码注入的方式来实现对邮件的监测,而不需要改变原类库的代码。这会让类库作者更加容易地维护他们的代码,不用增加对邮件监测的代码。
分享到:
相关推荐
第四代软件(1970年代-至今)伴随着数据库管理系统、图形用户界面(GUI)、网络技术、面向对象编程语言(如C++和Java)等的出现,软件开发进入了新的阶段。数据库技术使得数据共享和管理成为可能,GUI极大地改善了...
80年代,操作系统如MS-DOS和苹果的Mac OS,以及编程语言如C++的出现,为软件开发提供了新的平台。个人电脑的性能和可用性进一步增强,互联网也开始兴起,改变了人们的生活方式。 90年代至21世纪初,计算机硬件和...
测试报告是软件开发过程中至关重要的一环,它详细记录了项目的测试过程、结果和分析,确保软件的质量满足预期。以下是对标题和描述中所述知识点的详细说明: 1. **测试报告的目的**:测试报告的主要目的是总结测试...
### C语言简史 #### 摘要与背景 C语言是一种系统级编程语言,...总结来看,C语言的诞生和发展历程是一段充满挑战和创新的历史,它不仅影响了后续编程语言的设计,也为现代软件工程和操作系统的发展奠定了坚实的基础。
本书分类描述了一组设计良好、表达清楚的软件设计模式,这些模式在实用环境下特别有用。本书适合大学计算机专业的学生、研究生及相关人员参考。 [strong][font color="#ff0000"]书评[/font][/strong][font ...
面向对象编程不仅改变了软件开发的方式,也深刻影响了计算机科学教育、工业标准和互联网的发展。在未来,随着技术的不断革新,面向对象编程的理念将继续演化,为解决更复杂的问题提供强大的工具。
软件流程图是软件设计中的重要一步骤,它可以帮助开发人员将软件设计的想法和概念转化为可视化的图形,进而提高软件开发的效率和质量。VISIO是一种流行的软件流程图绘制工具,它可以帮助开发人员快速地创建软件流程...
论文首先介绍了邮箱管理服务器的简述、发展简史和工作过程,然后对邮箱管理服务器进行需求分析、基本结构设计和准备工作的介绍。接着,论文对开发工具、开发语言、开发软件的安装等进行了详细的介绍。然后,论文对...
早期的软件开发没有系统方法可以遵循,软件设计是在某个人的头脑中完成的一个隐藏的过程。随着计算机技术的发展,人们认识到增加软件功能会使计算机系统的功能得到很大提高。这个时期软件的含义是:“软件 = 程序 + ...
网站开发工具是指在网站开发过程中使用的各种软件和技术,例如编程语言、数据库管理系统、开发框架、版本控制系统等。 在网站开发流程中,计划阶段是指确定网站的目标和功能,设计阶段是指设计网站的用户界面和布局...
- 软件工程是应用系统的方法和技术来组织和指导软件的开发、操作和维护过程,包括软件需求分析、设计、编码、测试和维护。 - 其核心目标是提高软件质量、降低开发成本,以及确保软件项目按时完成。 4. **软件工程...
该教材旨在介绍软件工程的基本理念、历史发展以及在实际应用中的关键环节,帮助学生和从业者理解软件开发的系统性和规范性。 1)软件的特点: 软件是一种无形产品,具有以下几个显著特点: - 抽象性:软件不具有...
敏捷开发是一种软件开发方法论,它强调快速、灵活和适应性,以便更快地交付高质量的软件产品。以下是敏捷开发的核心知识点概述: 一、敏捷起源 敏捷开发起源于2001年2月,当时17名软件工程师在美国犹他州的Snowbird...
计算机编程简史是一个涵盖广泛的主题,它记录了从第一台...每一种语言都有其独特的设计理念和应用场景,共同构建了我们今天所熟知的软件世界。通过了解这段历史,我们可以更好地理解编程的本质,为未来的创新奠定基础。
1973年,Dennis Ritchie在BCPL和B语言的基础上设计出了C语言,这个名字取自BCPL的第二个字母。Dennis Ritchie用C语言重写了UNIX操作系统内核和应用程序,C语言因此在UNIX环境中迅速普及,成为主要的编程语言。 1978...
- 详细描述了软件设计的一般过程。 - **设计原则与因素:** - 介绍了一些重要的设计原则,以及影响设计的因素。 - **软件结构图:** - 使用软件结构图来表示软件的整体架构。 - **结构化设计方法:** - 结构...
10. 电子邮件管理服务器的设计与实现:电子邮件管理服务器的设计与实现包括对邮件服务器的设计、开发和实现等几个方面。 通过本文档,我们可以了解到基于Java的邮箱管理服务器的设计与实现过程,包括需求分析、系统...
还包括三维景物表示、图形信息的存储、检索与交换技术、基于图像和图形的混合绘制技术、图形的操作与处理方法、人机交互与用户接口技术、动画技术、图形硬件与输出技术、图形标准与图形软件包的研究开发、虚拟现实...