在 2025 收官前,看清 Data + AI 的真实走向,点击查看 BUILD 大会精华版 了解详情
写点什么

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

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

关注

评论 1 条评论

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

数据流水线架构

俞凡

架构 数据

质量基础设施一站式服务平台方案,NQI一站式公共平台开发

电微13828808271

模块三 架构文档

Asha

javaScript基础篇说一说循环应该怎么用

你好bk

JavaScript 大前端 ES6 html/css

一个基于web服务器的PoW案例(一)

Regan Yue

区块链 共识算法 11月日更

TDD之让我们再聊聊TDD(终)--正其思,规其行

刘冉

TDD

🔄 这些JS数组遍历是否都用过 🔄

空城机

JavaScript 大前端 11月日更

一场大戏!央行数字人民币被“点燃”!

CECBC

敏捷开发:川中校友登记小程序解决方案

CC同学

应届生学的java,转自动化测试拿到15k薪资,送给大家的经验积分

六十七点五

Java 程序员 软件测试 自动化测试 测试工程师

🏆【Alibaba中间件技术系列】「RocketMQ技术专题」帮你梳理RocketMQ相关的消费问题以及原理分析总结

码界西柚

RocketMQ 消息队列 11月日更 重复消费

意外发现,原来你不知道自己每天都在用门面模式

Tom弹架构

Java 架构 设计模式

springboot整合pagehelper

小鲍侃java

11月日更

周边生态 | StreamNative 宣布开源 AWS SQS Connector

Apache Pulsar

开源 云原生 消息中间件 AWS SQS Connector 周边生态

数据校验

卢卡多多

参数校验 11月日更

听说你还在写双层for循环解两数之和?

老表

Python LeetCode 11月日更 两数之和 算法与数据结构

模块四作业-考试试卷-Redis存储方案设计

沐风

测试策略实践之测试自动化与自动化测试

刘冉

测试管理 测试策略

2022 年 9 个最佳 JavaScript IDE 和代码编辑器

devpoint

JavaScript vscode IntelliJ IDEA 11月日更

KoP 2.8.0 新特性前瞻(内附视频)

Apache Pulsar

kafka 架构 分布式 Apache Pulsar KoP 2.8.0

测试策略实践之序篇-软件缺陷,测试计划和测试架构

刘冉

测试计划 测试策略 测试架构

博文|Apache Pulsar 在自研数据管道中的技术实践

Apache Pulsar

大数据 分布式 云原生 中间件 Apache Pulsar 消息系统

测试策略实践之分类漫谈

刘冉

告别晦涩难懂的物理,《张朝阳的物理课》了解一下

脑极体

13 K8S之Pod资源操作

穿过生命散发芬芳

k8s 11月日更

和12岁小同志搞创客开发:手撕代码,做一款人体感应灯

不脱发的程序猿

少儿编程 DIY 智能硬件 创客开发 Arduino

QA应该更新的测试工具-2013

刘冉

软件测试

安全测试之XCodeGhost随想-2015

刘冉

软件测试 安全测试

重点人员管控系统开发方案,重点人员动态管理系统

电微13828808271

TDD之让我们再聊聊TDD

刘冉

TDD

TDD之让我们再聊聊TDD(续)

刘冉

TDD

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