写点什么

C#的 SOLID 原则实践

  • 2014-06-03
  • 本文字数:984 字

    阅读完需:约 3 分钟

Brannon B. King 是供职于 Autonomous Solution Inc. 的一名软件工程师,他在 MSDN 杂志 2014 年 05 月刊发表了一篇题为《违背C#中SOLID 原则的危险》的文章。作者指出了研发人员在C#编码中可能出现的一些常见错误,违背 SOLID 原则将导致代码不易扩展、难以维护。

King 提供了计数器的示例代码,并针对 SOLID 每条原则给出了建议,但为了简洁起见我们只节选了开闭原则(OCP)相关的一些内容。开闭原则(OCP)规定“软件实体(类、模块、函数等)应该对扩展开放,对修改关闭”。根据 King 的说法,下面这段代码违背了开闭原则

复制代码
void DrawNerd(Nerd nerd) {
if (nerd.IsSelected) DrawEllipseAroundNerd(nerd.Position, nerd.Radius);
if (nerd.Image != null) DrawImageOfNerd(nerd.Image, nerd.Position, nerd.Heading);
if (nerd is IHasBelt) // a rare occurrence
DrawBelt(((IHasBelt)nerd).Belt);
// Etc.
}

因为你需要在客户每次需要显示新增内容时修改此方法,而且,客户始终需要显示新增内容。建议将绘制替换成通用程序:

复制代码
readonly IList<IRenderer> _renderers = new List<IRenderer>();
void Draw(Nerd nerd)
{ foreach (var renderer in _renderers)
renderer.DrawIfPossible(_context, nerd); }

思路是这样的:

…编写实现已知接口的绘制类(或有关绘制类的类)。呈现器必须能够决定其是否可以或应该基于输入内容绘制任何内容。例如,带式绘制代码可以移动到其自身的“带式呈现器”,用于检查接口并视需要继续执行。

基类引用继承类是违背开闭原则的另一个例子

复制代码
class Nerd {
public void DanceTheDisco() {
if (this is ChildOfNerd)
throw new CoordinationException("Can't");
...
}
}
class ChildOfNerd : Nerd { ... }

作者建议“基类绝不能直接引用其继承类。”。

对等类中也可能存在该问题:

复制代码
class NerdsInAnArc {
public bool Intersects(NerdsInAnLine line) {
...
}
...
}

King 解释道:

通常情况下,对象层次结构中的弧线和直线是对等的。它们不应该知道彼此之间的非继承的详尽细节,因为这些细节通常是最优交叉算法所需的。随时修改其中一个,而无需更改另一个。这再一次违背了单一责任。存储弧线,还是分析这些弧线?将分析操作置于其自己的实用程序类中。

尽管对于小型项目来说可能不是很必要,但为了避免产生面条式代码,代码规模越大,严格执行 SOLID 原则的重要性就越明显。

原文链接: Becoming SOLID in C#****

2014-06-03 20:262964
用户头像

发布了 27 篇内容, 共 88418 次阅读, 收获喜欢 4 次。

关注

评论 1 条评论

发布
用户头像
借博主宝地一用,给大家推荐一个最近很火的接口管理工具apipost,很好用,有时间可以试试
2022-04-13 20:58
回复
没有更多了
发现更多内容

图算法系列之深度优先搜索(二)

Silently9527

深度优先搜索 数据结构和算法 图算法

浪潮×积成电子:尝到了工业互联网的“甜头”

云计算

索引的正确“打开姿势”

华为云开发者联盟

数据库 索引 B-tree Psort 分区

探讨 JS 对象如何缓存属性的值

零维

JavaScript 大前端 设计模式

面向软件 IT 专业的高校大学生职业思考调查问卷

程序员架构进阶

职业规划 调查报告 就业 28天写作 4月日更

容器&服务:metrics-server探索

程序员架构进阶

k8s 28天写作 弹性扩容 4月日更 metrics server

美的蒸烤料理炉全新上线华为商城,首款搭载鸿蒙系统的设备有何不同?

科技汇

云上细粒度访问管理的参考架构

张晓辉

云原生 网关 访问控制 OPA

AI数学基础之:P、NP、NPC问题

程序那些事

人工智能 AI 程序那些事

面向软件 IT 专业的高校大学生就业与专业关联性的问卷调查

谙忆

持续交付实战

云飞扬

Rust从0到1-代码组织-use关键字

rust 代码组织 use

anyRTC 智能硬件解决方案

anyRTC开发者

音视频 WebRTC IoT 智能硬件

智能小车系列-树莓派初次使用环境配置

波叽波叽啵😮一口盐汽水喷死你

树莓派 wifi SSH 无显示器 树莓派首次配置

云图说|读请求太多怎么办?一键读写分离来帮忙

华为云开发者联盟

MySQL 读写分离 云数据库 云数据库MySQL

华为云FusionInsight MRS:千余节点滚动升级业务无中断

华为云开发者联盟

大数据 数据湖 节点 集群 华为云FusionInsight MRS

安全知识

笑春风

关于软件IT专业大学生对专业认知情况的调查问卷

花花

签约计划

10行C++代码实现高性能HTTP服务

万俊峰Kevin

c c++ workflow Open Source

Windows系统下电脑强制卡死、关机的邪恶方法

不脱发的程序猿

程序人生 技术人 4月日更 系统关机 计算机小技巧

重装变态的微信

箭上有毒

生活记录 4月日更

LeetCode题解:151. 翻转字符串里的单词,数组,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

你的开发好帮手:下一代云原生开发工具技术

华为云开发者联盟

云原生 编码 开发工具 代码补全 调测

大学生读书情况调研

hepingfly

读书 调研 大学生 阅读

可能有点长的Spring MVC入门篇

北游学Java

Java spring ssm Spring MVC

圆梦阿里之后,我收集整理了这份“2021春招常见面试真题汇总”

比伯

Java 编程 架构 程序人生 计算机

如何基于 PANO SDK 实现 iOS 端屏幕共享互动

拍乐云Pano

ios sdk

从UCloud优刻得2020年全年财报,看云计算公司发展之路

水性硅胶防滑透明浆

C13713145387

15个问题告诉你如何使用Java泛型

华为云开发者联盟

Java 接口 参数 Java泛型 泛型对象

大学生IT就业方向以及就业培训的调查问卷

麦洛

调查报告 调查采访能力考核 问卷调查

C#的SOLID原则实践_C#_Abel Avram_InfoQ精选文章