在编写任何代码之前,您如何计划应用程序的体系结构?[关闭]


84

我遇到的一件事是在编写任何代码之前先规划应用程序的体系结构。

我并不是说要收集要求以缩小应用程序的工作范围,而是要有效地思考一种布局总体类,数据和流结构的好方法,并对这些想法进行迭代,以便我有一个可靠的计划。在打开IDE之前,请牢记操作。现在,只需打开IDE,创建一个空白项目,开始编写位和鲍勃并让设计从那里“长出来”就可以了。

我收集到UML是执行此操作的一种方法,但是我没有使用它的经验,因此看起来有点模糊。

在编写任何代码之前,如何计划应用程序的体系结构?如果要采用UML,您能为小型应用程序开发人员推荐一个简洁实用的介绍吗?

感谢您的投入。

Answers:


32

我真的发现,在纸上或白板上进行初次写作确实至关重要。然后,如果需要,可以使用UML,但是没有什么比刚开始时手工绘制具有更大的灵活性了。


30
确保将超级安全的“请勿擦除”放在白板上。:)
MusiGenesis

1
最初的设计您真的无法击败白板和纸张。简单,灵活和富有表现力。
Booji Boy

3
您可以在使用后层压白板...:P
Patrick

41

我考虑以下几点:

  1. 系统应该做什么,即系统试图解决的问题是什么
  2. 谁是客户,他们的愿望是什么
  3. 系统必须整合什么
  4. 是否有任何遗留方面需要考虑
  5. 用户的干扰是什么
  6. 等等...

然后,我开始将系统视为黑匣子,然后:

  1. 黑匣子需要发生什么相互作用
  2. 黑匣子内部需要发生的行为是什么,即黑匣子在那些交互中需要发生什么才能在更高级别上表现出所需的行为,例如接收和处理来自预订系统的传入消息,更新数据库等。

然后,将开始为您提供一个由各种内部黑匣子组成的系统视图,每个黑匣子都可以用相同的方式进一步分解。

UML很好地代表了这种行为。您可以仅使用UML的许多组件中的两个来描述大多数系统,即:

  • 类图,以及
  • 顺序图。

如果需要描述行为中的任何并行性,那么您可能还需要活动图。

马丁·福勒(Martin Fowler)的出色著作“ UML Distilled”(亚马逊链接-已针对那里的脚本kiddie link nazis(-:)进行了消毒)是一本很好的学习UML的资源。 UML。

哦。我所描述的几乎是Ivar Jacobson的方法。雅各布森是OO的三个朋友之一。实际上,UML最初是由另外三个人Grady Booch和Jim Rumbaugh共同开发的,这三个人组成了三个好友。


18

您绝对应该看一下史蒂夫·麦康奈尔(Steve McConnell)的《代码完成》,尤其是他关于“建筑设计”的赠品章节。

您可以从他的网站下载:

http://cc2e.com/File.ashx?cid=336


这是非常好的阅读-很多好的信息,建议和想法。也不长。
Booji Boy

买书并阅读第6章,该章是关于各个班级的设计的。然后再阅读所有其他章节-这是纯金。
MarkJ

哦,是的,第4章是关于应用程序体系结构的
MarkJ

假装在这个行业中做严肃事情的每个人,无论他们将扮演什么角色,都应该明确阅读该书。
Chepech 2010年


8

首先,我要说的是,我主要进行Web开发,因为许多架构都是预先确定的(WebForms,现在是MVC),而我的大多数项目都是相当小的单人工作,不到一年的时间。我也知道,我将有一个ORM和DAL分别处理我的业务对象和数据交互。最近,我已经为此使用LINQ,因此许多“设计”都通过DBML设计器成为数据库设计和映射。

通常,我以TDD(测试驱动开发)方式工作。我不会花很多时间在建筑或设计细节上。我确实通过故事收集了用户与应用程序的整体交互。我使用这些故事来设计交互设计并发现应用程序的主要组件。在此过程中,我与客户进行了很多白板交易-有时用数码相机捕获细节,如果它们看起来足够重要,可以保持图表形式。我的故事主要是在Wiki中以故事形式捕获的。最终,故事被组织成发行和迭代。

