代码整洁之道,(代码整洁之道)是用什么语言描述的?谁看过?c,还是java,还是c#之类的?
代码整洁之道,(代码整洁之道)是用什么语言描述的?谁看过?c,还是java,还是c#之类的?详细介绍
本文目录一览: 《代码整洁之道》pdf下载在线阅读全文,求百度网盘云资源
《代码整洁之道》百度网盘pdf最新全集下载:链接:https://pan.baidu.com/s/1XIj8i1t_CQgTRSv0xJS7OQ
?pwd=fg4b 提取码:fg4b简介:本书是编程大师“Bob 大叔”40余年编程生涯的心得体会的总结,讲解要成为真正专业的程序员需要具备什么样的态度,需要遵循什么样的原则,需要采取什么样的行动。作者以自己以及身边的同事走过的弯路、犯过的错误为例,意在为后来者引路,助其职业生涯迈上更高台阶。
《代码整洁之道》pdf百度网盘免费阅读:
链接:https://pan.baidu.com/s/1yiAodg3elxX-S3e-4jhD4w
?pwd=1234
提取码:1234
《代码整洁之道》是2009年12月由人民邮电出版社出版的图书,作者是马丁。本书主要讲述了代码质量与其整洁度成正比的道理,并由此揭示代码整洁之道。
《代码整洁之道》epub下载在线阅读,求百度网盘云资源
《代码整洁之道》([美] Robert C. Martin)电子书网盘下载免费在线阅读
链接:https://pan.baidu.com/s/1iM-wXXGr5aY4JXApiLPwzg
提取码:9es3
书名:代码整洁之道
作者:[美] Robert C. Martin
译者:韩磊
豆瓣评分:8.7
出版社:人民邮电出版社
出版年份:2020-2
页数:387
内容简介:
软件质量,不但依赖架构及项目管理,而且与代码质量紧密相关。这一点,无论是敏捷开发流派还是传统开发流派,都不得不承认。本书提出一种观点:代码质量与其整洁度成正比。干净的代码,既在质量上较为可靠,也为后期维护、升级奠定了良好基础。作为编程领域的佼佼者,本书作者给出了一系列行之有效的整洁代码操作实践。这些实践在本书中体现为一条条规则(或称“启示”),并辅以来自实际项目的正、反两面的范例。只要遵循这些规则,就能编写出干净的代码,从而有效提升代码质量。
本书阅读对象为一切有志于改善代码质量的程序员及技术经理。书中介绍的规则均来自作者多年的实践经验,涵盖从命名到重构的多个编程方面,虽为一“家”之言,然诚有可资借鉴的价值。
作者简介:
作者 | Robert C. Martin
世界级软件开发大师,设计模式和敏捷开发先驱,敏捷联盟首任主席,C++ Report前主编,被后辈程序员尊称为“Bob大叔”。20世纪70年代初成为职业程序员,后创办Object Mentor公司并任总裁。Martin还是一名多产的作家,至今已发表数百篇文章、论文和博客文章。除本书外,还著有《代码整洁之道:程序员的职业素养》《敏捷软件开发:原则、模式和实践》《UML:Java程序员指南》等。
译者 | 韩磊
互联网产品与社区运营专家,技术书籍著译者。曾任CSDN及《程序员》杂志副总经理、总编辑,广东二十一世纪传媒新媒体事业部总经理等职。现任AR初创企业亮风台广州公司总经理。除本书外,还译有《梦断代码》《C#编程风格》等书。与刘韧合著《网络媒体教程》,与戴飞合译《Beginning C# Objects中文版:概念到代码》。
代码整洁之道的作品目录
第1章 整洁代码 11.1 要有代码 2 1.2 糟糕的代码 21.3 混乱的代价 31.3.1 华丽新设计 41.3.2 态度 41.3.3 迷题 51.3.4 整洁代码的艺术 51.3.5 什么是整洁代码 61.4 思想流派 101.5 我们是作者 111.6 童子军军规 121.7 前传与原则 12 1.8 小结 121.9 文献 13第2章 有意义的命名 152.1 介绍 152.2 名副其实 162.3 避免误导 172.4 做有意义的区分 182.5 使用读得出来的名称 192.6 使用可搜索的名称 20 2.7 避免使用编码 212.7.1 匈牙利语标记法 212.7.2 成员前缀 212.7.3 接口和实现 222.8 避免思维映射 222.9 类名 232.10 方法名 232.11 别扮可爱 232.12 每个概念对应一个词 242.13 别用双关语 242.14 使用解决方案领域名称 252.15 使用源自所涉问题领域的名称 252.16 添加有意义的语境 252.17 不要添加没用的语境 272.18 最后的话 27第3章 函数 293.1 短小 323.2 只做一件事 333.3 每个函数一个抽象层级 343.4 switch语句 353.5 使用描述性的名称 363.6 函数参数 373.6.1 一元函数的普遍形式 383.6.2 标识参数 383.6.3 二元函数 383.6.4 三元函数 393.6.5 参数对象 393.6.6 参数列表 403.6.7 动词与关键字 403.7 无副作用 403.8 分隔指令与询问 423.9 使用异常替代返回错误码 42 3.9.1 抽离Try/Catch代码块 433.9.2 错误处理就是一件事 443.9.3 Error.java依赖磁铁 443.10 别重复自己 443.11 结构化编程 453.12 如何写出这样的函数 453.13 小结 453.14 SetupTeardownIncluder程序 46 3.15 文献 48第4章 注释 494.1 注释不能美化糟糕的代码 504.2 用代码来阐述 514.3 好注释 514.3.1 法律信息 514.3.2 提供信息的注释 514.3.3 对意图的解释 524.3.4 阐释 53 4.3.5 警示 534.3.6 TODO注释 544.3.7 放大 544.3.8 公共API中的Javadoc 554.4 坏注释 554.4.1 喃喃自语 554.4.2 多余的注释 564.4.3 误导性注释 584.4.4 循规式注释 584.4.5 日志式注释 59 4.4.6 废话注释 594.4.7 可怕的废话 614.4.8 能用函数或变量时就别用注释 624.4.9 位置标记 624.4.10 括号后面的注释 624.4.11 归属与署名 634.4.12 注释掉的代码 634.4.13 HTML注释 644.4.14 非本地信息 644.4.15 信息过多 654.4.16 不明显的联系 65 4.4.17 函数头 664.4.18 非公共代码中的Javadoc 664.4.19 范例 664.5 文献 69第5章 格式 715.1 格式的目的 725.2 垂直格式 725.2.1 向报纸学习 735.2.2 概念间垂直方向上的区隔 73 5.2.3 垂直方向上的靠近 745.2.4 垂直距离 755.2.5 垂直顺序 795.3 横向格式 795.3.1 水平方向上的区隔与靠近 805.3.2 水平对齐 815.3.3 缩进 825.3.4 空范围 845.4 团队规则 845.5 鲍勃大叔的格式规则 85第6章 对象和数据结构 87 6.1 数据抽象 876.2 数据、对象的反对称性 896.3 得墨忒耳律 916.3.1 火车失事 916.3.2 混杂 926.3.3 隐藏结构 926.4 数据传送对象 936.5 小结 94 6.6 文献 94第7章 错误处理 957.1 使用异常而非返回码 967.2 先写Try-Catch-Finally语句 977.3 使用不可控异常 987.4 给出异常发生的环境说明 997.5 依调用者需要定义异常类 997.6 定义常规流程 1007.7 别返回null值 1017.8 别传递null值 1027.9 小结 103 7.10 文献 104第8章 边界 1058.1 使用第三方代码 1068.2 浏览和学习边界 1078.3 学习log4j 1088.4 学习性测试的好处不只是免费 1108.5 使用尚不存在的代码 1108.6 整洁的边界 1118.7 文献 112第9章 单元测试 1139.1 TDD三定律 114 9.2 保持测试整洁 1159.3 整洁的测试 1169.3.1 面向特定领域的测试语言 1189.3.2 双重标准 1199.4 每个测试一个断言 1219.5 F.I.R.S.T. 1229.6 小结 1239.7 文献 124第10章 类 12510.1 类的组织 12610.2 类应该短小 12610.2.1 单一权责原则 12810.2.2 内聚 12910.2.3 保持内聚性就会得到许多短小的类 13010.3 为了修改而组织 13610.4 文献 139第11章 系统 14111.1 如何建造一个城市 14211.2 将系统的构造与使用分开 14211.2.1 分解main 14311.2.2 工厂 14311.2.3 依赖注入 14411.3 扩容 14511.4 Java代理 14811.5 纯Java AOP框架 15011.6 AspectJ的方面 15211.7 测试驱动系统架构 153 11.8 优化决策 15411.9 明智使用添加了可论证价值的标准 15411.10 系统需要领域特定语言 15411.11 小结 15511.12 文献 155第12章 迭进 15712.1 通过迭进设计达到整洁目的 15712.2 简单设计规则1:运行所有测试 158 12.3 简单设计规则2~4:重构 15812.4 不可重复 15912.5 表达力 16112.6 尽可能少的类和方法 16212.7 小结 16212.8 文献 162第13章 并发编程 16313.1 为什么要并发 164 13.2 挑战 16513.3 并发防御原则 16613.3.1 单一权责原则 16613.3.2 推论:限制数据作用域 16613.3.3 推论:使用数据复本 16713.3.4 推论:线程应尽可能地独立 16713.4 了解Java库 16713.5 了解执行模型 16813.5.1 生产者-消费者模型 169 13.5.2 读者-作者模型 16913.5.3 宴席哲学家 16913.6 警惕同步方法之间的依赖 16913.7 保持同步区域微小 17013.8 很难编写正确的关闭代码 17013.9 测试线程代码 17113.9.1 将伪失败看作可能的线程问题 17113.9.2 先使非线程代码可工作 17113.9.3 编写可插拔的线程代码 17213.9.4 编写可调整的线程代码 17213.9.5 运行多于处理器数量的线程 172 13.9.6 在不同平台上运行 17213.9.7 装置试错代码 17313.9.8 硬编码 17313.9.9 自动化 17413.10 小结 17513.11 文献 175第14章 逐步改进 17614.1 Args的实现 177 14.2 Args:草稿 18314.2.1 所以我暂停了 19514.2.2 渐进 19514.3 字符串参数 19714.4 小结 234第15章 JUnit内幕 23515.1 JUnit框架 23615.2 小结 249 第16章 重构SerialDate 25116.1 首先,让它能工作 25216.2 让它做对 25416.3 小结 26616.4 文献 267第17章 味道与启发 26917.1 注释 27017.2 环境 27117.3 函数 27117.4 一般性问题 27217.5 Java 288 17.6 名称 29117.7 测试 29417.8 小结 29517.9 文献 296附录A 并发编程II 297A.1 客户端/服务器的例子 297A.1.1 服务器 297A.1.2 添加线程代码 298 A.1.3 观察服务器端 299A.1.4 小结 301A.2 执行的可能路径 301A.2.1 路径数量 302A.2.2 深入挖掘 303A.2.3 小结 305A.3 了解类库 305A.3.1 Executor框架 305A.3.2 非锁定的解决方案 306A.3.3 非线程安全类 307A.4 方法之间的依赖可能破坏并发代码 308 A.4.1 容忍错误 309A.4.2 基于客户代码的锁定 309A.4.3 基于服务端的锁定 311A.5 提升吞吐量 312A.5.1 单线程条件下的吞吐量 313A.5.2 多线程条件下的吞吐量 313A.6 死锁 314A.6.1 互斥 315A.6.2 上锁及等待 315A.6.3 无抢先机制 315A.6.4 循环等待 315A.6.5 不互斥 316A.6.6 不上锁及等待 316A.6.7 满足抢先机制 317A.6.8 不做循环等待 317A.7 测试多线程代码 317A.8 测试线程代码的工具支持 320A.9 小结 320A.10 教程:完整代码范例 321A.10.1 客户端/服务器非线程代码 321A.10.2 使用线程的客户端/服务器代码 324附录B org.jfree.date.SerialDate 327结束语 389
(代码整洁之道)是用什么语言描述的?谁看过?c,还是java,还是c#之类的?
代码整洁之道好像类似于软件工程教材,不是用什么语言写的吧!它主要是讲的代码规范。
好像是Java或者c# ,那本书代码不多,内容大多是啰嗦,不过很有启发,即使不是你学的语言你也能看懂,这就是那本书编码给人的感觉,无关语言类型,只关心代码描述。
软件开发初学者应该看什么书
你好,首先我建议你先购买电子资料学习,原因有三:
1、学习入门的资料,大体都一样,所以不用太纠结买书本还是电子资料;
2、书本比较贵,电子材料相对会便宜很多,在淘宝上买十几个G的电子资料,也就3块钱左右,而且是有归纳好的视频、电子文档和源代码的;
3、等到你做高级开发的时候,再买书本学习比较合适。到时候才应该思考那些书讲的更好。
先祝你学习软件开发顺利。我个人认为,要想学好软件开发先要从基本做起。不必拘泥于某一种语言,因为主要的编程思想是相通的。C语言十分经典,建议先学习C语言。可考虑安如下顺序:1.c语言程序设计(谭浩强)
2.C与指针(十分经典)
3.编译原理
4.软件工程
如果能把上面四本书吃透了,绝对可以成长为一名杰出的软件工程师。
关于C和C++先学和后学其实无所谓。在某种程度上讲,C是C++的基础,要是可以的话,尽量先学习C
看你是想学习什么语言了
不过
C语言和C++ 肯定是先看C语言,这是基础语言
对于初期开发者可以先看实例,先抄代码,也可以先看语法,沉淀到一定时候就结合看,慢慢的就上路了
软件开发初学者应该可以先在网上找免费学习资料,然后看是否有兴趣学习
先学C吧,,再学C++ 看点c程序设计简明教程之类的
学习软件开发都需要看《c和指针》、《c缺陷和陷阱》、《c专家编程》,这三本书是一个初级C程序员必看的三本书,同时也是应届新员工必须好好学习的教材,非常适合刚毕业的大学生学习 。
另外还有:
C++语言提升:
《Effective C++:改善程序与设计的55个具体做法》
《More Effective C++:35个改善编程与设计的有效方法(中文版)》
《C++沉思录》
《C++Templates中文版》
《深度探索 C++ 对象模型》
《泛型编程与STL》
一个由C转向C++的程序员,从来没有系统的学习过C++的语法,往往是用到的什么学习什么。如果要系统入门,《C++ primer》倒是不错。
设计类《代码大全》:
《重构-改善既有代码的设计》
《代码整洁之道》
《实现模式》
《程序员应该知道的97件事》
这几本书一般讲的是函数以及更低层次的设计。《代码大全》完完整整的读完过,而且做了很多的笔记,获益良多。《重构》就不必说了,其他几本书前面大致看了一下,也非常不错,计划有时间要好好学习一下。
架构:
《软件体系结构的艺术》
《领域驱动设计:软件核心复杂性应对之道》
《软件架构师应该知道的97件事》
《企业应用架构模式》
《面向模式的软件体系结构卷1:模式系统》
《软件架构设计》
《架构师需要知道的97件事》
敏捷开发:
《测试驱动开发》
《敏捷软件开发——原则、模式与实践》
《Scrum敏捷项目管理》
《硝烟中的Scrum和XP——我们如何实施Scrum》
《敏捷软件开发》
想要自学Java编程,有什么书籍推荐么?
关于自学Java书籍推荐,青妹主要从两个方向入手:
《Head First Java》:这是学习Java的入门书籍,这本书是完整的面向对象程序设计和Java的学习指导。根据学习理论所设计的,让你可以从学习程序语言的基础开始一直到包括线程、网络与分布式程序等项目。
自学:《Java从入门到精通》、《Java开发实战经典》,前一本书主要针对Java基础,对于没有学过Java的人来说,是一个不错的选择。通过这本书,可以从零开始,慢慢学习。重点是这本书实操很多,不会让你看到最后出现只会理论的情况。后面一本书也是比较适合自学的人学习的,里面的很多小案例可以帮助自学者边学边练巩固知识。
报班:《Java核心技术》、《Java编程思想》, 前一本书主要分为两个部分,一部分讲基础知识,另一部分讲的是高级特性。这本书对参加培训的同学作用比较大,当跟不上上课节奏时,很多基础和核心的东西就会掌握得不牢固,那么这本书正好弥补了这个缺失;《Java编程思想》可以说是最经典的java著作,这本书不管是正在学习还是已经工作许多年的程序员,都可以从这本书中得到想要的东西。这本书具有教材和工具书的作用,就像一本字典,想知道什么都可以从中查询。
java核心卷1 2
学Java,有哪些推荐书籍可以看?很多人都会有这样的疑问。如果你初出茅庐,对Java感兴趣,在这行深钻研,那么这些书绝对不能少;如果你已经是个Java工程师,那么这些书可以帮助你在Java的路上更加精进。一起来看看吧!
四大名著之《Java核心技术(第10版)》提起Java入门必读,四大名著是少不了的。《Java 核心技术》就是其中之一,分卷一、卷二两册,卷一讲基础,卷二为进阶。全书对于Java语言的核心概念、语法、重要特性和开发方法讲解地非常细致,可以说是一部有关Java的百科全书。
四大名著之《EffectiveJava中文版(第 2 版)》“神书”、“整本书都是精华”、“内容永不过时”、“Java 程序员必读”……这些标签都是属于《Effective Java中文版》的。
这本书不是讲理论基础的,而是讲实战的。书中介绍了78条极具实用价值的经验规则,涵盖了大多数开发人员每天所面临的问题的解决方案,并且通过代码例子进一步进行佐证,让你知其然,也知其所以然。
哪怕不是Java程序员,也能买来看看,书中绝妙的编程观是跨语言、跨平台的。
四大名著之《Java 编程思想(第 4 版)》这同样是一本Java领域的经典书籍,从Java编程的基础知识点开始讲起,慢慢深入,一直到Java的高级特性。作者用了大量通俗易懂的代码对理论进行佐证,让读者在实际操作中可以深入理解操作符、枚举类型、接口等相关知识。
这是一本被广大读者评价为“不管什么时候阅读都会有收获”的书,不论你是否刚接触 Java,都可以在阅读中获得启迪。
《深入理解Java虚拟机:JVM 高级特性与最佳实践(第 2 版)》用Java却不懂JVM是说不过去的,但市面上有关JVM 的书很少,这本书更是少有的国内讲解此方面备受好评的书,甚至可以说是JVM书籍最好的读物之一。
本书整体内容更偏向实战,难易适中。从内存管理、执行子系统、程序编译与优化、高效并发等核心主题讲解JVM。第2版根据JDK1.7进行了内容升级,整体上不光适合入门,而且对于已经接触JVM的人来说,也会常读常新。
《Java语言程序设计(基础篇)(原书第 10 版)》这应该是很多程序员,尤其是Java程序员倍感亲切的书,因为这本书可以说是他们当中很多人的入门初心。
本书从最基本的程序理论知识出发,哪怕你完全没有Java基础,也可以通过这本书了解Java基本的程序设计、语言结构、面对对象程序设计等知识。书中还配了大量的代码和课后习题,让读者在了解有关Java的基础知识的时候,也能进行实践深入理解。
非常适合零基础、Java 和编程爱好者来读。
《Java 高并发编程详解:多线程与架构设计》全书主要分为四个部分:第一部分主要阐述Thread的基础知识;第二部分引入了 ClassLoader; 第三部分详细、深入地介绍volatile关键字的语义;第四部分也是最重要的一部分,站在程序架构设计的角度深入讲解了如何设计高效灵活的多线程应用程序。
上述就是几本学Java要看的书籍。目前Java软件工程师的就业机会和人才需求量是非常大的。再加上Java程序员不仅IT专业企业需要,广大的非IT企业也需要,前景是非常乐观的。
书籍资料配视频教程更好哟~移至B站尚学堂官方号,教程随你挑,试听不吃亏!
自学Java有哪些必备的学习书籍,在这里一一给你展示出来:
在这里给你推荐几本书,非常优秀的书籍:当然在推荐之前,你可以在B站内搜索我们的名字,观看一下我们的学习视频;
我校名师高淇讲述的Java300集课程,非常适合刚入门的零基础学者哦!
这几本书相当不错,推荐给你:1.《Java编程规范》 适合对象:初级、中级
介绍:这本书的作者是被誉为Java之父的James Gosling,入门者推荐阅读,对基础的讲解很不错。
2.《Java编程思想》 适合对象:初级、中级
介绍:豆瓣给出了9.1的评分,全球程序员广泛赞誉。有人说这本书不适合初学者,不过小编认为作者并没有对读者已有的知识经验有过多要求,只是要求读者需要知道基本的程序语言。作者以通俗易懂及小而直接的示例解释了一个个晦涩抽象的概念,需要花时间细细研读。
3.《Java核心技术:卷I基础知识》 适合对象:初级、中级
介绍:官方机构图书,备一本总是没错的。这本书比较全面也通俗易懂。可以当字典的功能来用,学习入门必备。
4.《Java数据结构和算法》 适合对象:初级、中级、高级
介绍:这本书目前基本断货,足以说明抢手程度。作者主要使用Java语言描述了我们常用的数据结构,值得一看。
5.《Java与模式》 适合对象:中级、高级
介绍:难得一见的国人写的Java好书。主要讲解设计原则以及最为常见的设计模式的实用教材。这本书出现的比较早,是初级到中高级必读的图书之一。
6.《SCJP学习指南》 适合对象:初级、中级
介绍:官方考试的必备图书,对检验自己的Java学习情况很有帮助。这本书特别适合学生阅读,这本书理解透了,找工作面试Java题目不会有任何问题。一些工作多年的工程师都会在里边遇到一些不会做的题目。
学习的过程中,编程视频的弥补是不可缺失的,需要的话点个赞吧!
进阶篇1.《重构:改善既有代码的设计》 适合对象:中级、高级
介绍:清晰揭示了重构的过程,解释了重构的原理和最佳实践方式,并给出了何时以及何地应该开始挖掘代码以及改善。大师的杰作,让你明白软件是一步步改进的,不是一蹴而就的。
2.《XML入门经典》 适合对象:初级、中级、高级
介绍:很多人觉得没必要买XML书籍,不过我还是觉得推荐一本给你作为工具书,而且看本书可以使得你对XML方方面面有个了解。里面不少东西还是用到的。
3.《jQuery基础教程》 适合对象:初级、中级、高级
介绍:从这个开始学习jQuery才是根本,不然以后遇到的很多奇怪问题不知所以然。jQuery个人感觉已经成为目前的javascript标准库了,插件无数,大大简化了前端工作。
4.《JavaScript权威指南》 适合对象:初级、中级、高级
介绍:一本从全新视角和层次来介绍JavaScript的参考书,填补了市场的空白。是学习js的必备参考工具书之一。
5.《代码整洁之道》 适合对象:中级、高级
介绍:讲述了一系列行之有效的整洁代码操作实践。软件工程的理想编码是无数人编出来的代码像一个人写的,这本书当作规范就不错。
最后:学习Java编程一定要努力学习!祝你成功!
有什么JAVA方面的书籍吗???要比较出色的书,谢了
去当当网搜索
排行前几名的就是出色的了
推荐俩本
java核心技术
java编程思想
能坚持看完基础就很扎实了
初学者建议看
孙卫琴写的《面向对象编程》
写的很好
如果
已经入门了
建议看
java核心技术
很经典的
把这本书学透了
你的java已经很牛了
但是不建议初学者看这本书
别听他们的了,我超级强烈推荐《逻辑java》超级适合初学者,是北大青鸟的第一期教材,肯定带你快速入门,这本书你可以跟青鸟的老学员买!~~~我不知道这本书网络资源有没有,你可以试试
1.《Java从入门到精通》
这本书主要针对Java基础,对于没有学过Java的人才说,是一个不错的选择。通过这本书,大家可以从零开始,慢慢来学习,而且实操很多,不会让你看到最后出现只会理论的情况。
2.《Java编程思想》
在有了一定的Java编程经验之后,你需要“知其所以然”了。这个时候《Java编程思想》是一本让你知其所以然的好书,它对于基本的面向对象知识有比较清楚的交待,对Java基本语法,基本类库有比较清楚的讲解,可以帮你打一个良好的Java编程基础。这本书的缺点是实在太厚,也比较罗嗦,不适合现代人快节奏学习,因此看这本书要懂得取舍,不是每章每节都值得一看的,挑重点的深入看就可以了。
3.《重构:改善既有代码的设计》
出自于 Martin Fowler 的大作,写出优秀代码的必经之路。这本书名气很大,不用多介绍,可以在闲暇的时候多翻翻,多和自己的实践相互印证。这本书对你产生影响是潜移默化的。
4.《Java开发实战经典》
这本书比较适合自学者学习,里面有很多小案例,可以边学边练,巩固知识。
编程5分钟,命名2小时!大神程序员都在用这套命名方法
在 软件中随处可见命名:要给变量、函数、参数、类和封包命名,还要给源代码及源代码所在目录命名,甚至还有jar文件、war文件和ear文件命名。
但是,看似简单的命名,也是让不少程序员头疼的问题。 有一些小伙伴,在进行变量命名的时候,对于自己熟悉的英文,可能还会用英文命名一下,如果需要命名的部分不会用英文表达,或许就直接用拼音了。
有的童鞋一下想不起来怎么命名,直接用拼音直接用aa,bb等这样没有任何代表意义的字母来命名,可读性非常差,可能自己今天写的,一个星期后回来再看,也忘记其具体代表的含义了。
因此,许多人在写代码之前,总会在想啊想啊,用什么命名法好呢?对于经常在C++、Java、Python等主流语言上切换的强迫症来说,换个语言换种命名风格简直不要太混乱。
既然有这么多命名要做,不妨做好它。本期内容中,异步君为大家带来了起个好名字应遵从的几条简单规则,一起来看看吧
— 01 —
名副其实
名副其实说起来简单。我们想要强调,这事很严肃。选个好名字要花时间,但省下来的时间比花掉的多。注意命名,而且一旦发现有更好的名称,就换掉旧的。这么做,读你代码的人(包括你自己)都会更开心。
变量、函数或类的名称应该已经答复了所有的大问题。它该告诉你,它为什么会存在,它做什么事,应该怎么用。如果名称需要注释来补充,那就不算是名副其实。
名称d什么也没说明。它没有引起读者对时间消逝的感觉,更别说以日计了。我们应该选择指明了计量对象和计量单位的名称:
选择体现本意的名称能让人更容易理解和修改代码。下列代码的目的何在?
为什么难以说明上述代码要做什么事?里面并没有复杂的表达式,空格和缩进中规中矩,只用到三个变量和两个常量,甚至没有涉及任何其他类或多态方法,只是(或者看起来是)一个数组的列表而已。
问题不在于代码的简洁度,而在于代码的模糊度:即上下文在代码中未被明确体现的程度。上述代码要求我们了解类似以下问题的答案:
(1)theList中是什么类型的东西?
(2)theList零下标条目的意义是什么?
(3)值4的意义是什么?
(4)我怎么使用返回的列表?
问题的答案没体现在代码段中,可代码段就是它们该在的地方。比方说,我们在开发一种扫雷 游戏 ,我们发现,盘面是名为theList的单元格列表,那就将其名称改为gameBoard。
盘面上每个单元格都用一个简单数组表示。我们还发现,零下标条目是一种状态值,而该种状态值为4表示“已标记”。只要改为有意义的名称,代码就会得到相当程度的改进:
注意,代码的简洁性并未被触及。运算符和常量的数量全然保持不变,嵌套数量也全然保持不变,但代码变得明确多了。
还可以更进一步,不用int数组表示单元格,而是另写一个类。该类包括一个名副其实的函数(称为isFlagged),从而掩盖住那个魔术数[1]。于是得到函数的新版本:
只要简单改一下名称,就能轻易知道发生了什么。这就是选用好名称的力量。
— 02 —
避免误导
程序员必须避免留下掩藏代码本意的错误线索。应当避免使用与本意相悖的词,例如,hp、aix和sco都不该用作变量名,因为它们都是Unix平台或类Unix平台的专有名称。即便你是在编写三角计算程序,hp看起来是一个不错的缩写[2],但那也可能会提供错误信息。
别用accountList来指称一组账号,除非它真的是List类型。List一词对程序员有特殊意义。如果包纳账号的容器并非真是一个List,就会引起错误的判断。
所以,用accountGroup或bunchOfAccounts,甚至直接用accounts都会好一些。
提防使用外形相似度较高的名称。例如,想区分模块中某处的XYZControllerFor-EfficientHandlingOfStrings和另一处的XYZControllerForEfficientStorage-OfStrings,会花多长时间呢?这两个词的外形实在太相似了。
以同样的方式拼写出同样的概念才是信息。拼写前后不一致就是误导。我们很享受现代Java编程环境的自动代码完成特性。键入某个名称的前几个字母,按一下某个热键组合(如果有的话),就能得到一列该名称的可能形式。
假如相似的名称依字母顺序放在一起,且差异很明显,那就会相当有助益,因为程序员多半会压根不看你的详细注释,甚至不看该类的方法列表就直接看名字挑一个对象。
误导性名称真正可怕的例子,是用小写字母l和大写字母O作为变量名,尤其是在组合使用的时候。当然,问题在于它们看起来完全像是常量“壹”和“零”。
读者可能会认为这纯属虚构,但我们确曾见过充斥这类名称的代码。有一次,代码作者建议用不同字体写变量名,好显得更清楚些,但前提是这种方案得要通过口头和书面传递给未来所有的开发者才行。后来,只是做了简单的重命名操作,就解决了问题,而且也没引起别的问题。
— 03 —
做有意义的区分
如果程序员只是为满足编译器或解释器的需要而写代码,就会制造麻烦。例如,因为同一作用范围内两样不同的东西不能重名,你可能会随手改掉其中一个的名称,有时干脆以错误的拼写充数,结果就会出现在更正拼写错误后导致编译器出错的情况。
光是添加数字系列或是废话远远不够,即便这足以让编译器满意。如果名称必须相异,那么其意思也应该不同才对。
以数字系列命名(a1、a2…aN)是依义命名的对立面。这样的名称纯属误导——完全没有提供正确信息,没有提供导向作者意图的线索。试看:
如果参数名改为source和destination,这个函数就会像样许多。
废话是另一种没意义的区分。假设你有一个Product类,如果还有一个名为ProductInfo或ProductData的类,那它们的名称虽然不同,意思却无区别。Info和Data就像a、an和the一样,是意义含混的废话。
注意,只要体现出有意义的区分,使用a和the这样的前缀就没错。例如,你可能把a用在域内变量,而把the用于函数参数[5]。但如果你已经有一个名为zork的变量,又想调用一个名为theZork的变量,麻烦就来了。
废话都是冗余。variable一词永远不应当出现在变量名中。table一词永远不应当出现在表名中。NameString会比Name好吗?难道Name会是一个浮点数?如果是这样,就违反了关于误导的规则。
设想有一个名为Customer的类,还有一个名为CustomerObject的类,它们的区别何在呢?哪一个是表示客户 历史 支付情况的最佳方式?
有一个应用反映了这种状况。为当事者讳,我们改了一下,不过犯错的代码的确就是这个样子:
程序员怎么知道该调用哪个函数呢?
如果缺少明确约定,那么变量moneyAmount与money就没区别,customerInfo与customer没区别,accountData与account没区别,theMessage也与message没区别。要区分名称,就要以读者能鉴别不同之处的方式来区分。
— 04 —
使用读得出来的名称
人类长于记忆和使用单词。大脑的相当一部分就是用来容纳和处理单词的。单词能读得出来。人类的大脑中有那么大的一块地方用来处理言语,若不善加利用,实在是种耻辱。
如果名称读不出来,讨论的时候就会像个傻鸟。“哎,这儿,鼻涕阿三喜摁踢(bee cee arr three cee enn tee)[6]上头,有个皮挨死极翘(pee ess zee kyew)[7]整数,看见没?”这不是小事,因为编程本就是一种 社会 活动。
有一家公司,程序里面写了一个genymdhms(生成日期,年、月、日、时、分、秒),他们一般读作“gen why emm dee aich emm ess”[8]。我有见字照拼读的恶习,于是开口就念“gen-yah-mudda-hims”。
后来好些设计师和分析师都有样学样,听起来傻乎乎的。我们知道典故,所以会觉得很 搞笑 。 搞笑 归 搞笑 ,实际是在强忍糟糕的命名。在给新开发者解释变量名的意义时,他们总是读出傻乎乎的自造词,而非恰当的英语词。比较
现在读起来就像人话了:“喂,Mikey,看看这条记录!生成时间戳(generation timestamp)[9]被设置为明天了!不能这样吧?”
— 05 —
使用可搜索的名称
对于单字母名称和数字常量,有一个问题,就是很难在一大篇文字中找出来。
找MAX_CLASSES_PER_STUDENT很容易,但想找数字7就麻烦了,它可能是某些文件名或其他常量定义的一部分,出现在因不同意图而采用的各种表达式中。如果该常量是个长数字,又被人错改过,就会逃过搜索,从而造成错误。
同样,e也不是一个便于搜索的好变量名,它是英文中最常用的字母,在每个程序、每段代码中都有可能出现。由此而见,长名称胜于短名称,搜得到的名称胜于用自造编码代写就的名称。
窃以为单字母名称仅用于短方法中的本地变量。名称长短应与其作用域大小相对应 [N5]。若变量或常量可能在代码中多处使用,则应赋予其便于搜索的名称。再比较:
注意,上面代码中的sum并非特别有用的名称,不过至少搜得到它。采用能表达意图的名称,貌似拉长了函数代码,但要想想看,WORK_DAYS_PER_WEEK比数字5好找得多,而列表中也只剩下了体现作者意图的名称。
— 06 —
避免使用编码
编码已经太多,无谓再自找麻烦。把类型或作用域编进名称里面,徒然增加了解码的负担。没理由要求每位新人都在弄清要应付的代码之外(那算是正常的),还要再搞懂另一种编码“语言”。这对解决问题而言,纯属多余的负担。带编码的名称通常也不便发音,容易打错。
匈牙利语标记法
在往昔名称长短很重要的时代,我们毫无必要地破坏了不编码的规矩,如今后悔不迭。Fortran语言要求首字母体现出类型,导致了编码的产生。BASIC语言的早期版本只允许使用一个字母再加上一位数字。匈牙利语标记法[10](Hungarian Notation,HN)将这种态势愈演愈烈。
在Windows的C语言API的时代,HN相当重要,那时所有名称要么是一个整数句柄,要么是一个长指针或者void指针,要不然就是string的几种实现(有不同的用途和属性)之一。那时候编译器并不做类型检查,程序员需要匈牙利语标记法来帮助自己记住类型。
现代编程语言具有更丰富的类型系统,编译器也记得并强制使用类型。而且,程序员趋向于使用更小的类、更短的方法,好让每个变量的定义都在视野范围之内。
Java程序员不需要类型编码,因为对象是强类型的,代码编辑环境已经先进到在编译开始前就能监测到类型错误的程度!所以,如今HN和其他的类型编码形式都纯属多余。它们增加了修改变量、函数或类的名称或类型的难度,它们增加了阅读代码的难度,它们制造了让编码系统误导读者的可能性。
成员前缀
也不必用m_前缀来标明成员变量。应当把类和函数做得足够小,以消除对成员前缀的需要。你应当使用某种可以高亮或用颜色标出成员的编辑环境。
此外,人们会很快学会无视前缀(或后缀),而只看到名称中有意义的部分。代码读得越多,眼中就越没有前缀。最终,前缀变作了不入法眼的废料,变作了旧代码的标志物。
接口和实现
有时也会出现采用编码的特殊情形。比如,你在做一个创建形状用的抽象工厂(Abstract Factory),该工厂是一个接口,要用具体类来实现。你怎么来命名工厂和具体类呢?IShapeFactory和ShapeFactory吗?我喜欢不加修饰的接口。前导字母I被滥用到了说好听点儿是干扰,说难听点儿根本就是废话的程度。
我不想让用户知道我给他们的是接口,而就想让他们知道那是一个ShapeFactory。如果在接口和实现中必须选其一来编码的话,我宁肯选择实现。ShapeFactoryImp,甚至是丑陋的CShapeFactory,都比对接口名称编码好。
-END-
代码整洁之道
作者: [美] 罗伯特·C. 马丁(Robert C. Martin)
译者: 韩磊
内容简介:
软件质量,不但依赖架构及项目管理,而且与代码质量紧密相关。这一点,无论是敏捷开发流派还是传统开发流派,都不得不承认。
本书提出一种观点:代码质量与其整洁度成正比。干净的代码,既在质量上较为可靠,也为后期维护、升级奠定了良好基础。作为编程领域的佼佼者,本书作者给出了一系列行之有效的整洁代码操作实践。这些实践在本书中体现为一条条规则(或称“启示”),并辅以来自实际项目的正、反两面的范例。只要遵循这些规则,就能编写出干净的代码,从而有效提升代码质量。
本书阅读对象为一切有志于改善代码质量的程序员及技术经理。书中介绍的规则均来自作者多年的实践经验,涵盖从命名到重构的多个编程方面,虽为一“家”之言,然诚有可资借鉴的价值。
哪里有刘捷老师的软件架构设计、重构、编程、代码整洁之道软件代码最佳实践的培训课程?
是的,上个月我们也请过中国电子标准协会的刘捷老师进行过《代码整洁之道-态度、技艺与习惯》的两天企业内训。培训效果真是一流。
如何提升程序员的代码编写能力
一、先列三个常见的开发场景:
1、拿到一个模块详细设计文档,大部分程序员的通常做法就是开始搭建界面代码,然后从第一个按钮点击事件或页面Load事件开始写第一行业务代码。写的差不多了,就运行一下,发现哪里不是自己想的那样,就改改,直到改到是自己预想的那样。
2、做完了一个功能模块或几块相关联的功能模块,输入111asd,发现新建正常、保存正常,就提交给测试人员。测试员用测试用数据、测试场景用例来测试,发现有问题,就登记bug。对于严重的影响下一步测试的BUG,测试员就用内部IM通知这个开发人员。对于不影响继续往下测试的BUG,测试员就登记下来,等程序员有空时处理。
3、程序员一般工作不希望大家打扰,所以开发起来就是开发。等手头开发告一段落,就看看BUG库。发现有与自己有关的BUG,就从第一个BUG开始看起。就开始通过IM和测试员掰扯起来(这不是个BUG啊、业务逻辑不是你想的那样啊、我这里不能重现啊、你给的信息描述不清晰啊),于是IM几来几往,甚至跑过去当面交流一番,甚至会拉扯上产品经理一起讨论,更甚者需要项目经理或产品经理发起一个会议来集体讨论一下
这是不是很熟悉呢?这就是大部分程序员开发的三个步骤:写代码、自测、修复BUG。
二、说好的代码设计、代码测试呢?
代码设计?那不是都有开发平台么,已经固化了啊。那不是维护旧功能做完善修改呢么,又不是写新代码,只能在现有代码基础上修改啊,你又不能大幅重构。
代码测试?你丫需求讨论期、产品设计期、设计评审期那么长,都把研发项目时间占光了,就留下2个星期让我们写代码,我们哪里有时间搞那么深的测试。还想让我们搞结对编程?还想让我们搞测试驱动开发?
而且你看测试,什么功能测试、集成测试、性能测试、安全测试、安装部署测试、升级测试、迁移测试、UAT测试,一大堆测试,测试也需要很多时间。
一个项目,需求讨论、产品范围规划与评审、产品设计与设计评审占了一个半月,开发+自测就一个月,测试占了一个半月,这就4个月了啊。
三、为啥程序员写代码总是写写测测?
刚才大家也都看到了,大部分程序员都是从界面代码开始写起,而且写一写,就运行一下看看。为什么会是这种开发方式?
那是因为大部分程序员缺乏在脑子中的整体建模能力。只能做出来一点,真实的感觉一下,然后再往下。
有些是产品经理的上游就有问题,没给出业务流程图(因为产品经理也没做过业务),也没画清楚产品功能操作流程图。
为啥没给出业务流程图?因为产品经理不熟悉业务,另外,产品经理也没有流程建模能力啊。为啥没画清楚产品功能操作流程图啊?因为不会清晰表达流程啊。
很多产品经理、程序员,都缺乏分类、分层、相关、先后能力,更别说总结、洞察能力。
这是基本训练,是一个做事头脑清醒的人必备的技能,这不是一个程序员或产品经理或测试员的特定技能要求。
我经常看书就梳理书的脉络,每看一本就写一篇总结。我过去闲扯淡还梳理过水浒传、红楼梦的人物关系图呢,其实就在事事上训练自己的关联性、层次性、洞察性。
我经常面试一个人时,我会问这样的问题:“你把我刚才说的话复述一遍,另外你再回答一下我为什么会这样?”,其实,我就在看一个人的细心记忆、完整梳理、重现能力,我也在看一个人的梳理、总结、洞察能力。
我个人写代码就喜欢先理解业务流,然后理解数据表关系,然后理解产品功能操作流,大致对功能为何这样设计、功能这样操作会取什么表、插入或更新哪些表,哪些表的状态字段是关键。
然后我写代码的时候,就根据我所理解的业务流、功能操作流、数据输入输出流,定义函数,定义函数的输入与输出。
然后,我会给函数的输入值,赋上一些固定值,跑下来看看能否跑通这几个关联函数,看看还需要怎样的新增函数,或者看看函数的输入输出参数是否满足跑通。
剩下的事,就是我填肉写详细逻辑代码了。
当然,大部分人没我这样的逻辑建模能力。怎么阅读理解也想象不出来,也没法定义函数。毕竟有逻辑建模能力的程序员都很少,100个人里有10个,已经是求爷爷告奶奶好幸运了。
那怎么办呢?
我建议是分离分工配合,这就是现实中没办法的办法。让有逻辑建模能力的人来设计函数框架、来设计工具来设计代码模板,然后让没有逻辑建模能力的人来填肉写详细逻辑代码。
我们可以先从最紧要的模块开始这么做。不紧要的模块,还让它放任自流,让熟练手程序员继续涂抹。
我曾经还让有头脑的程序员做榜样,给大家分享他是怎么规划函数的,怎么做维护性代码的代码结构改善的。但是发现效果并不佳,其他人并没有因此能做代码设计。可能逻辑建模能力是个人的基本素质,是从小到大训练成型的,不是你一个大学已经几年的人能够短时间内可以训练的。
所以啊,还是让能走的人先走,让从最紧要的模块开始这么做。
不必担心这样做后,因为过去一件事被分工(一个做代码框架一个填肉)成两个人做了会降低工作效率。我们很多的工作效率低就是因为半瓶子醋搞出来的,来回反复修改。
真是应了刘德华在电影里说的那句话:说你又不听,听又听不懂,听懂了又不做,做又做不好,做不好还不服气。
四、为什么大部分程序员不做代码测试或白盒测试或单元测试呢?
还是因为没有代码设计。因为没有函数啊。所以,一个按钮功能有多复杂,代码就有多长。我见过2000行的函数,我也见过1000多行的存储过程和视图SQL。怎么做白盒测试啊,这些代码都粘在一起呢,要测,就得从头到尾都得测。
所以啊,先学会设计函数,先写好函数,这就求爷爷告奶奶了。很多开发了5年的熟练手程序员,可能都未必会写函数。
函数的输入输出值就很有讲究。很多人都写死了,随着版本迭代,发现过去定义的函数参数不够用了,于是就新增了一个参数。然后,相关性异常就爆发了,其他关联的地方忘改了,到底哪些有关联,怎么查啊,本系统没有,没准其他系统就调用你了,你根本不知道哪个神经人曾经COPY过你的代码修吧修吧就改成了他的功能呢,而且里面的很多代码他看不懂也不敢删,只要他实现的功能正常了他也不管了。于是,你改了你这个函数,他的系统就莫名出错了。
所以,我一般会定义几个对象来做参数。另外,我也很注重函数的日志、函数的异常保护、异常抛出、异常返回。另外,我也很注重参数输入值的合法性校验。
所以啊,应该开发Leader们先制定函数编写规范最佳实践,输入输出参数怎么定义比较好,函数的返回值如何定义比较好,函数的日志记录应该怎么写比较好,函数的异常保护、异常抛出、异常返回如何写比较好。先教会一般程序员,先从会写函数开始啊。
当然,你光有一份规范,程序员们还是不理解、不实际应用啊。所以,还得Leader们做好典型的代码模板,里面是符合函数规范的代码框架,只有这样,一般程序员们才会照猫画虎适应了函数设计的编程习惯。
所以啊,我专门重新定义了leader的明确职责,其中第一个重要职责就是:负责工具/框架/模板/规范的制定,并且负责推广且普及应用落地。
你不明确定义Leader的这个重要职责,你不对这个职责做明确的KPI考核,谁尿你啊。你以为好的工具/框架/模板/规范是靠人们的热情、自发产生的么?我们还没有那么自觉高尚啊。
五、为什么大部分程序员不写注释啊?
我经常说一句话,千万别多写注释。为啥?
因为我们经常遇到的问题不是没有注释,而是更糟的是,注释和事实代码逻辑是不相符的。这就出现常见问题了:残存下来的设计文档是一个逻辑、注释是一个逻辑说明、真实代码逻辑又是一个,钟表多了,你也不知道正确时间了。
所以啊,产品文档、注释、真实代码,三者总是很难一致同步。我为了几百人研发团队能做到这个同步花了大量心血和办法,但我最终也没解决了这个问题,还把Leader们、总监们、我都搞的精疲力尽。
索性回归到一切一切的本源,代码,就是程序员的唯一产出,是最有效的产出。那么,让代码写的不用注释也能看懂,咱得奔着这个目的走啊。
为啥看不懂,不就是意大利面条式代码么,又长又互相交杂。
OK,我就规定了,每个函数不能超过50行。用这一个简单规定和静态代码检查插件,来逼迫大家尝试着写函数。有的函数属于流程函数,是串起其他函数的,有的函数就是详细实现函数,实现一个且唯一一个明确作用的。
有了流程函数和功能函数,而且每个函数不超过50行,这就比过去容易看懂了。
六、为什么大部分程序员不抽象公共函数啊?
我经常说一句话:千万别抽象公共函数啊。为啥?
因为大部分程序员缺乏抽象洞察能力。特别是有些积极热情有余、爱学习爱看书、半瓶子醋晃悠的二杆子,看了几本UML、重构、设计模式、整洁代码之道,就跃跃欲试了,还真敢给你抽象公共函数了。
一开始,他觉得80%相似,20%不相似,于是在公共函数里面简单写几个if..else做个区隔就可以。没想到,越随着版本迭代,这些功能渐渐越变越不一样了,但是这个代码已经几经人手了,而且这是一个公共函数,谁也不知道牵扯多少,所以谁也不敢大改,发现问题了就加一个if..else判断。
没想到啊没想到,这个本来当初公共的函数,现在变成了系统最大的毒瘤,最复杂的地方,谁也不敢动,除非实在万不得已,手起刀落。
所以,我平时告诫程序员,纯技术的、纯通用的,你们可以尝试搞搞抽象公共函数,对于业务的,你们还是简单粗暴的根据Leader们做的代码模板代码框架,乖乖的复制、修改、填肉吧。
你们啊,先从做模板做代码片段开始吧,咱们放到咱们内部代码片段开源库里,看谁的代码片段被别人复制的多,说明你的代码抽象设计能力越好了。那时候,我就大胆放心让你撒丫子跑了。在没有学会跑之前,给老子乖乖的复制、修改、填肉吧。