65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.36/5 (9投票s)

2017年5月13日

CPOL

4分钟阅读

viewsIcon

14709

downloadIcon

87

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

应用程序设计

本主题读者 - 应用架构师,开发人员

覆盖主题

我们如何改进应用程序设计?如何为具有多个状态的单个对象使用状态模式?猜测您对 GOF 设计模式有初步了解。没有?没关系。

  • 什么是状态模式
  • 何时、何地以及如何使用状态模式
  • 使用它的主要原因是什么
  • 有什么好处

让我们深入了解基本概念

我的问题

我学习了设计模式并且知道如何实现。但问题是,我为什么需要这种模式。如果我不使用任何模式,没有人会抱怨代码。这意味着我可以在设计中避免使用模式。我可以这样做吗?为什么我要承担额外的烦恼?

调查

场景 1:软件专业人士

我是一名软件专业人士,我必须实现微服务应用程序。所以,一开始,我准备了架构设计文档(比如,高层设计文档)。在此阶段之后,我与开发人员合作并实现设计。最后,我编写单元测试。所以,我有不同的角色。角色意味着与特定职位相关的预期行为。

因此,软件专业人士根据角色或状态具有不同的行为。

  • 架构师角色:准备架构设计文档
  • 开发人员角色:编写代码并实现业务功能
  • 白盒测试人员角色:编写测试场景、测试用例和单元测试

场景 2

我有一只小狗,早上我喜欢和它玩;所以它跑、跳、叫。但突然,一辆车撞了它,现在它不动了,不跑、不跳、不叫了。所以状态从生变死了。

仍然对场景有疑问吗?
  • 灯有两种状态,开和关。
  • 水有多种状态,如 - 热、冷、常温、液体和固体。
  • 人的情绪有 - 愤怒、快乐、悲伤、疲倦和醉酒。

因此,在这些场景中,很明显单个对象具有不同的状态和行为。

实现魔法

类图

设计实现和源代码分析

在上图中,有一个“DoYourJob”方法,我可以使用If-Else语句或switch语句来实现功能。

复盘报告分析

在上图中,我标记了数字,如 1、2 和 3。

标记号 1:我在SoftwareProfessional类中创建了角色。但问题是,这些依赖关系在此类中是紧密耦合的。

因此,无法对“DoYourJob”方法的单元测试。为什么??因为,根据第一个原则,“只测试类的逻辑,仅此而已”。

因此,如果我想要这个类的单元测试,那么它应该松散耦合;否则,对象模拟是不可能的。

标记号 2 表示将来,如果我想扩展另一个角色,我需要在此类中创建一个对象。

标记号 3 表示我需要为新扩展的角色添加一个if-elseswitch case

因此,标记号 2 和 3 也违反了开放-封闭原则。因为,我想实现另一个角色,这没关系;但我不能触碰“SoftwareProfessional”类。这意味着,如果我实现另一个角色,那么我不应该修改这个类中的任何东西。

为什么需要良好的设计

  • 我需要单元测试吗?
  • 我想移除if-elseswitch-case语句吗?
  • 我想移除代码重复吗?
  • 我想最小化未来的实现工作吗?
  • 我想最小化 bug 吗?

考虑到以上问题,如果我的答案是 - 是,那么我需要一种技术来解决上述问题。

注意:我正在考虑上述给出的设计和示例。

什么是状态模式

对象根据其状态的改变而改变其行为。

在类图中,ContextSoftwareProfessionalstateIRole

场景 2 的类图

优点

移除条件逻辑重复,用多态替换条件代码。

非常棒的设计

上面的例子表明,单个对象具有多个角色或状态,并且如果状态改变,它会在运行时改变行为。所以,考虑到 GOF 的状态模式,我可以解决这个问题。

类图

设计实现

良好的设计分析

  • 由于松耦合,我可以模拟IRoleState的对象;因此,我可以测试DoYourJob方法的逻辑。
  • 我移除了if-elseswitch-case语句。
  • 任何时候,我都可以实现新的IRoleState;但我不需要修改SoftwareProfessional类。所以,它满足了开放-封闭原则。
  • 代码清晰易懂。

演示时间!!

第一次学习if-else语句和for-loop语句,并理解如何将其应用于应用程序时,我意识到我是一名开发人员。你需要if-else语句;但你也需要知道何时以及如何使用它。如果你意识到了这一点,那么你就在成为一名优秀开发人员的道路上。

© . All rights reserved.