面向对象的分析与设计

目录

介绍

你会学到什么?

你不会学到什么?

背景

软件开发过程模型简介

为什么我需要了解过程模型

面向对象的分析和设计——最需要的定义

开发过程与开发方法论的区别

面向对象分析

面向对象的设计

你应该开始的最重要的原则是什么?

面向对象分析与设计的优势

简单的例子

用户故事

面向对象分析的步骤

领域模型

具有属性和关联的领域模型

面向对象设计的步骤

序列图

设计类图

到目前为止的总结

为什么你最后的设计尝试失败了?

如果你只是学习如何完美设计

您必须在编码之前进行完整的分析和设计

你必须有足够的时间来设计

你相信UML(统一建模语言)就是一切

你必须应用所有的模式和原则

你不知道如何处理你的老板/经理


使用简单的方法学习面向对象的分析和设计,即使您之前在课堂上尝试过并发现它很复杂

案例及uml的pdf:SourceCodeAndUMLDiagrams

介绍

谁做了这件事?它有什么好处吗?如果我这样做,我的老板会认为我在浪费时间或找不到工作的借口。当你急切地想要正确设计下一个软件时,有没有想过这些想法?

您之前也可能尝试过设计软件,但您发现它只是耗时并且没有任何好处。但是在你的整个职业生涯中,你有这些反复出现的想法,我应该学习什么是设计模式,我应该如何掌握MVC,有一天我会设计一些可重用,模块化和易于阅读的东西。

在这篇文章中,我将介绍有关如何正确设计下一个软件的基础知识,即使您上次是失败的。

你会学到什么?

  • 为什么你的上次设计尝试失败?
  • 如何在设计时处理经理/老板?
  • 你将如何成功设计?
  • 什么是软件开发流程?
  • 什么是面向对象的分析?
  • 什么是面向对象的设计?
  • 什么是设计模式?
  • 介于两者之间的任何事情都让你感到困惑

你不会学到什么?

  • 您将不会学习JavaC#或C ++的语法
  • 你不会学习函数和变量之间的区别
  • 您不会被设计模式列表所淹没
  • 你不会在这里学习面向对象的编程

什么?(你可能会在阅读完最后一行后说)没有面向对象的编程,那么为什么我在这里浪费时间。这篇文章是关于面向对象的设计,但不是编程。我们都知道面向对象的编程,即如何用C#编写一个类并创建一个对象或扩展一个类,你知道根据你的经验这没有用。

正如一句话所说,知道如何拿锤子不会让你成为一名建筑师。真的吗?同样,学习Java编程也不会使您成为优秀的软件工程师(或软件程序员或开发人员或软件架构师)。

背景

在我本科课程的最初几年,我认为设计等于编写算法,因为我没有研究面向对象的编程。后来,当我学习面向对象编程时,我认为,一个人只要学会DietelDietel 1000页书中的一切,就能征服世界。

但事实并非如此。如果不撕裂我的头发,我就无法编写程序。我还注意到,如果我在6个月后再次打开我的程序,看起来就像是一个神秘的东西,即使是福尔摩斯也无法解决它。

然后在第学期,我了解了面向对象的分析和设计主题。但不幸的是,重点是UML建模。我认为UML是一件很酷的事情——你只需要生成一些图表并将它们交给开发人员,他们将使用你的设计编写代码(这会让你自豪)。

甚至在UML建模工具中也有一个选项,我们类当时正在使用它,该工具可以自动从UML类图中生成代码。多么美,现在我使用UML模型设计然后生成代码,编译代码并将其发送给客户并像比尔盖茨一样致富。真棒。

自那之后,现实是,我从来没有能够生成模块化,易于扩展和易于理解的设计(由于UML工具只生成存根,因此从未编译这些工具生成的代码)。然后开始一段混乱的时期。

后来在我的本科学习中,我学习了与软件工程,软件架构,软件过程模型和软件项目管理相关的主题。但直到很晚才能把所有东西放在一起。

尽管如此,我看到人们正在努力解决这些问题并无法将这些概念融合在一起。他们对可用的非结构化数据感到不知所措。理解所有这些信息的一个关键是让自己参与一个项目。该项目的唯一输出应该是您的用户可以使用的软件。

在这篇文章中,我将分享一些基本的面向对象分析和设计原则,实践和我的经验,您可以在下一个项目中使用。

软件开发过程模型简介

我们都使用一些过程或步骤来开发软件。我使用的最简单的流程模型是我只在纸张背面写了6行并将它们称为功能列表,然后打开Visual Studio并开始编写代码。就是这个。我在大学期间使用的过程模型。

