写点什么

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

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

关注

评论 1 条评论

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

【IoTDB 线上小课 11】为什么 DeepSeek 要选择开源?

Apache IoTDB

普惠AI 如何在 Anolis OS 8 上部署生产可用的 DeepSeek 推理服务

OpenAnolis小助手

AI 操作系统 龙蜥操作系统 Anolis OS DeepSeek

Agent应用实战:从广告智能助手落地到平台化赋能

京东科技开发者

探索无界:践行科学家精神与工程师文化

京东科技开发者

飞算JavaAI:AI+时代下的行业趋势引领者与推动者

飞算JavaAI开发助手

飞算JavaAI:开发界的“思维导图”,让思路更清晰!

飞算JavaAI开发助手

案例 | 跨越语言边界:20+种语言的AI图像生成挑战

澳鹏Appen

多模态 大模型 图像生成 小语种 LLM

Flink+Paimon+Hologres,面向未来的一体化实时湖仓平台架构设计

Apache Flink

大数据 flink 实时计算 实时湖仓 paimon

初学者怎么入门大语言模型(LLM)

易成研发中心

告别卡顿!Cloud Ace 满血 DeepSeek-R1/V3 API 重磅上线!企业级 AI 触手可及!

Cloud Ace 云一

人工智能 跨境电子商务 企业级应用 DeepSeek v3 DeepSeek-R1

智能驾驶中的感知模块介绍

地平线开发者

自动驾驶 算法工具链 地平线征程6

AI+智能财务 | 选择智能月结,即刻获得丝滑结账体验!

用友智能财务

财会

商家智能助手:多智能体在电商垂域的技术探索

京东科技开发者

云电脑:快速部署无限制、可联网、带专属知识库的私人 DeepSeek 大数据模型

京东科技开发者

DeepSeek R1的崛起已经势不可挡,而开源商业化在中国到底行不行?

Apache SeaTunnel

DeepSeek

自动化测试岗位面试必问的十大问题

老张

软件测试 自动化测试 质量保障 求职面试

TikTok视频0播放量怎么办?六步教你解决

Ogcloud

TikTok 云手机 海外云手机 tiktok运营 tiktok限流

飞算 JavaAI:开发界的 “机器人”,为你打工不是梦!

飞算JavaAI开发助手

百度深化AI基础设施建设,李彦宏:持续投入AI基础设施,训练更好的下一代模型

新消费日报

最近社区热议的issue #8542,被疯狂+1的需求急需你的加入!

Apache SeaTunnel

2025年最全Java面试题,及答案汇总!

Geek_Yin

Java 面试 #java Java 面试题 java 技术提升 #程序员

【YashanDB知识库】如何从内存中获取SQL语句的执行计划

YashanDB

数据库 yashandb

找到你的小众市场,打造你的专属产品几个步骤

沉浸式趣谈

产品 创意 独立开发

外贸电商网络与普通网络的差异

Ogcloud

企业组网 企业网络 外贸网络 海外网络专线 海外网络连接

大家都使用哪些开源项目系统?分享主流30款

易成研发中心

开源项目管理系统

雷朋 Meta 眼镜视觉识别功能开放测试;Ultravox 新版语音模型 :语音理解超 GPT-4o 和 Gemini

声网

【YashanDB知识库】使用DataX工具迁移yashan数据到maxcompute

YashanDB

数据库 yashandb

普通人也能轻松掌握的20个DeepSeek高频提示词(2025版)

不在线第一只蜗牛

DeepSeek

告别焦虑,天润融通AI机器人托管为客服团队一键减负增效

天润融通

人工智能

飞算 JavaAI:你的开发 “加速器”,让项目更快落地!

飞算JavaAI开发助手

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