草庐IT

读C#代码整洁之道笔记01_C#的编码标准和原则

躺柒 2023-03-28 原文

1. 编码原则

1.1. SOLID原则

  • 1.1.1. 单一职责原则(Single Respon-sibility Principle)

  • 1.1.1.1. 类和方法应当仅具备单一职责。所有组合为单一职责的元素应当组合在一起并进行封装。

  • 1.1.2. 开闭原则(Open-Closed Principle)

  • 1.1.2.1. 类和方法应当对扩展开放,对修改封闭。

  • 1.1.3. 里氏替换原则(Liskov Substitution)

  • 1.1.3.1. 若函数接收一个基类的指针,那么该指针应当可以替换为任何从基类派生的类(的指针)而无须事先知晓具体类信息。

  • 1.1.4. 接口隔离原则(Interface Segregation Principle)

  • 1.1.4.1. 与其设计一个大而全的接口不如拆分为若干小型接口,而类可以选择实现需要的接口中的方法。

  • 1.1.5. 依赖倒置原则(Dependency Inversion Principle)

  • 1.1.5.1. 高层次的模块不应当依赖低层次的模块。

  • 1.1.5.2. 低层次的模块的替换不应当影响高层次模块的使用。

  • 1.1.5.3. 不论是高层次的模块还是低层次的模块都应当依赖于抽象。

  • 1.1.5.4. 抽象不应当依赖于细节,但是细节应当依赖于抽象。

1.2. YAGNI原则

  • 1.2.1. “你不会需要它”(You Ain't Gonna Need It)

  • 1.2.2. 确保类、方法和整体代码行数保持绝对最小水平。

1.3. KISS原则

  • 1.3.1. “保持软件简单易懂”(Keep It Simple,Stupid)

  • 1.3.2. 务必要保持代码整洁易读,确保即使是新手程序员也能够理解其含义。

1.4. DRY原则

  • 1.4.1. “避免重复的代码”(Don't Repeat Yourself)

  • 1.4.2. 当遇到重复代码时应当尽早将其移除

1.5. 奥卡姆剃刀法则

  • 1.5.1. Occam's Razor, Ockham's Razor

  • 1.5.2. “如无必要,勿增实体”,即“简单有效原理”。

  • 1.5.2.1. 最简单的方案也最可能是正确的那个方案

  • 1.5.2.2. 假设越多,设计方案包含缺陷的可能性就越大

  • 1.5.2.3. 项目的构成组件越少,出问题的可能性就越少

2. 编码方法

2.1. 测试驱动开发(Test-Driven Development,TDD)

2.2. 行为驱动开发(Behavioral-Driven Development,BDD)

  • 2.2.1. SpecFlow

2.3. 面向方面编程(Aspect-Oriented Programming,AOP)

  • 2.3.1. PostSharp

3. 良好代码

3.1. 合理的缩进

  • 3.1.1. 工具实现

3.2. 有意义的注释

3.3. API文档注释

  • 3.3.1. 文档越易用,开发人员使用API的意愿就越强

3.4. 使用命名空间合理组织代码

  • 3.4.1. 使用命名空间合理组织代码

3.5. 合理的命名规则

  • 3.5.1. Pascal命名法

  • 3.5.1.1. 命名空间、类、接口、枚举和方法

  • 3.5.2. 驼峰命名法

  • 3.5.2.1. 变量名称、参数名称

  • 3.5.3. 在成员变量上必须加上前缀下划线

3.6. 一个类执行一种任务

3.7. 一个方法做一件事情

3.8. 方法的代码少于10行,最好不超过4行

  • 3.8.1. 代码格式化、链式函数算1行?

3.9. 方法的参数不多于两个

  • 3.9.1. 方法最好没有参数

  • 3.9.2. 有两个以上的参数时就需要考虑类和方法的职责是不是太多了

  • 3.9.3. 方法的确需要两个以上的参数,那么最好将其合并为一个对象参数

3.10. 合理使用异常

3.11. 代码可读性强

3.12. 代码耦合程度低

3.13. 高内聚的代码

  • 3.13.1. 将公共的功能正确地分组的代码具有高度的内聚性

3.14. 对象会被恰当销毁

  • 3.14.1. 请务必调用Dispose()方法明确地销毁使用中的资源

  • 3.14.2. 将对象(引用)设置为null以使其超出作用范围

  • 3.14.3. using语句

3.15. 避免使用Finalize()方法

  • 3.15.1. 最好在更加可靠的Dispose()方法中来销毁非托管资源

3.16. 合理地进行抽象

  • 3.16.1. 当设计只向更高的级别开放,并仅开放必需的内容时,它就处在正确的抽象层次上

3.17. 在大型类中使用#region进行区域划分

有关读C#代码整洁之道笔记01_C#的编码标准和原则的更多相关文章

  1. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  2. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  3. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  4. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  5. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  6. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  7. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  8. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  9. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  10. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

随机推荐