到这个时候,我通常对体系结构有了一个很好的了解。如果很复杂或有不寻常的地方-与我的常规做法有所不同-或我正在与其他人(不是典型的人)一起工作,我将在白板上画图。复杂的交互也是如此-我可以在白板上设计页面布局和流程,保留它(或通过相机捕获),直到完成该部分为止。一旦我对要去的方向和首先需要做的事情有了一个大致的了解,我将开始为第一个故事编写测试。通常,这就像:“好吧,要做到这一点,我将需要这些类。我将从这一类开始,并且它需要做到这一点。” 然后,我开始愉快地进行TDDing,并且架构/设计从应用程序的需求中发展而来。

定期地,我会发现自己想重新编写一些代码,或者认为“这确实很香”,我将重构设计以消除重复,或者用更优雅的方式替换这些臭味。通常,我关注在遵循良好设计原则的同时降低功能性。我发现使用已知的模式并在遵循过程中注意良好的原则效果很好。



4

UML是一种表示法。这是一种记录您的设计的方法,但(我认为)不是一种设计。但是,如果您需要写下来,我会推荐UML,不是因为它是“最好的”,而是因为它是其他人可能已经知道如何阅读的标准,并且它胜过发明自己的“标准”。

我认为,关于UML的最佳介绍仍然是Martin Fowler撰写的《UML Distilled》,因为它简洁明了,为使用它提供了实用指导,并且很显然,您不必为整个UML / RUP故事买单。有用

做设计很困难,实际上并不能在一个StackOverflow答案中捕捉到。不幸的是,我的设计技能(例如它们)已经发展了多年,因此我没有一个可以参考的资源。

然而,一个模型,我发现有用的鲁棒性分析(谷歌,但有一个前奏这里)。如果您有系统应该做什么的用例,涉及到什么的领域模型,那么我发现健壮性分析是将两者联系起来并确定系统的关键组成部分的有用工具。 。

但是最好的建议被广泛阅读,认真思考和实践。这不是纯粹的可教技能,您必须真正做到这一点。


4

我不够聪明,无法提前计划。当我确实提前计划时,我的计划总是会出错,但是现在我已经花了n天时间制定了糟糕的计划。我的极限似乎在白板上大约15分钟。

基本上,我会花很少的精力来确定我是否朝着正确的方向前进。

我在设计时考虑了一些关键问题:当A到B时,对于D而言,它是否足够快?如果没有,我们需要一个不同的设计。这些问题中的每一个都可以一口气回答。如果峰值看起来不错,那么我们就有了设计,是时候对其进行扩展了。

我编写代码的方向是尽快获得真正的客户价值,以便客户可以告诉我应该去哪里。

因为我总是会出错,所以我依靠重构来帮助我正确处理。重构是有风险的,因此我必须随时编写单元测试。由于耦合而很难编写单元测试,因此我首先编写测试。对这些东西保持纪律是很难的,而且不同的大脑对事物的看法也不同,所以我喜欢和我一起做一个伙伴。我的编码伙伴有鼻子,所以我要定期洗澡。

我们称之为“极限编程”。


1
我可能花了超过15分钟的时间,但是您的回答与我共鸣。我觉得我在设计上不会犯错,所以我大胆地设计了经过实践证明是可行的。然后,我可以随时处理任何不一致的地方。
steviesama

我知道您在那儿做了什么
-hitch.united


3

