草庐IT

读C#代码整洁之道笔记02_类、对象和数据结构及编写整洁函数

躺柒 2023-03-28 原文

1. 组织类

1.1. 每一个接口、类、结构体和枚举均应当拥有其自身的独立源文件

1.2. Pascal命名方法命名命名空间

1.3. 测试类定义在独立的程序集

  • 1.3.1. 不同程序集的测试放在不同程序集

  • 1.3.2. 程序集名称的最后附加Tests命名空间

1.4. 公司名称、产品名称和缩写词汇无须使用复数形式

2. 单一职责原则

2.1. (Single Respon-sibility Principle,SRP)

2.2. 一个类应当只具备一种职责

2.3. 类的职责就是类所具备的功能

3. 从注释生成文档

3.1. 源代码文件的顶部都应当包含版权声明

3.2. 命名空间、接口、类、枚举、结构体、方法和属性都应当包含注释

4. 内聚

4.1. 高内聚

  • 4.1.1. 代码应恰当分组

4.2. 低内聚

  • 4.2.1. 不属于同一类型的代码划归在一组

  • 4.2.2. 职责多于一种的类称为低内聚类

5. 耦合

5.1. 紧耦合

  • 5.1.1. 一个类对另一个类依赖性越强

5.2. 低耦合

  • 5.2.1. 相互独立的类越多

  • 5.2.2. 依赖注入技术有助于编写低耦合且易于测试的整洁代码

6. 为变化而设计

6.1. 设计变化的内容和方式

6.2. 面向接口编程

  • 6.2.1. Interface-Oriented Programming,IOP

  • 6.2.2. 有助于编写多态的代码

  • 6.2.3. 控制反转可以在必要时替换实现了相同接口的软件的实现

6.3. 依赖注入(Dependency Injection,DI)

6.4. 控制反转(Inversion of Control,IoC)

6.5. 解决软件变更的问题

7. 迪米特法则

7.1. Law of Demeter

7.2. 最少知识原则(The Least Knowledge Principle)

7.3. 一个类对于其他类知道的越少越好

7.4. 意在删除链条式调用(用“.”进行的调用链接)

7.5. 可以解除代码的耦合

7.6. 实现迪米特法则有时是很难的

8. 不可变对象

8.1. 值类型

8.2. 一旦获得则其值就不再改变

8.3. 容易预测又不会改变

8.4. “最小惊讶原则”(principle of least astonishment,POLA)

9. 对象应当隐藏数据并暴露方法

10. 数据结构体应当暴露数据而无须包含方法

10.1. 结构体和类不同,它们使用值相等而非引用相等来进行比较

10.2. 最好隐藏数据,仅仅通过属性或方法来访问数据

11. 函数式编程

11.1. 一种软件编程方法

11.2. 将计算看作数学计算评估

11.3. LINQ

11.4. readonly struct和不可变数据结构

11.5. 比其他编程类型的方法要短小得多

11.6. 对于面向过程的程序员和面向对象的程序员来说需要比较艰难的转变才能适应

12. 保持方法短小

12.1. 最好将方法长度控制在10行之内

12.2. 最佳长度是在4行之内

13. 代码缩进

13.1. IDE实现

14. 避免重复代码

14.1. Don't Repeat Yourself,DRY

14.2. WET即每次都需要编写的代码(Write Every Time)

15. 尽可能减少参数数量

15.1. 方法参数数目应当小于三个

15.2. 理想情况下则不需要任何参数

15.3. 使用参数对象的模式进行设计

16. 更改对象状态是程序缺陷的源泉,尤其是在多线程程序中

有关读C#代码整洁之道笔记02_类、对象和数据结构及编写整洁函数的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  3. 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​​

  4. 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

  5. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  6. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  7. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  8. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  9. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  10. ruby-on-rails - 未在 Ruby 中初始化的对象 - 2

    我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调

随机推荐