#阿里云 #飞天发布时刻 正在直播!中企出海的「技术引擎」来了! 了解详情
写点什么

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

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

关注

评论 1 条评论

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

GreptimeDB v0.1 发布|原生支持 Python, PromQL 和对象存储

Greptime 格睿科技

云原生 时序数据库 PromQL

Matlab实现图像分割

timerring

图像分割

Go 闯进 Top 10、C++ 再次被 Java 反超,TIOBE 3 月榜单发布

博文视点Broadview

国贸股份 x 袋鼠云:推进全链业务深度数字化,为产业综合服务插上数字化翅膀

袋鼠云数栈

数字化转型

IoT物联网平台-规则引擎SQL数据格式详解——设备管理运维类

阿里云AIoT

sql 物联网 数据格式

Axure9和Axure10哪款好?有什么区别呢?

Rose

原型设计 Axure RP

gRPC请求超时和异常处理

江南一点雨

Java gRPC

Jasper狂飙:AIGC现象级应用的增长秘笈

OneFlow

人工智能 深度学习 ChatGPT

mac office 365 商业专业版附升级工具

Rose

Office 365

精准医疗迎数字化新机遇,百奥利盟携手阿里云为创新生物药提速上市

云布道师

阿里云

贴合运维业务场景的告警聚合实现——以Zabbix为例

观纵科技

zabbix 运维监控 IT运维

如何基于 Skywalking 来快速搭建一套应用性能监控平台

观纵科技

APM 全链路监控 Skywalking

15 英寸 MacBook Air 和黄色 iPhone 14 在路上吗?

Rose

apple

天池 DeepRec CTR 模型性能优化大赛 - 夺冠技术分享

阿里云大数据AI技术

人工智能 深度学习

如何从5万设备中找出频繁掉线设备,长期不在线的设备?——设备管理运维类

阿里云AIoT

JavaScript 对象管家 Proxy

devpoint

JavaScript Proxy ECMAScript 6

如何规避近年频发的数据安全事故?

Zilliz

云原生 云服务 数据安全

小程序无需编程,体验IoT物联网平台-物模型开发——设备接入类

阿里云AIoT

物联网

云智慧ITSM产品助力企业有效实现降本增效

云智慧AIOps社区

AIOPS ITSM 智能运维 工单 IT服务管理

查询性能: TDengine 最高达到了 InfluxDB 的 37 倍、 TimescaleDB 的 28.6 倍

TDengine

大数据 tdengine 性能测试 时序数据库

详解数仓中sequence的应用场景及优化

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 3 月 PK 榜

还在curd吗?封装属于自己的Spring-Boot-Starter

Java spring Spring Boot Starter

高效学 C++|组合类的构造函数

TiAmo

组合 C++

IoT物联网时代,如何优化你的网络- DNS域名解析服务——设备接入类

阿里云AIoT

缓存 网络协议 物联网 域名解析 调度

DAPP质押挖矿项目技术开发功能丨DeFI质押挖矿系统开发详细方案

I8O28578624

【活动报名】数据存储降本增效应用实践 PolarDB × ScaleFlux 线下 Meetup 来袭!(杭州站)

阿里云数据库开源

数据库 postgresql 阿里云 开源 polarDB

Java中restTemplate携带Header请求

Geek_7ubdnf

Java RestTemplate

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