AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

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

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

关注

评论 1 条评论

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

SpaceX 星舰周四晚八点再试飞;Backseat AI 发布《英雄联盟》实时辅导工具丨 RTE 开发者日报 Vol.219

声网

为什么身份控制是确保API接口访问安全的关键?

幂简集成

安全 API 身份控制

京东商品评论数据接口(JD.item_review)丨京东平台实时API接口指南

tbapi

京东API接口 京东商品评论接口 京东商品评论采集

CoT思维链 , 大模型“智能涌现”的关键

澳鹏Appen

大模型 模型推理 AGI 智能涌现 思维链

LPS完成战略性收购 增强数据实践和营销云能力

财见

复盘自研产品,总结技术实践

小院里的霍大侠

2024-06-05:用go语言,给定三个正整数 n、x 和 y, 描述一个城市中由 n 个房屋和 n 条街道连接的情况。 城市中存在一条额外的街道连接房屋 x 和房屋 y。 需要计算对于每个街道数(

福大大架构师每日一题

福大大架构师每日一题

数据库市场或迎变局 天翼云TeleDB打造企业数据管理最优解

极客天地

抖音面试:说说延迟任务的调度算法?

王磊

软件测试学习笔记丨Vue常用指令-条件渲染(v-if)

测试人

软件测试

「C++」深度分析C++中i++与++i的区别 _

不在线第一只蜗牛

c++ 编程 开发语言

被黑客入侵的 DMM 比特币为比特币购买获得 3.2 亿美元

web3区块链创业团队DappNetWork

基于阿里云服务网格流量泳道的全链路流量管理(三):无侵入式的宽松模式泳道

阿里巴巴云原生

阿里云 云原生 服务网格

如何把域名解析到自己的网站?怎么设置域名解析?

国科云

PostgreSQL 17 Beta1 发布,酷克数据再次贡献核心力量

酷克数据HashData

淘宝/天猫商品详情API接口与数据挖掘技术的结合应用

技术冰糖葫芦

API 接口 API 文档 API 策略

速卖通商品详情API(aliexpress.item_get)返回值详解与实战

技术冰糖葫芦

API 接口 API 文档 API 策略

政界人士敦促拜登从尼日利亚带回币安高管

web3区块链创业团队DappNetWork

未来5年,只有这种产品团队才能开启上帝视角【玩转IPD】

IPD产品研发管理

产品 项目管理 产品开发 软件研发

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