NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

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

关注

评论 1 条评论

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

AI开发降本提效之道:云智一体AI开发全栈模式

百度大脑

百度 AI 飞桨

百度联合研究成果登上《自然》子刊 推动人才管理大数据智能化转型

百度大脑

百度 AI

大数据作业的工作流调度详解

大数据技术指南

大数据 4月日更

Canalys发布2020 Q4中国云市场报告

百度大脑

百度 AI

解Bug之路-主从切换”未成功”?

无毁的湖光

数据库 主从环境

揭开MySQL索引神秘面纱

咔咔

MySQL 索引

用AI实践继续探索2050全面数字乡村建设

百度大脑

AI

跨专业?拿到阿里offer?我是如何一步一步做到的?

Java架构师迁哥

低代码平台想要实现复杂的业务流程,这4个条件不能少!

优秀

低代码

Linux C/C++ 服务器/后端开发/后台开发学习路线

Linux服务器开发

C/C++ Linux服务器开发 Linux后台开发 Linux后端开发

Python OpenCV 泛洪填充,取经之旅第 21 天

梦想橡皮擦

Python OpenCV 4月日更

webrtc stream,source,track

webrtc developer

三次给你讲清楚Redis之Redis是个啥

华为云开发者联盟

数据库 nosql redis hash 字符串

第14期师资培训火热招生中尽享国赛智能车一手资料

百度大脑

人工智能

从零开始写游戏服务器①:前期了解

Integer

c

c 语言思维地基搭建(vis2013编译+第一个c语言程序)

-jf.

4月日更

Airtest入门及多设备管理总结

行者AI

自动化测试

一不小心,它成为了 GitHub Alibaba Group 下 Star 最多的开源项目

阿里巴巴云原生

Java 微服务 云原生 dubbo Arthas

一位阿里P8技术大牛的Java面试题总结,在GitHub上仅一天就获赞上万!

Java架构之路

Java 程序员 架构 面试 编程语言

如何保护您的SaaS应用程序?

龙归科技

网络安全 SaaS 远程工作 单点登录

webrtc 开启新特性

webrtc developer

面试阿里P6,却被MySQL难倒,二战阿里,挤进天猫团队(Java岗)

Java 程序员 架构 面试

百度交易中台之订单系统架构浅析

百度Geek说

云计算 架构 云原生 后端 云服务

5G 和云原生时代的技术下半场,视频化是最大最新的确定性

阿里巴巴云原生

人工智能 云原生 5G 存储 调度

飞桨与宸曜科技完成兼容性认证

百度大脑

认证 飞桨

MySQL-技术专题-锁的介绍分析

洛神灬殇

MySQL lock 锁机制

聪明人的训练(八)

Changing Lin

4月日更

​专科出身,2年进入苏宁,5年跳槽阿里,论我是怎么快速晋升的?

码农之家

Java 程序员 互联网 面试 阿里

什么是 Jenkins? 运用Jenkins持续集成

码语者

DevOps jenkins

Apache-Flume的安装及简单应用

慢慢de

win10 flume 日志采集

MySQL查询优化必备

咔咔

MySQL 查询优化

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