快捷搜索:

演化架构和紧急设计: 演化架构

在 本系列的第一期 中,我保举了软件天下中的一些架构定义。无论若何,假如您已经涉猎过本系列,您会留意到我花费了大年夜部分光阴在设计上。我之以是这么做是基于以下几个缘故原由:首先,在当前紧急设计尚未被广泛关注时,软件天下里存在很多架构定义(良莠不齐);其次,在设计方面很多问题都有详细的、不受情况限定的办理规划。架构每每还涉及到很多组织内的物理和逻辑根基举措措施,使其难以自力谈起。

关于本系列

本 系列 旨在从全新的视角来先容常常评论争论然则又难以理解的软件架构和设计观点。经由过程详细示例,Neal Ford 将赞助您在演化架构 和紧急设计 的机动实践中打下坚实的根基。经由过程将紧张的架构和设计抉择推迟到着末责任时候,您可以防止不需要的繁杂度低落软件项目的质量。

这一期填补了敏捷构架材料缺掉的空缺。在此我评论争论的是若何分辨架构和设计,涵盖了一些广泛的架构斟酌,然后经由过程评论争论版本节制端点,浅谈敏捷的面向办事架构(SOA)。

分辨架构和设计

Martin Fowler 对架构的定义(来自和他的对话中)是我觉得最好的:

架构便是完成之后很难变动的器械。以是这种器械应该尽可能越少越好。

您可以想象一下架构和设计之间的交互,如图 1 中所示的关系:

图 1. 架构和设计的关系

一个软件系统的架构形成是所有其他部分存在的根基,如 图 1 中的灰盒所示。设计部分存在于架构之上,如红盒所示。处于更根基的职位地方,架构部分难以移动和调换是由于您不得不移动所有以架构为根基的部分来适应改变。这必然义使识别设计和架构更为简单。例如,您所应用的 Web 框架便是一个架构,由于它难以调换。只管,在那个 Web 框架中您应用不合的设计模式来表述特定的目标,这就表示大年夜部分的正式设计模式是设计,而不是架构的一部分。

Fowler 所定义的架构的推论是:您应该机动地构造架构部分,以便能够更轻松地调换它们(假如然的必要的话)。然则若何才能确保这点呢?这里有个例子。

许多框架都邑试图引诱您应用其自身的类,而不是 JDK 或者一个开放标准机构(例如 OASIS)供给的更普遍的类。这便是耦合的 “毒贩模式”:假如您屈服这些引诱,您就只能永世受制于框架。这些框架采取的普遍措施便是,假如您应用了它们的类,某方面就会变得非常简单。这方面的完美例子就来自于 Apache Struts Web 框架。

在您的利用法度榜样中包孕营业规则和其他非根基举措措施代码的类是域类:它们包孕着您的问题领域相关的有趣信息。Sturts 中的一个好助手类便是 ActionForm 类。假如您从 ActionForm 承袭了您的域工具, 您的利用法度榜样就会变得更方便。您可以从参数完成自动表格添补、自动验证(Web 和办事器层),以及其他便利。您所要做的就只是把 Struts ActionForm 类作为子集,如图 2 所示:

图 2. 应用 Struts ActionForm 类

在 图 2 中,标签为 Model 的盒子包孕了您的域工具。它扩展了 Struts 的 ActionForm,使得这一布局此后难以改变。假如今后您抉择 ScheduleItem 也必要在一个 Swing 利用法度榜样中运行,那就很难办了。您只剩下两个难以吸收的办理规划:将所有的 Struts 拖拽到 Swing 利用法度榜样中(且不应用它)或者开脱对 Struts 的依附。

较好的替代规划便是采纳组合而不是承袭,如图 3 所示:

图 3. 经由过程组合来对您的域类解耦合

