应用程序设计 - 糟糕设计的案例研究






3.36/5 (9投票s)
应用程序设计 - 糟糕设计的案例研究
应用程序设计
本主题读者 - 应用架构师,开发人员
覆盖主题
我们如何改进应用程序设计?如何为具有多个状态的单个对象使用状态模式?猜测您对 GOF 设计模式有初步了解。没有?没关系。
- 什么是状态模式
- 何时、何地以及如何使用状态模式
- 使用它的主要原因是什么
- 有什么好处
让我们深入了解基本概念
我的问题
我学习了设计模式并且知道如何实现。但问题是,我为什么需要这种模式。如果我不使用任何模式,没有人会抱怨代码。这意味着我可以在设计中避免使用模式。我可以这样做吗?为什么我要承担额外的烦恼?
调查
场景 1:软件专业人士
我是一名软件专业人士,我必须实现微服务应用程序。所以,一开始,我准备了架构设计文档(比如,高层设计文档)。在此阶段之后,我与开发人员合作并实现设计。最后,我编写单元测试。所以,我有不同的角色。角色意味着与特定职位相关的预期行为。
因此,软件专业人士根据角色或状态具有不同的行为。
- 架构师角色:准备架构设计文档
- 开发人员角色:编写代码并实现业务功能
- 白盒测试人员角色:编写测试场景、测试用例和单元测试
场景 2
我有一只小狗,早上我喜欢和它玩;所以它跑、跳、叫。但突然,一辆车撞了它,现在它不动了,不跑、不跳、不叫了。所以状态从生变死了。
仍然对场景有疑问吗?
- 灯有两种状态,开和关。
- 水有多种状态,如 - 热、冷、常温、液体和固体。
- 人的情绪有 - 愤怒、快乐、悲伤、疲倦和醉酒。
因此,在这些场景中,很明显单个对象具有不同的状态和行为。
实现魔法
类图
设计实现和源代码分析
在上图中,有一个“DoYourJob
”方法,我可以使用If-Else
语句或switch
语句来实现功能。
复盘报告分析
在上图中,我标记了数字,如 1、2 和 3。
标记号 1:我在SoftwareProfessional
类中创建了角色。但问题是,这些依赖关系在此类中是紧密耦合的。
因此,无法对“DoYourJob
”方法的单元测试。为什么??因为,根据第一个原则,“只测试类的逻辑,仅此而已”。
因此,如果我想要这个类的单元测试,那么它应该松散耦合;否则,对象模拟是不可能的。
标记号 2 表示将来,如果我想扩展另一个角色,我需要在此类中创建一个对象。
标记号 3 表示我需要为新扩展的角色添加一个if-else
或switch case
。
因此,标记号 2 和 3 也违反了开放-封闭原则
。因为,我想实现另一个角色,这没关系;但我不能触碰“SoftwareProfessional
”类。这意味着,如果我实现另一个角色,那么我不应该修改这个类中的任何东西。
为什么需要良好的设计
- 我需要单元测试吗?
- 我想移除
if
-else
或switch
-case
语句吗? - 我想移除代码重复吗?
- 我想最小化未来的实现工作吗?
- 我想最小化 bug 吗?
考虑到以上问题,如果我的答案是 - 是,那么我需要一种技术来解决上述问题。
注意:我正在考虑上述给出的设计和示例。
什么是状态模式
对象根据其状态的改变而改变其行为。
在类图中,Context
是SoftwareProfessional
,state
是IRole
。
场景 2 的类图
优点
移除条件逻辑重复,用多态替换条件代码。
非常棒的设计
上面的例子表明,单个对象具有多个角色或状态,并且如果状态改变,它会在运行时改变行为。所以,考虑到 GOF 的状态模式,我可以解决这个问题。
类图
设计实现
良好的设计分析
- 由于松耦合,我可以模拟
IRoleState
的对象;因此,我可以测试DoYourJob
方法的逻辑。 - 我移除了
if
-else
或switch
-case
语句。 - 任何时候,我都可以实现新的
IRoleState
;但我不需要修改SoftwareProfessional
类。所以,它满足了开放-封闭原则。 - 代码清晰易懂。
演示时间!!
第一次学习if
-else
语句和for
-loop语句,并理解如何将其应用于应用程序时,我意识到我是一名开发人员。你需要if
-else
语句;但你也需要知道何时以及如何使用它。如果你意识到了这一点,那么你就在成为一名优秀开发人员的道路上。