我使用这个过程模型在我大学的第二年使用Visual Basic 6.0编写了我的第一个商业软件(仅供1位用户使用,后来他放弃了)。

有许多软件开发过程模型,我已经研究过,并已应用于许多项目中。

一个过程模型(被许多权威机构指责)是瀑布过程模型。这些是瀑布流程模型中的步骤:需求收集,分析,设计,实现和测试。

瀑布流程模型的问题在于,您按照与上面所述相同的顺序执行所有操作。首先,所有要求都是从客户处收集的。一个团队分析需求、文档并为设计团队准备规范。然后,设计团队使用规范开发设计,并将设计交给实施团队。实施团队根据设计编写代码。最后,测试团队根据规范测试软件。

一切都按顺序完成,并且在最终产品给到客户之前花费了大量时间(数月甚至数年)。统计数据告诉我们,当使用瀑布流程模型将产品给到客户时,大量客户拒绝使用该产品,因为它不符合他们的要求。

您可能听说过这句行话客户永远是对的。这真的适用于软件开发,如果客户不喜欢最终产品,然后浪费了所有的努力(数月和数年)。

为了迎合这个问题,还有另一种哲学叫做迭代和进化发展。基于这种理念,有许多软件开发过程模型。一些例子是Scrum,极限编程(XP)和Rational Unified Process。它们也被称为敏捷开发过程。

迭代开发的概念很简单。软件开发被组织成一系列称为迭代的小项目。每次迭代都有其分析,设计,实现和测试。在每次迭代结束时,将获取客户输入。如果客户不同意,那么与瀑布流程模型相比,损失很小(通常是几周)。

现在您了解迭代和顺序过程模型之间的基本区别。许多组织现在使用迭代开发过程模型。关键的想法是尽量减少浪费(数月与数周)。

为什么我需要了解过程模型

很长一段时间,我认为设计软件是这样的:我在开始时设计所有内容然后使用这个设计开始编码,编译然后将运行的软件交给最终用户。

事实证明,这不是最好的方法。您将不得不改变您的设计,您的设计会随着时间的推移而发生变化。因此,增量和进化过程模型对于理解非常重要。完美的设计是一个神话。在后续迭代之后,人们可能会意识到他或她的初始设计很糟糕。

另一点是,人们不应该在开始时设计所有要求。人们应该为一个工作的迭代做一个详细的设计。

因此,关键的一点是,您应该使用迭代开发过程,并且在项目开始时不会完成完整的设计。同样,无论您设计的是什么都不完美,并且会在项目的生命周期中进行更改或改进。

面向对象的分析和设计——最需要的定义

当我开发我使用VB 6.0开发的第一个项目时,我对自己很失望。这是因为一小部分代码中的单个更改传播到软件的所有其他部分。

原因是我不知道如何编写模块化代码。尽管可以用过程语言编写模块化代码(VB 6.0是程序性的),但它很难并且在VB 6.0中本身不受支持。

开发一个只有4个功能的简单软件是一场噩梦。在代码中进行任何更改是可怕的,因为我不知道面向对象编程。

该问题的解决方案是面向对象的编程。这使我能够编写模块化程序。在解释OOPOOAD如何帮助我之前,首先让我们讨论流程和开发方法之间的区别。

开发过程与开发方法论的区别

开发方法是一个过程。开发方法的示例是结构化编程,面向对象和面向服务的编程。

开发过程定义了一组执行软件开发活动的步骤。软件开发过程的例子是瀑布过程,统一软件开发过程,Scrum和极限编程。通常,您可以选择任何流程方法,然后在该流程中采用任何开发方法。

面向对象分析

没有人告诉你的面向对象方法的一个重要好处是:你有能力使用真实世界的术语或领域特定的术语进行设计。例如,如果您正在处理与银行服务相关的软件,那么您可以在软件代码中使用帐户,分类帐,资产负债表等术语(作为名称或类的属性)。

这有什么好处?您可以像在现实世界中的真实系统一样设计软件。这使您可以轻松更新,修改和与客户沟通。因此,面向对象的分析是关于识别可以在软件世界中表示现实世界对象的机会。

面向对象分析的第一步是收听客户故事并将其写下来。故事是用他自己的话来描述顾客的痛苦和收获。您的工作是解决这些客户的痛苦和/或帮助客户取得积极的成果。

可能有多个客户故事。您可以在一次迭代中处理一个或两个用户故事。但是,不要在一次迭代中处理超过10%的故事。下一步是根据用户故事设计领域模型。