在此版本中,域类(黄色部分)包孕了一个定义日程项目语义的界面。原始的 ScheduleItem 将实现这个界面,它还可以由 ScheduleItemForm 来实现,使得这两个类的语义老是维持同等。反过来,ScheduleItemForm 拥有 ScheduleItem 域工具的一个实例,ScheduleItemForm 的所有读值器和写值器通报到封装的 ScheduleItem 的底层读值器和写值器。这就容许您使用 Struts 的优越特点,同时开脱该框架的束缚。

履历轨则是:可以使框架对您有所懂得,而您弗成以对框架有所懂得。只要您可以保持那种关系,您就能避免把自己的代码耦合到根基举措措施中去,这使您能够更随意马虎地改变架构和设计。无意偶尔可能要多花点功夫来完成这个义务,然则您可以拥有更好的机动性。Struts 并不是独一贯您供给这种诱惑的框架。险些所有的框架都包孕将您限定在框架中的赞助对象。假如您在域类中导入来自某个框架或者厂商的数据包,那您今后就有得头疼了。

关于架构的斟酌

除了架构的定义,范例的企业设置中还呈现了各类广泛的问题。我将在这里先容针对此中一些问题的敏捷架构办理措施。

架构的政治

当您被提升到架构师职位时,公司政治将是您所要碰到的浩繁灾题之一。由于架构师 基础上是公司中最高的技巧职位,您会成为 IT 部门内发生的所有决策的谈话人(和辩白人),无论短长。事实上,您还经常要由于掉败受到指责,却不会由于成功而赢得相信。一些新上任的架构师试图对这些置之度外(当您在技巧职位时这大概异常有效),然则在您的新职位这显着行不通。

请您记着在许多软件项目中,沟通比技巧更为紧张。假如您曾经在某个软件项目上掉败过,那么请您思虑一下掉败的缘故原由:是出于某个技巧 缘故原由,照样某些沟通 问题?大年夜部分光阴,掉败是由于沟通而不是技巧。技巧问题有其办理规划。(无意偶尔它们很难办理,但总归有办理规划。)但社会问题就加倍繁杂和棘手了。Peopleware这本书中有这样一句名言:

老是存在人的问题。

纵然是您觉得应该按部就班,刀切斧砍的技巧决策,也会有政治参杂此中,分外是您处于抉择是否赞许购买某企业对象的职位。(从乐不雅的角度看,您可能有时机由某个对象厂家掏腰包打次异国情调的高尔夫。)请记得,作为一名架构师,您不仅必要做出紧张的决策,您还必须为这些决策辩白。无意偶尔和您交谈的人有他们自己的议事日程,这些内容或许在逻辑上行不通,然则在企业政治的磨练眼前却行得通。不要气馁,您要记清楚最初之以是作出这个决策的缘故原由。

构建与购买

大年夜公司中常呈现的普遍问题之一便是抉择是构建照样购买:针对现在的需求,我们是应该购买 COTS(Commercial Off-the-Shelf Software)照样自己构建?要做出此决策的念头是可以理解的 — 假如公司可以找到一些完全相符自身必要的现成软件,这样就节约了光阴和金钱。不幸的是,许多软件厂商理解这一需求,以是编写可以定制的打包软件,假如软件不能完全相符客户的必要的话。他们意在尽力构建最通用的软件,由于这样能适用更多的生态系统。然则越是通用,就越必要定制。以是无意偶尔纵然很多顾问在,也必要花费很多年才能完成所有的定制代码。

是否应该购买 COTS 的问题实际上归结为另一个问题:营业流程是由软件在计谋上 照样经费上 支持?假如营业流程仅仅是经费问题,购买 COTS 就通情达理。这类软件例子包括人力资本、财务、以及其他通俗的营业流程。计谋 软件在您的营业领域给您竞争上风,这个竞争上风不能随意马虎放弃。

避免陷阱

请记着:并不是所有的营业流程都是可定制的,它们根据营业不合而千差万别。不要轻信那些声称已经编写了您要的营业流程的厂商。假如他们真的拥有这样的流程,他们肯定也在把这些流程卖给您的竞争对手。

