2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

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

关注

评论 1 条评论

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

2021年学习Java还有意义吗?

爱好编程进阶

Java 程序员 后端开发

@requestMapping参数详解

爱好编程进阶

Java 程序员 后端开发

SAP 电商云的 Spartacus Storefront 如何配置多个 JavaScript Application

汪子熙

angular SPA SAP 5月月更 电商云

B站疯传20W份整套2021大厂面试1000题最新汇总(附视频答案详解)

爱好编程进阶

Java 程序员 后端开发

SecurityContextPersistenceFilter 过滤器链

急需上岸的小谢

5月月更

2020最新蚂蚁金服三面+HR一面,面试经验总结及分享

爱好编程进阶

Java 程序员 后端开发

ElasticSearch 概述

爱好编程进阶

Java 程序员 后端开发

在 HarmonyOS 中实现 CircleImageView 库

海拥(haiyong.site)

鸿蒙 5月月更

flume基本概念与操作实例(常用source)

爱好编程进阶

Java 程序员 后端开发

Hive-0

爱好编程进阶

Java 程序员 后端开发

CGB2107-DAY07总结复习

爱好编程进阶

Java 程序员 后端开发

实战:向GitHub提交代码时触发Jenkins自动构建

程序员欣宸

DevOps jenkins java 5月月更

7月编程语言排行榜来了,为什么不同媒体报道的结果不一样?

爱好编程进阶

Java 程序员 后端开发

AQS源码解读(番外篇)

爱好编程进阶

Java 程序员 后端开发

Day182

爱好编程进阶

Java 程序员 后端开发

docker安装与启动

爱好编程进阶

Java 程序员 后端开发

#define定义标识符——定义宏——替换规则——##的作用—

爱好编程进阶

Java 程序员 后端开发

12 Steps to Better Code【改善代码的12步】

爱好编程进阶

Java 程序员

Day159

爱好编程进阶

程序员 后端开发

Hibernate多对多的关系映射,详解(代码

爱好编程进阶

Java 程序员 后端开发

[Day34-02]-[二叉树]从前序与中序遍历序列构造二叉树

方勇(gopher)

LeetCode 二叉树 数据结构和算法

19 分布式缓存集群的伸缩性设计

爱好编程进阶

Java 程序员 后端开发

产品经理好用易上手的数据分析方法

龙国富

数据分析 产品经理

win10搜索功能失效用不了如何解决

Sher10ck

关于Flutter中的RichText组件,你了解多少?

坚果

5月月更

Day220、nginx快速入门 -nginx

爱好编程进阶

程序员 后端开发

读《Software Engineering at Google》(25)

术子米德

架构师成长笔记

30个类手写Spring核心原理之Ioc顶层架构设计(2)

爱好编程进阶

Java 程序员 后端开发

Backbone 之 Inception:纵横交错 (Pytorch实现及代码解析

爱好编程进阶

Java 程序员 后端开发

Dubbo源码分析- 总体介绍与模块划分

爱好编程进阶

程序员 后端开发

《深入理解计算机系统》读书笔记——第一章

如浴春风

5月月更

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