我不相信有什么可以在实施之前预先计划。我有10年的经验,但是只有4家公司(其中1家公司有2个站点,几乎是相反的对立面),而且我的几乎所有经验都是在观察巨大集群方面****** **发生。我开始认为诸如重构之类的东西确实是最好的处理方式,但是与此同时,我意识到自己的经验有限,而且我可能只是对自己所见即所得做出反应。我真正想知道的是如何获得最佳体验,以便能够得出正确的结论,但是似乎没有捷径可走,而这只是涉及到看到人们在做错事情的大量时间:(。我真的很想在一家人做正确的公司工作(成功的产品部署证明了这一点),


2

我要不同的是:UML可以用于应用程序体系结构,但更经常用于技术体系结构(框架,类或序列图等),因为在这里,这些图可以最轻松地与开发保持同步。

当您采用一些功能规范(在不对未来实现做任何假设的情况下描述了操作的性质和流程)并将它们转换为技术规范时,就会发生应用程序体系结构

这些规范代表了应用程序,你需要实现一些业务和功能需求。

因此,如果您需要处理多个大型金融投资组合(功能规范),则可以确定需要将该大型规范划分为:

  • 调度程序,将这些繁重的计算分配给不同的服务器
  • 启动器,以确保在开始处理这些投资组合之前所有计算服务器都已启动并正在运行。
  • 一个GUI以便能够显示正在发生的事情。
  • 一个“通用”组件,可以独立于其余应用程序体系结构开发特定的组合算法,以便于进行单元测试以及某些功能和回归测试。

所以基本上,考虑一下 应用程序体系结构是决定需要以一致的方式开发哪些“文件组”(您不能在同一组文件中开发启动器,GUI,调度程序……):将无法以相同的速度发展)

定义好应用程序体系结构后,通常可以将其每个组件用作配置组件的候选对象,即一组文件,这些文件可以全部版本化为VCS(版本控制系统),这意味着其所有文件都可以每次需要记录该应用程序的快照时都将它们标记在一起(同样,很难标记所有系统,其每个应用程序不能同时处于稳定状态)


2

我从事建筑已有一段时间了。我使用BPML首先优化业务流程,然后使用UML捕获各种细节!第三步通常是ERD!到您完成BPML和UML时,您的ERD将相当稳定!没有计划是完美的,没有抽象将是100%。规划重构,目标是尽可能减少重构!


1

我试图将我的思想分解为两个方面:我要操纵的事物的表示形式以及我打算如何处理它们。

当我试图对要操纵的东西进行建模时,我提出了一系列离散的项定义-电子商务站点将具有SKU,产品,客户等。我还将处理一些与我无关的东西-订单或类别。在系统中拥有所有“名词”之后,我将创建一个域模型,该模型显示这些对象之间的相互关系-订单有一个客户和多个SKU,许多功能组合到一个产品中,如此上。

这些域模型可以表示为UML域模型,类图和SQL ERD。

一旦弄清了系统的名词,我就继续进行动词-例如,这些项中的每一项都要执行的操作才能提交命令。这些通常可以很好地映射到我的功能需求中的用例-表达我发现的最简单的方法是UML序列,活动或协作图或泳道图。

将其视为一个迭代过程很重要;我将在领域的一个小角落,然后进行操作,然后再返回。理想情况下,随着我的前进,我将有时间编写代码来尝试一些东西-您永远都不希望设计在应用程序之前走得太远。如果您认为要为所有内容构建完整的最终体系结构,则此过程通常会很糟糕。实际上,您要做的只是建立团队在开发过程中将共享的基本基础。您主要是在为团队成员创建共享词汇表以供他们在描述系统时使用,而不是就如何完成工作制定法律。


1

我发现自己在对系统进行编码之前无法全面考虑。只粗略浏览一下某些组件,这太容易了,您后来才意识到它们比您想象的要复杂得多。

一种解决方案是尽力而为。随处编写UML。上每一堂课。考虑一下它将如何与您的其他班级互动。这很难做到。

我喜欢做的是首先进行总体概述。我不喜欢UML,但我确实喜欢能说明问题的绘图。然后,我开始实施它。即使我只是用空方法写出类结构,我也经常看到我以前错过的东西,因此我更新了设计。在编写代码时,我会意识到我需要做一些不同的事情,因此我将更新自己的设计。这是一个反复的过程。“首先设计一切,然后实施全部”的概念被称为瀑布模型,我认为其他人已经证明这是一种不良的软件开发方式。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.