图 4 所示的流程图用于赞助您抉择是构建照样购买:

图 4. 决策是构建照样购买的流程图

在这个流程图中,您要做出的第一个决策便是计谋和经费的紧张差别。假如需求是计谋性的,您每每必要自己构建办理规划。假如不这么做,您就会将自己置于一个和对手公道竞争的情况中,而不是构建完全相符您现在和将来需求的软件。打包软件吹嘘其可定制性,但照样有对定制程度的限定。假如您自己编写,会花费较长的光阴,然则您有了一个平台,在这个平台上您可以构建将您和对手区分开的软件。

流程图中的第二个决策便是扣问数据包软件是否能立即起感化。在购买数据包软件时常见的一个陷阱便是差错预计其适应您的营业流程所需的准确光阴;大年夜部分公司都把这个光阴错估了一个数量级。您所需的定制越多,所消费的光阴就越长。更糟糕的是,一些公司还容许改变他们的营业流程来适应软件。这是一个差错,由于无论短长,您的营业流程都应和对手的有所差别。

这个决策树中的第三步便是扣问数据包是否可扩展,这和定制性 刚好相反。可扩展的系统由颠末优越定义的措施来扩展功能,而无需统统事先就绪。这些扩展点包括颠末优越定义的 APIs、SOAP 调用等等。定制意味着您要经由过程 “诈骗” 来让数据包完成您的事情。例如,假如您试图打开一个 WAR 文件,那么您可以用一个不合的图像(必须用 index.gif 来命名)来调换用 index.gif 命名的文件,您是进行定制而不是扩展。终极查验标准是您的变动是否能够经由过程进级。假如是,您就扩展了数据包;假如不是,您就定制了数据包。定制不鼓励您赓续进级数据包,由于您会意识到对新版本做出相同的改变必要付出若干努力。那么,趋势便是不进行更新,后进于最新版四、五个版本,这将使您面临掉去对现在正在应用的老版本的支持的危险。

是经费问题照样计谋问题因公司而异。例如,我曾为一家财务办事公司做过顾问,它的招聘历程被觉得是其关键计谋上风之一。他们雇佣最好、最智慧的人,花费大年夜量的光阴和精力来探求得当的人。他们曾就购买 COTS 人力资本系统咨询过我的意见,我建议他们不要那样做:为什么要让自己置身于一个和对手公道竞争的情况呢?着末,他们采用了我的建议,编写自己的 HR 系统。编写花费了较长的光阴,但一旦完成,他们就有了一个平台,能够完成对其对手来说更劳动密集型的义务。招聘对许多组织来说是简单的经费问题,但对这家公司来说却是计谋问题。

架构中的类型节制

SOA 计划中常常呈现的一个更技巧化(更不面向流程)的主题每每和散播式系统中的类型节制和版本节制有关。这便是这类项目中常见的陷阱之一。它之以是常见,不仅由于人们很轻易遵照对象厂商铺好的路,还由于问题必要一段光阴才能凸显出来 — 最严重的问题孕育发生于您不懂得在项目早期应该知道的器械。

关于能否用动态类型说话构建 “企业” 系统的争辩已经有了定论,这个结论现在也不能给予什么启示。然而,这一争辩意味着就端点的类型节制而言,对散播式系统有了紧张的斟酌。所谓端点,指的是两个完全不合的系统之间的通信门户。两个互相竞争的类型节制样式是 SOAP 和 Representational State Transfer (REST),前者平日采纳诸如 Web Services Description Language (WSDL)这样的标准来创建一个强类型,而后者适用于类型更宽松的、以文档为中间的措施。SOAP 与 REST 的具体优毛病不在本文的评论争论范围之内;在此我主要想说的是端点层面上宽松类型的好处,这些好处可以应用任一样式实现。

您可能还会对下面的文章感兴趣: