架构师训练营第二周命题作业
1 作业一
请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?
1.1 依赖倒置原则概念
在面向对象程序设计中,依赖倒置原则是一种解耦软件模块的方式。当遵循这个原则时,传统上由高层到低层的依赖关系将会反转,因此高层模块独立于低层模块的实现细节。该原则表述为[1]:
高层模块不应该依赖低层模块。两者应依赖抽象(如接口)。
抽象不应该依赖细节。细节(具体实现)应依赖抽象。
举例来说,传统设计模式中若对象 A 依赖对象 B。
使用依赖倒置原则可以将这两个对象解耦。将对象 A 到对象 B 的依赖转化为对象 A 到接口 A 的依赖,然后由对象 B 来实现接口 A 中的方法。宏观来看,框架只需要设计好各种接口,低层代码来实现框架预先定义好的接口,框架会按照预先定义好的逻辑调用低层代码,而不是调用框架代码。
1.2 好莱坞原则概念
好莱坞原则出自演员在好莱坞试镜之后,对方说的:“别打过来,我们会打回去(Don’t call us, we’ll call you)”。准确来说,好莱坞原则通常用来指代控制反转(Inversion of Control)[2]。控制反转亦为一软件设计原则,在传统的面向过程的设计中,定制代码(custom code)调用可重用的库。而在控制反转原则下,则是由框架调用定制代码。控制反转原则的一个应用是依赖注入(Dependency Injection)。
1.3 关系
依赖倒置原则与控制反转原则可以认为是一种设计哲学。即反转传统意义上的高层到低层的调用,或是定制代码到库的调用。
2 作业二
请描述一个你熟悉的框架,是如何实现依赖倒置原则的。
2.1 UWP
通用 Windows 平台(Universal Windows Platform, UWP)是一个应用程序框架,可以使用多种不同语言(C++/CX, C++/WinRT, C#, VB, JS)进行编写,可以方便的编译到不同平台(x86, x64, ARM)。这里以 C++/WinRT 为设计语言进行介绍。
传统 Win32 桌面应用程序,需要调用大量 Win32 API,如使用 CreateWindow 创建窗口,使用 GetMessage 获取窗口消息(window message),当点击按钮时,Win32 应用程序要处理相应窗口消息,并根据消息内容调用 OnClick 函数。整体上来说,编写一个 Win32 桌面应用程序是需要从主函数开始的一个 C++程序,与桌面相关的功能都是通过调用库函数来实现的。
使用 UWP 则不同,编写 UWP 应用程序只需实现框架预设的接口。如实现 Windows.UI.Xaml.Controls.Page 来控制窗口显示内容。UWP 框架中的逻辑仅包含关于 Page 接口的逻辑。在实际运行时,会调用用户实现的相应方法。再如处理按钮时,只需要实现 OnClick 方法,UWP 框架会处理窗口消息并调用用户编写的 OnClick 方法。
2.2 UWP API
UWP API 涵盖了诸多 Windows 系统设置相关的 API,相较 Win32 API,UWP API 可以无缝使用在 UWP 应用程序中。这里以 Windows.UI.ViewManagement.UISettings 类中的 AutoHideScrollBarsChanged 为例进行说明,该事件对应 Windows 10 中的自动隐藏滚动条功能。
应用程序可以响应这个事件从而使系统设置中的“在 Windows 中自动隐藏滚动条”。应用程序只需要编写事件回调函数,然后将回调函数注册在 AutoHideScrollBarsChanged 上。
当系统设置中这项设置改变时,在改变设置值的同时,还会发出一条消息。由于应用程序已经注册了回调函数,在应用程序运行时,UWP 框架已经调用 Windows.UI.dll 内的逻辑进行预处理。如同观察者模式一样,在收到消息时,UWP 框架会调用应用程序的回调函数。
3 作业三
请用接口隔离原则优化 Cache 类的设计,画出优化后的类图。
优化前将整个 Cache 类暴露给应用程序和系统,有可能会导致应用程序误调用 reBuild 方法而导致服务失效。
优化过的类图如上,将缓存的功能拆分为两个接口 ICacheServer 和 ICacheConfig,将 ICacheServer 暴露给应用程序,应用程序无法调用 reBuild 方法,将 ICacheConfig 暴露给系统,进行相应配置。
[1] Agile Software Development, Robert C. Martin, 2003
[2] Inversion of Control, https://en.wikipedia.org/wiki/Inversion_of_control#Overview, Section Overview, Paragraph 5: Inversion of control is sometimes facetiously referred to as the "Hollywood Principle: Don't call us, we'll call you".
版权声明: 本文为 InfoQ 作者【whiter】的原创文章。
原文链接:【http://xie.infoq.cn/article/13a8f537b73224f17279c3af7】。未经作者许可,禁止转载。
评论