为了设计领域模型,我随着时间的推移使用的一种简单技术是阅读用户故事并强调名词。这些名词是您的域模型中类的潜在候选者。领域模型仅描述类的名称和/或类的属性。领域模型不描述任何实现细节,例如类中的函数。

总之,有两个步骤:

  1. 写下用户故事
  2. 设计领域模型

在接下来的示例中将展示这方面的示例。

面向对象的设计

查看一个对象并说“是的,它是变量的集合”非常简单。让我分享一个个人故事:曾经我重构了一段代码并设计了一个由两种原始类型组成的独立类。有趣的是,另一位开发人员为我开发一个新变量而欢呼。

有许多开发人员都是这样想的。那就是创建一个类意味着创建一个新变量。这不是人们使用面向对象方法的原因。如果您只想要一组变量名,那么您可以使用C语言中的struct(这不是面向对象的编程语言)。

面向对象的设计是关于对象如何相互协作的。在这里,您将决定谁将创建哪些对象以及它们将如何交互以满足用户故事的需求。

关于分析最重要的事情是从用户故事中识别领域类,而面向对象设计中最重要的是识别对象之间的协作以满足用户故事。

除了设计协作之外,软件社区还遵循原则和模式。四种模式的帮派广泛用于软件设计,但这些模式值得另一篇文章(我将很快与您分享我的个人故事,即我的设计模式之旅)。

如果您不熟悉设计,那么不要被所有这些模式事物所淹没。在开始时只关注一两个原则。然后将您的学习扩展到更多原则和设计模式。

你应该开始的最重要的原则是什么?

不要被原则和设计模式所淹没。我的建议是关注一些你在一开始就习惯的原则和设计模式,然后从那里开发。

我发现一个非常有用的重要原则,我建议你应该使用的是:

喜欢组合而不是继承

这是尽可能避免使用继承。在任何你认为继承是答案的情况下使用组合。

此外,如果您从未在代码中使用过接口,那么从今天开始使用接口。这将使您能够编写可重用和模块化的软件。

应用这两个原则,在接下来的几周内,您将体验到面向对象分析和设计的强大功能。

面向对象分析与设计的优势

凭借这些面向对象编程的原理和知识,我能够编写一个模块化且易于阅读的软件。另外,如果我今天打开我10年前写的代码,我可以轻松理解,并且可以轻松更新代码。

简单的例子

这是一个简单的例子,描述了面向对象分析和设计的简单过程。

首先,我将分享我们将在此示例中解决的用户故事:

用户故事

  • 顾客带着要购买的物品到结账处
  • 柜台的店主迎接并开始新的销售
  • 店主输入所有物品
  • 系统计算订单总额和税金
  • 客户付款
  • 系统打印收据并更新库存

面向对象分析的步骤

按以下顺序执行以下三个步骤:

  • 识别类名
  • 识别属性
  • 确定关联

现在我建议你在用户故事的文本中强调所有名词,你认为它们是我们代码中类名的最好候选者。

以下是通过阅读上面的用户故事我可以想到的所有类的名称:

领域模型

您可以在图表中看到它不是使用任何UML工具开发的。只需使用笔和粗糙的纸张。我的设计中有60%以上是使用纸张或白板完成的。

后续步骤:识别属性和关联。属性是定义类或对象的属性。属性可以是Id,数量或可以测量的任何内容。关联定义类和对象之间关于类如何连接到另一个类的关系。

下图显示了上面显示的类图的属性和关联:

具有属性和关联的领域模型

面向对象设计的步骤

经过分析,我们转向面向对象设计,以下是步骤:

  • 绘制每个场景的序列图
  • 绘制设计类图
  • 应用设计原则和软件设计模式

序列图用于显示在类对象之间传递的消息。它是面向对象设计中最重要的工具,因为它有助于设计软件中涉及的对象的行为。

以下是我为解决用户故事而绘制的序列图:

序列图

此序列图显示了消息以及在对象之间发送消息的顺序,以完成用户故事的目标。

从序列图中,我们可以轻松地提出设计类图。设计类图是我在进入代码之前通常创建的最后一个工件。

从序列图中绘制设计类图非常容易。只需在箭头指向的类中记下方法名称。例如,GetItem()消息从Sale类转到Item类。因此,item类将包含该GetItem()方法。

设计类图

在设计类图之后,我们可以应用面向对象设计和设计模式的原则,但我将提出另一个应用设计模式和原则的帖子。

