`
dftwilson
  • 浏览: 23778 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

软件架构设计--“层间解耦和API接口设计”

 
阅读更多
1 软件架构设计之“层间解耦和API接口设计” 
1)北向接口设计本质就更大系统的架构设计的一部分。
2)接口设计需要解决耦合与依赖的问题,系统间接口更是如此。
3)接口与实现分离、控制反转、依赖倒置是实现层间解藕的几个方式。

=======================
软件架构设计之“层间解耦和API接口设计”
                                                 钟振 00112298,2013-11-11
2 1      概述
“分层模式”是一种最常用的软件架构设计模式,采用分层模式时,要求层间低耦合,并且一般要求上层可调用下层服务、但不允许下层调用上层。那么当系统有这种需求(下层调用上层)时,应该如何设计呢?
本文主要参考[1] 文章,保留最精华的内容、补充部分方法和自己的理解、忽略“依赖注入”(有点晦涩),可结合[1]阅读本文。
其中“下层调用上层”的需求主要在“控制反转”一节给出解决方案。

3 2      接口和实现分离
4 2.1      面向过程的实现:函数库(函数调用)

5 2.2      面向对象的实现:类库(聚合关系)

6 3      依赖倒置(Dependency Inversion Principle)
7 3.1      原则说明
第一种描述([3]):
A. 上层模块不应该依赖于下层模块,它们共同依赖于一个抽象。
  B. 抽象不能依赖于具象,具象依赖于抽象。
第二种描述:
       要针对接口编程,不要针对实现编程
8 3.2      解决方法一:类库设计者定义抽象接口(下层定义接口并实现)
当类库设计者难以和客户深入合作时,或者类库同时提供给很多客户使用时,这种方式比较合适。

9 3.3      解决方法二:调用方定义抽象接口(上层定义接口、下层实现)
如果是同一系统内的设计,优先使用方法二。这种方法也是面向对象设计推荐的方法。
10 3.3.1        Martin Flower给的例子

通常三层架构如上图(a);
经常需要引入一个Mapper层用于Domain/DB之间解耦具体数据映射方式,因此Mapper要依赖于Domain/DB,如(b)图;
但是,Domain怎么读写数据到DB呢?如果Domain依赖于Mapper则出现了“循环依赖”,这是一种很不好的设计。

由Domain层定义一个 Mapper Interface 接口,由Database层实现这个接口,则可以解决上述问题。

如果想简化类设计,可以把接口直接合入Domain层中(上图是合入Store类)。
11 3.3.2        Robert Martin给的例子
下图是一个典型的三层设计模式:

下图是经过依赖倒置重构后的架构:

12 4      控制反转
13 4.1      一个反面的例子

这是一个典型的双向依赖关系。这种双向依赖关系有一个非常严重的缺陷:由于GUI框架调用了应用程序中的某个特定函数(MyWindowProc), GUI框架根本无法独立存在;换一个新的应用程序,GUI框架多半就要做相应的修改。
14 4.2      解决方法一:面向过程设计中的“回调函数机制”

15 4.3      解决方案二:面向对象设计中的“模板方法模式”
16 4.3.1        王咏武给的例子

17 4.3.2        Craig Larman给的例子

18 4.4      解决方案三:面向对象设计中的“观察者模式”
19 4.4.1        Craig Larman给的例子

20 4.5      解决方案四:嵌入式软件中的“中断模式”
通过硬件中断主动上报事件,具体例子略。
21 5      参考资料
[1] 王咏武,《向依赖关系宣战——依赖倒置、控制反转和依赖注入辨析》,《程序员》杂志2005年1月
[2] Martin Flower,《Reducing Coupling》,2001,http://www.martinfowler.com/ieeeSoftware/coupling.pdf‎
[3] Robert Martin,《Agile Principles, Patterns, and Practices in C#》,2006
[4] Craig Larman,《Applying UML and Patterns》,2004

分享到:
评论

相关推荐

    移动网关架构升级方案--泛化service解耦

    在这个方案中,我们主要关注的是如何将服务层进行抽象,以降低不同服务间的耦合度,同时提高整体架构的升级能力。 一、解耦的重要性 在传统的移动网关设计中,各个服务之间可能存在紧密的依赖关系,这种高耦合会...

    软件架构--系统设计概述

    良好的接口设计可以降低组件间的耦合度,提高系统的灵活性。 4. **数据管理**:系统设计要考虑数据的存储、处理和传输。数据库设计是其中的关键,包括关系型数据库、非关系型数据库的选择,以及数据模型的设计。 5...

    swift-iOS模块化模块间解耦路由中心设计

    总的来说,Swift-iOS模块化模块间解耦和路由中心设计是一种先进的软件架构策略,它提高了代码质量,降低了维护成本,同时也为大型iOS项目的可持续发展提供了坚实的基础。通过合理地应用这些技术,开发者能够构建出...

    软件架构设计代码

    在“新建文件夹”这个压缩包中,可能包含了具体的软件架构设计代码实例,包括模块化的代码组织、接口定义、数据库连接、服务间的通信代码等。通过对这些代码的分析和学习,我们可以更深入地理解如何将理论的架构设计...

    领域驱动架构透析与架构解耦(29页).pdf

    综上所述,领域驱动设计和架构解耦是现代软件开发中重要的思想和技术,它们帮助我们构建出更符合业务需求、更具弹性的系统。通过明确领域边界、合理演进架构、利用C4模型和RUP视图等工具,我们可以更好地理解和设计...

    J2EE程序设计和软件架构设计ppt

    **J2EE程序设计与软件架构设计** ...在设计软件架构时,需要考虑系统的可扩展性、性能、安全性、可维护性以及未来的演变。理解并熟练运用这些架构模式和J2EE技术,可以为开发出高效、稳定的企业级应用奠定坚实基础。

    企业软件架构与设计模式ppt

    企业软件架构是构建大型复杂系统的核心方法,它涉及到如何组织和设计软件组件,以便实现高效、可扩展且易于维护的解决方案。设计模式则是软件工程中经过验证的最佳实践,它们是解决常见问题的标准模板,可以被复用并...

    软件的层架构设计详解

    软件层架构设计的核心在于通过合理的分层来实现系统的解耦,从而使系统更加灵活、可扩展和易于维护。无论是横向架构还是纵向架构,都旨在通过分层的方式来简化复杂度,提升软件的整体质量。在实际项目中,开发者可以...

    微软新技术与架构设计应用-Net

    在大规模系统中,良好的接口设计可以显著提高模块间的解耦度。 文件"微软新技术与架构设计应用-2008.04.12.Net.ppt"可能是这次讲解的幻灯片资料,其中可能包含了详细的示例、最佳实践和案例研究,帮助听众更好地...

    软件结构设计--分层系统风格讲义.pptx

    在实际应用中,可以根据具体需求灵活调整层次结构,例如在某些场景下,可能会有额外的缓存层、API接口层等。分层设计在财务管理类软件中尤为常见,因为这类软件往往需要处理复杂的业务逻辑和数据处理,分层架构能够...

    架构风格与基于网络的软件架构设计(REST)

    根据提供的文件信息,我们可以了解到文档的核心内容与网络软件架构设计有关,特别是侧重于架构风格和REST(Representational State Transfer,表现层状态转换)。以下是从标题、描述、标签和部分内容中提炼出的知识...

    通用软件架构设计文档.rar

    这涉及到接口设计,如API、消息传递或事件驱动模型等。 3. **层次化设计**:通常采用自底向上或自顶向下的方法,将系统划分为不同的层次,如表示层、业务逻辑层、数据访问层等,以实现功能的分离和解耦。 4. **...

    软件架构设计的思想与模式

    例如,分层架构模式将系统划分为数据访问、业务逻辑和服务层,每层都有特定的职责,有利于代码复用和系统解耦。另外,客户端-服务器(Client-Server)模式是网络应用的基础,客户端负责用户交互,服务器处理请求并...

    C# web 三层架构设计

    在实际开发中,三层架构可能会根据项目需求进一步细化,引入额外的组件和层,比如模型层(Model Layer)和通用类库(Common Library)。 ##### 模型层(Model Layer) 模型层用于封装实体类数据结构,它描述了业务...

    dotnet-NetCore22微服务架构的WebApi框架绝影

    11. **API版本控制**:管理不同版本的API,以适应接口的变化和升级。 12. **监控和日志**:集成如Prometheus、Grafana等工具进行性能监控,以及使用如Serilog进行日志记录。 在压缩包"PoJun.Shadow-master"中,...

    net应用系统架构设计

    在.NET应用系统架构设计中,我们探讨的核心是构建高效、可扩展且易于维护的软件解决方案。多层架构是一种常见的设计模式,它将应用程序分为多个独立的层次,每个层次专注于特定的功能,以提高代码的可重用性和可维护...

    三层架构各层间的访问过程

    在实际开发中,三层架构可能会使用各种设计模式和技术来实现各层间的解耦和通信,例如,使用服务接口(如WCF、RESTful API)、实体框架(Entity Framework)等进行数据访问,以及依赖注入(Dependency Injection)来...

    ORM框架-三层架构

    三层架构是一种软件设计模式,通常应用于大型分布式系统中,以实现业务逻辑与数据访问、用户界面的分离,提高系统的可维护性和可扩展性。接下来,我们将深入探讨ORM框架和三层架构的相关知识点。 首先,ORM框架的...

    面向服务架构(SOA)web系统架构设计-SOA原理与技术 01 SOA技术概述(共74页).pptx

    面向服务架构(SOA)是一种设计和构建分布式系统的方法论,它强调将应用程序的不同功能单元(称为服务)通过标准化的接口进行解耦,以便在需要时可以独立地进行开发、部署和重用。SOA的核心目标是提高业务的灵活性、...

    diving-into-Asp-Net-webapi

    在*** Web API中使用Unity容器和依赖注入可以将应用程序中的依赖关系解耦,使得单元测试和模块替换更加容易。 在书中,作者也讨论了如何设置业务服务项目和Web API项目,以及如何运行应用程序。他还分析了现有设计...

Global site tag (gtag.js) - Google Analytics