出发点

http://www.tuicool.com/articles/A7VrE33

阅读中文版本《编写质优代码的十个技巧》,对于我编码十年的经验,也有相同感受,

太多的坑趟过,太多的经历走过,对良好编码的技巧,只能说更加心有灵犀。

下面从英文原版阅读,结合自己的理解,尝试注解下作者的观点。

注解 -- 原文见下网址

https://cdiggins.github.io/blog/programming-tips.html

10 Tips for Writing Better Code

注:翻译成编写更好代码的十个技巧,不如翻译成质量优良代码的十个技巧,更好合适。

30+ years experience trying to write better software distilled down into 10 best practices.

注:30多年努力编写质量优良软件的经验, 被提炼为10个最佳实践。为工匠精神点赞, 中国的程序员不用担心30岁以后要失业,看看人家干了30年了。

1. Follow the Single Responsibility Principle

Functions are the single most important form of abstraction in a programmer's arsenal. The more they can be reused the less code you have to write, and the more reliable they become. Smaller functions that follow the Single responsibility principle are more likely to be resued

注:一件函数只做一件事情, 此精神类似unix设计哲学, 极简而奢。 函数是程序的细胞, 每一个细胞是可复用的, 健康度良好的, 则使用函数组织起来软件,必然是健壮的, 并且更好维护, 更快地组建新的软件。

2. Minimize Shared State

You should minimize implicit shared state between functions, whether it is a file scoped variable or object's member fields, in favor of explicitly required values as arguments. Code becomes a lot easier to understand and reuse when it explicit what that function requires to produce the desired results.

A corrollary to this is that you should prefer static stateless variables to member variables on an object.

注: 共享状态本身就不应该存在, 不应该在不同的函数之前共享同一个变量, 特别是变量是全局变量,造成程序逻辑不清晰, 容易走到异常情况。

如果必须要有共享状态, 则必须使用函数入参的形式, 显示声明,函数依赖的变量, 不要去引用全局变量。

这种思想, 是函数式编程的思想, 对于纯函数, 即给定函数的输入, 函数的输出在任何情况下都是固定的, 可预期,不用担心依赖全局变量,产生的不可控制性。

