读代码整洁之道想到的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了读代码整洁之道想到的相关的知识,希望对你有一定的参考价值。

1.勒布朗法则:later equals never

对于我来说:很多事如果往后拖的话,再重拾的几率就很小,所以要逼迫自己捉住现在,把手头的事情尽可能的做到尽善尽美,否则,日后只会越拖越远。

2.糟糕的代码所带来的深痛影响在于将来他会使你深陷泥沼

刚开始写的代码比较简单,但是后面要不断的添加功能,如果以前的代码写得十分冗余,以后再添加新功能所带来的麻烦将是不可估量的。所以代码一开始就要写的简单有效,为以后做铺垫。

3.态度:作为一个程序员,态度很重要:要以专业的态度来对自己的代码负责

4.命名:命名费时间,但是选个好名字省下来的时间比花掉的多,一旦发现更好的名字,就把旧的换掉,这样不仅读代码的人,自己也更开心

好的名字也有注释的功能。

命名:简单粗暴+不与其他命名产生冲突+能让人读懂

5.作者经验的结果:函数要短小

函数只做一件事+做好一件事

函数的参数越少越好,三个或三个以上可能要采用IntroduceParameterobject(引用参数对象)

使用异常代替返回错误码

抽离try/catch代码块

减少重复

6.注释:

注释的目的是为了日后自己或别人能够更加直接的读懂代码,所以注释中应是函数中的解释,一些个人的习惯或者无用的废话以及注释掉的代码都应该删除。

7.格式:

写代码应该有一定的规律,保持全篇的整洁及规范,让人感觉舒服

8.对象和数据结构:

平常我们写TO类的时候非常顺手的定义一些private类型的成员变量,然后各自定义他们的getXXX()和setXXX()方法。这样的写法体现了Java的封装性,虽然实现还是暴露了,外部类可以使用这些私有属性,但是我们可以在get和set方法中添加一些权限,来保证数据的安全性。而且有些框架是强制使用get和set方法来给对象赋值和取值

 

数据对象的反对称性

对象把数据隐藏于抽象之后,暴露操作数据的函数;数据结构暴露其数据,没有提供有意义的函数。

过程式的代码可以很方便的添加函数,其他的形状类不会受影响,但是添加另一个形状类就需要修改函数来实现该新加类的操作。

面向对象的代码就会通过继承来实现多态,area()方法就是多态的。如果多一个新的形状类很简单,但是当添加一个函数的时候,所有的形状类都需要修改。

过程式代码(使用数据结构的代码)便于在不改动既有数据结构的前提下添加新函数。面向对象代码便于在不改动既有函数的前提下添加新类。

在实际工作中经常会遇到这种两难的情况,设计模式——可以参考访问者模式(Coming out...)。

迪米特法则
law of demeter, LKP最少知道原则:一个对象应当对其他对象又尽可能少的了解,不和陌生人说话。也即是方法不应该调用由任何函数返回对象的方法。
例子:类C的方法f只应该调用一下对象的方法:1) C 2) 由f创建的对象 3) 作为参数传递给f的对象 4) 由C的实体变量持有的对象.

数据传送对象
最为精炼的数据结构是一个只有公共变量、没有函数的类。称之为DTO,经常用于数据库通信、解析套接字传递的消息之类场景。

9.异常处理:

每个软件系统都避不开异常处理,需要防止它搞乱我们的逻辑。

1. 利用异常处理代替返回异常编码,返回异常编码会是的代码中充满了if/else,switch/case扰乱我的代码流转。

2. 对于特定异常扑捉,可以面向异常编程,编写特定的异常类,使得对异常封装转化,更容易捕善后获处理。

3. 避免返回null,在软件系统中最常见头疼的就是NullReferenceException。在非特定场景下,我们应该极力的避免返回null。面对这种场景我们可以采用null object Pattern(空对象模式)返回特例对象,如c#类库中的Guid.Empty,string.Empty;对于集合类型我们可以返回长度0的空集合而非null;

10.类

面向对象的特征:封装、继承、多态、抽象。

1. 类第一原则应是是小并足够的小。但与函数不同的是函数以代码行数统计,而类以权责统计。

2. 单一原则(SRP),体现了类只应该做一件事,并且做好它,这样变化修改的理由只有他所做的事。良好的软件设计中系统是由一组大量的短小的类和他们之间功能协作完成的,而不是几个上帝类。

3. 内聚:高内聚低耦合:提出与结构化编程,内聚表述模块内部功能不同操作逻辑之间的距离,如果一个类的每个变量都被每个方法所使用为最大的内聚;耦合描述模块之间的依赖程度;高内聚低耦合以简单的方式表述就是功能完备(高内聚)对象之间是通过稳定的接口(低耦合)交互的。

4. 依赖倒置(DIP):描述组件之间高层组件不应该依赖于底层组件。依赖倒置是指实现和接口倒置,采用自顶向下的方式关注所需的底层组件接口,而不是其实现。DI模式很好的就是应用IOC(控制反转)框架,构造方式分为分构造注入,函数注入,属性注入;.net平台流行的IOC框架有Unity,Castle windsor,Ninject,Autofac等框架支持,

11.并发编程:

并发是一种时间(When)和目的(What)的解耦,提供应用程序的吞吐量,提高cpu利用率;但是并发编码不是那么容易,再加上临界资源竞争死锁。在并发编程的时候我们必须尽量遵守一些原则:

1. 并发已经足够复杂,我们更需要代码分离,分离线程相关代码和非线程相关代码,单一权责,尽可能降低其复杂度。

2. 限制临街资源的作用域,为临界资源加锁是防止并发的策略,但是必须正确的加锁,如果形成等待环,就导致死锁。

3. 利用数据副本(值对象或者克隆)在线程之间传递数据,避免线程之前操作的并发影响;线程独立,使其在自己的环境中运行,不能其他线程共享数据。

4. 对于临界资源加锁应尽量保持加锁范围尽可能的小。

 

以上是关于读代码整洁之道想到的的主要内容,如果未能解决你的问题,请参考以下文章

第九次读书笔记——读《代码整洁之道》有感

读《Clean Code 代码整洁之道》之感悟

读《代码整洁之道》- 函数名称应该表达其行为

读《代码整洁之道》- 函数名称应该表达其行为

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

读C#代码整洁之道笔记05_使用工具改善代码和单元测试