2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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:263070
用户头像

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

关注

评论 1 条评论

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

Spark测试用例生成apache iceberg结果

聚变

大数据 iceberg

聪明人的训练(十三)

Changing Lin

4月日更

不确定的海浪中,更需要数字化转型的定海神针

脑极体

颠覆微服务认知:深入思考微服务的七个主流观点

xcbeyond

微服务 4月日更

Scrum Patterns:小团队(译)

Bruce Talk

敏捷开发 译文 Agile Scrum Patterns

java基础集合之HashMap

false℃

混战的低代码江湖,如何区分「李逵」和「李鬼」?

ToB行业头条

cat监控http请求-CatFilter

Java个体户

监控 cat

《中寰卫星导航项目管理部负责人卜钢:智能网联行业的问题与前景》(采访提纲):

谙忆

微信被单删或拉黑?这两个免打扰检测方法你要知道。

彭宏豪95

微信 工具 社交 数据备份 4月日更

如何完成日千万级别以上的订单对账(一)

谙忆

一文搞懂MySQL体系架构!!

冰河

MySQL 数据库 程序员 系统架构 数据存储

低代码之所以能火,离不开这些原因!

优秀

低代码

完美的,从不空口说白话,140个案例带你深入理解微服务

Java架构师迁哥

如何完成日千万级别以上的订单对账(二)

谙忆

一个可递归遍历的Vue树型组件

空城机

JavaScript vue.js 大前端 4月日更

颜色值JavaScript换算(HSV、RGB、十六进制颜色码)

空城机

JavaScript 大前端 颜色值换算

感谢Github帮我斩获了8家大厂Offer

Java架构师迁哥

大数据文件浏览器

聚变

yyds!用飞桨玩明日方舟

百度大脑

百度 飞桨

活久见,58同城居然也有这么牛的Java内部教程

Java架构师迁哥

重读《重构2》- 内联函数

顿晓

重构 4月日更

你看起来很美味?独家揭露视频推荐系统AI秘方

脑极体

用吃解决生活问题

石云升

读书笔记 好好吃饭 28天写作 4月日更

魔晶面膜

飞亚科技

MOOM集团模式

飞亚科技

阿里P9纯手打的JDK文档太吊了,微软都开始学习了!

Java架构师迁哥

从程序员角度看湖南电信网络全崩,如何防范服务器被攻击以及解决方案

北游学Java

Java 网络安全 网络 服务器

Java编辑器

ベ布小禅

4月日更

干货 | Redis进阶笔记

ninetyhe

redis 缓存 原理分析

缓存系统设计精要

比伯

Java 互联网 面试 程序人生 技术宅

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