函数式编程,典型代表语言有 haskell, js中有facebook出品的 immutablejs(https://github.com/facebook/immutable-js), 也是为了达到这种效果。

3. Localize Side Effects

Ideally side-effects (e.g. printing to console, logging, changing global state, file-system manipulations, etc.) should be placed in separate modules, and not scattered throughout the code. Often side-effects in functions are violating the single responsibility principle.

注: 局部化副作用, 对于存在副作用, 例如函数的执行, 改变的全局变量, 则尽量将副作用局部化, 例如局部化到模块, 不要让副作用散落在程序的任何地方。

即减少副作用的影响范围。

4. Prefer Immutable Objects

If an object's state is set once in its constructor and never changed again it become much easier to debug since it remains valid once it is constructed correctly. This is one of the easiest ways to reduce complexity in a software project.

注: 优选不可变对象。 对象的属性在程序运行过程中, 不被改变, 更加易于调试。 例如 array.map 接口设计, array.map(v=v+1), 此操作不改变array对象本身, map函数会产生一个新的 array,并返回。

5. Interfaces over Classes

Functions that accept an interface (or a template argument or concept in the case of C++) are more reusable than functions that operate on a class.

注: 函数接受接口, 更加具有复用性, 相比较函数接受 类。

面向接口的编程, 比面向类的编程, 更加具有灵活性。

一: 如果函数依赖与类, 则函数只能服务于此类, 和此类的子类。 如果依赖接口, 则函数可以服务于任何实现了此接口的任何对象。

二:如果函数依赖类, 函数依赖的对象变大, 实际其只需要依赖 接口, 容易在函数中 产生副作用, 调用了类的其它非接口的公共函数和属性。

6. Apply Good Principles to Modules

Look for opportunties to break up a software project into smaller modules (e.g. libraries and applications) to encourage module level reuse. Some key principles to follow for modules are:

  1. Minmize dependencies
  2. Each project should have a single well defined responsibility
  3. Don't repeat yourself

You should strive to keep your project small and well-defined.

注: 寻找机会分解软件项目为更小的模块, 例如库和应用, 这是为了鼓励 模块级别重用。一些关键的原则:1、 极小化模块之间的依赖, 2、每个模块有一个单一的定义良好的职责, 3、不要重复。

软件开发, 一个关键的环节就是设计, 设计就是要把整个系统 拆分为不同的子模块, 这样减少软件开发的复杂度,即使的复杂度处于可控范围内。 模块与模块之间的链接尽量小,并且明确, 符合 “高内聚、低耦合”原则。

7. Avoid Inheritance

In object-oriented programming, inheritance, especially with virtual functions tends to be a dead-end in terms of reusability. I have had very little success writing or working with libraries that encourage overriding classes.

注: 避免继承。 继承减少的服用性, 继承之后, 必然有一些函数或者属性, 是需要覆盖父亲类的, 或者新增父亲类没有的函数和属性。

如果一个对象, 其划分的比较合理, 职责比较单一, 则对象的所有属性和函数是一套整体的内容, 子类的函数覆盖, 或者新增, 很容易就割裂了对象的整体性,

一部分逻辑在父亲, 一部分逻辑在儿子, 实际上造成了逻辑的低耦合。

8. Test as you Design and Develop

I am not a hard-core advocate of test-driven development but writing tests as you go leads to code that naturally follows many of the guidelines. It also helps reveal n error earlier. Avoid writing useless tests though, good coding practices mean that higher level tests (e.g. integration tests or feature tests over unit tests) are much more effective at revealing defects.

注:当你开发过程中, 写测试, 有助于发现低水平的缺陷, 进而促进集成测试和功能测试, 更加有效地发现缺陷。

9. Prefer Standard Libraries to Hand-Rolled Ones

I can't tell you how often I have seen a better version of std::vector or std::string, but it almost invariably a waste of time and effort. Apart from the obvious fact that you are introducing a new place for bugs (see Tip #10), other programmers are far less likely to reuse your code as opposed to something that is widely understood, supported, and tested.

注: 优选标准库, 不要手工制造了。 自己造轮子, 则多出一个产生bug的口子, 使用标准库, 则不容易出现bug, 因为标准库已经被官方测试发布过, 更加质量优良, 且有bug, 也很快被修复。自己造, 一则浪费时间, 二则容易引入bug。

10. Avoid Writing New Code

This is the most important tip that every programmer should follow: the best code is the code that isn't written. The more lines of code you have, the more defects you will have, and the harder it is to find and fix bugs.

Before writing a line of code ask yourself, is there a tool, function, or library that already does what you need? Do you really need that function as opposed to calling another one that already exists?

注: 最好的代码就是自己不写代码。 以无招胜有招, 达到武学最高境界。  不说啥了,尽量不要自己造轮子, 使用别人造的轮子。 如果真想造, 就参加开源项目, 为开源事业贡献力量。

Final Words

I have found that programming is a skill very similar to learning an art form or a sport, you get better at it through mindful practice, and by learning from others. Continuously working to improve the quality of the code you produce will help you become a more effective programmer.

持续改进你的代码, 会帮助你称为一个更加高效的程序员。

致敬30年的老兵!!

10 Tips for Writing Better Code (阅读理解)的更多相关文章

  1. 写出完美论文的十个技巧10 Tips for Writing the Perfect Paper

    10 Tips for Writing the Perfect Paper Like a gourmet meal or an old master painting, the perfect col ...

  2. 用Keras搞一个阅读理解机器人

    catalogue . 训练集 . 数据预处理 . 神经网络模型设计(对话集 <-> 问题集) . 神经网络模型设计(问题集 <-> 回答集) . RNN神经网络 . 训练 . ...

  3. P3879 [TJOI2010]阅读理解 题解

    P3879 [TJOI2010]阅读理解 题解 题目描述 英语老师留了N篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节约时间,现在要做个统计,算一算某些生词都在哪几篇短文中出现过. 输 ...

  4. Tips for writing a paper

    Tips for writing a paper 1. Tips for Paper Writing 2.• Before you write a paper • When you are writi ...

  5. Ten Tips for Writing CS Papers, Part 2

    Ten Tips for Writing CS Papers, Part 2 This continues the first part on tips to write computer scien ...

  6. Ten Tips for Writing CS Papers, Part 1

    Ten Tips for Writing CS Papers, Part 1 As a non-native English speaker I can relate to the challenge ...

  7. Tensorflow做阅读理解与完形填空

    catalogue . 前言 . 使用的数据集 . 数据预处理 . 训练 . 测试模型运行结果: 进行实际完形填空 0. 前言 开始写这篇文章的时候是晚上12点,突然想到几点新的理解,赶紧记下来.我们 ...

  8. 阅读关于DuReader:百度大规模的中文机器阅读理解数据集

    很久之前就得到了百度机器阅读理解关于数据集的这篇文章,今天才进行总结!.... 论文地址:https://arxiv.org/abs/1711.05073 自然语言处理是人工智能皇冠上的明珠,而机器阅 ...

  9. Trie树【P3879】 [TJOI2010]阅读理解

    Description 英语老师留了N篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节约时间,现在要做个统计,算一算某些生词都在哪几篇短文中出现过. Input 第一行为整数N,表示短文 ...

随机推荐

  1. centos7破解安装fisheye和Crucible

    背景介绍: Atlassian的东西相信大家都不陌生,JIRA.Confluence……虽然说这些产品都要收费,也可以申请试用: FishEye 可以方便地查看代码,而Crucible 则是进行Cod ...

  2. webpack入门(六) API in modules

    A quick summary of all methods and variables available in code compiled with webpack. 用webpack编译的一些变 ...

  3. 【CF1154】题解

    A 直接模拟即可. B 对数组中的值进行排序去重.发现若去重之后的数组中有大于 3 个数时无解,因为无法找到一个点到数轴上四个点的距离均相等.若去重之后的数组中只有三个值,则判断中间的值是否到两边的值 ...

  4. java面试——问题回溯

    背景:用来记录面试过程中遇到的问题,在这里进行记录,下次不要犯同样的错误. 迪普科技 Linux服务器下的top命令 #动态更新的虚拟文件实际上是许多其他内存相关工具(如:free / ps / to ...

  5. Python之黏包

    黏包现象 让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd) res=subprocess.Popen(cmd.decode('utf-8'), shell ...

  6. Tomcat 用 startup.bat 启动时,加载信息之后又关闭服务器(差不多一闪而过)问题

    Tomcat 用 startup.bat 启动时,加载信息之后又关闭服务器(差不多一闪而过)问题 以前是正常的,后来在 server.xml 文件的 <Host> </Host> ...

  7. keepalived+LVS实现网站负载均衡和HA

    如上图所示,102和103是内网nginx服务器,100和101是边界LB,clinet是1,这个实验是为了实现在LB上虚拟出一个VIP,client通过访问该VIP,来动态负载到两台内网nginx服 ...

  8. 解决docker多开mysql报错问题

    1.vim /etc/sysctl.conf fs.aio-max-nr=262144 重新加载 sysctl -p /etc/sysctl.conf

  9. collections 数据结构模块namedtuple

    namedtuple类 导入模块 from collections import namedtuple 使用方法及说明 #pycharm 里按住 ctrl键点击 collections可查看源码 #c ...

  10. 面向对象【day07】:面向对象使用场景(十)

    本节内容 1.概述 2.知识回顾 3.使用场景 一.概述 之前我们学了面向对象知识,那我们在什么时候用呢?不可能什么时候都需要用面向对象吧,除非你是纯的面向对象语言,好的,我们下面就来谈谈 二.知识回 ...