从这里开始,我们可以转向编码并开始编码。

这是描述该过程的一个非常简单的例子。对于现实世界和现实世界面向对象的分析和设计示例,您可以查看此链接

到目前为止的总结

到目前为止,您已经了解了什么是软件开发过程,软件开发方法以及它们之间的差异。为什么面向对象的分析和设计比面向对象的编程更重要。您学习了面向对象分析和面向对象设计的步骤,技术和目的。

您还从一个简单的示例中学习了如何使用基本但最重要的原则和技术开始正确设计软件。

为什么你最后的设计尝试失败了?

许多开发人员已经尝试正确设计软件项目但是已经失败或无法继续。因此,我汇总了一系列关于面向对象分析和设计的问题或误解以及如何解决它们。

如果你只是学习如何完美设计

项目开始时的完美设计是一个神话。随着时间的推移,您的设计将不断发展,变化,纠正和修改。许多人认为他们必须在开始时完美地设计,然后将设计文件视为神圣的经文。事实上,没有人能够在一开始就提出完美的设计。

软件设计是一个启发式过程。这是您在项目生命周期内更新的内容。每次都没有可用于生成最佳面向对象设计的公式。它涉及试验和痛苦的错误,您可以从中学习,然后将这些知识应用到您未来的项目中。

您必须在编码之前进行完整的分析和设计

许多开发人员和学生认为,分析所有需求和所有设计应该在编码开始之前和构建期间完成,不能改变或扩展它。

这是不现实的。如果在编码期间,团队或开发人员意识到设计可以扩展或减少,那么它应该是可以改动的。

类似地,在迭代开发中工作时,通常在一次迭代期间处理所有需求的10%。因此,您只需要设计所有要求或用户故事的10%。如果您有10个用户故事,那么在第一次迭代中处理一个最重要的故事(如客户所说)并仅为此设计。

你必须有足够的时间来设计

当我开始认真对待面向对象设计感兴趣的时候,我花了几周的时间来设计并考虑提出一个完美而完整的设计。但是在编码过程中,事情并没有按照预期的那样发挥作用,我很失望。

经验法则是,您不应该为一个为期三周的迭代提供超过一天的时间。在跳转到代码之前我只给了24个小时。这并不意味着你不能在施工期间重新设计几个小时。您可以与队友会面并在施工期间讨论设计决策。

你相信UML(统一建模语言)就是一切

如果有人告诉你UML建模就是一切,并推荐一些昂贵的CASE(计算机辅助软件工程)工具,那么你应该来看看我的文章。我的大多数设计都没有使用我们公司的CASE工具。在团队设计时,我们使用白板并对其进行拍照,然后将这些图片发布到项目目录中。

我相信设计不是你使用漂亮的颜色框绘制并正确对齐它们的东西。纸上的粗略图表与使用CASE工具绘制的图表一样有效。OOAD是关于在编写代码时了解全局并与您的同事以及您自己进行交流。

UML只是您用来翻译设计思路的工具,可以与其他开发人员共享。简单地学习UML不会让你成为一名优秀的设计师。

你必须应用所有的模式和原则

如果您了解所有面向对象的设计原则和模式,那么您可能已经意识到在转向构建之前要应用所有这些原则和模式。如果你这样做,那么你就不会成功。根据手头的情况或问题使用原理和模式,您将能够设计出一个好的软件。

我建议你应该制定自己的优先级模式和原则列表,这些是你已经完全理解了的。然后,根据您面前的问题应用这些模式。

你不知道如何处理你的老板/经理

当你提出面向对象分析和设计的想法时,你的老板可能会反抗。在老板看来,它看起来像是一个额外的任务,它不会为你的软件添加任何代码行。此外,您的老板也可能不是来自编程背景,也不会意识到OOAD的重要性。因此,有一些方法可以管理你的老板。

有两种老板:

  1. 质量驱动
  2. 计划驱动

找出影响你的老板或经理的因素。如果您的老板是质量驱动的,那么您可以向他展示面向对象分析和设计如何帮助他实现更高质量的功能,如模块化,可读性和可靠性。

如果你的老板是时间表驱动的,那么你能做的第一件事就是向他展示分析和设计活动不会花费太多时间(在3周的迭代中只需2-8小时)。您还可以向他展示其他节省时间的好处,例如良好的设计可以节省项目后期的时间,例如当您必须更新或更改软件的某些功能时。

 

原文地址:https://www.codeproject.com/Articles/1137299/Object-Oriented-Analysis-and-Design

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值