rowList = table.getRowList()
for (int j = 0; j < rowList .size(); j ++) {
...
}
}
用 tableIndex 或 tIndex 和 rowIndex 或 rIndex 去替代 i 和 j 比较好。
1.3 类和接口
无用前缀
定义接口时无需使用I来开头,去强调该类是个接口 比如 IShapeFactory,ICustomerService。可以直接就将接口定义为 ShapeFactory,CustomerService,这样做的目的用户可以直接把它们当成工厂,当成服务本身,而无需知道它仅仅是个接口。
类名使用意义明确的名词不要使用动词
用 Customer、AccountI,不用 Data 或 Info 等含糊意义的名词。
1.4 方法
做好名称区分
getAccount(); getAccounts(); getAccountInfo(); getAccount(); 接口调用者如何知道该调用哪个方法?让接口调用者尽量不用读注释就能区分出方法之间的区别。
方法名使用动词或动词短语
一个概念对应一个词
比如:fetch、retrieve 和 get 都表达取到,获取的意思,尽量统一使用一个。 又比如:我们业务端对火车票改签的命名,changeOrder、rescheduleOrder,用哪一个的都有,我在写业务的时候,不知道用那个更合适。
1.5 雷区
尽量别用【抖机灵】的词语来定义名称,否则做工作交接的时候,同事不太明白意义所在。
二、函数
2.1 短小
一个方法尽量不超过一屏幕。长最好不超过 150 个字符,行数不超过20行。
2.2 只做一件事
一个函数应该只做一件事,做好这件事,只做一件事。
2.3 每个函数一个抽象层级
函数中的语句都要在同一抽象层级上。
public CustomerInfo buildCustomerInfo() {
/* step 1: 构建基础信息 */
Address addrInfo = buildAddressInfo();
BankInfo bankInfo = buildBankInfo();
CompanyInfo companyInfo = buildCompanyInfo();
/* step 2: 构建客户信息 */
CustomerInfo customer = new CustomerInfo ();
customer.setAddress(addrInfo);
customer.setBankInfo(bankInfo);
customer.setCompanyInfo(companyInfo);
return customer;
}
private Address buildAddressInfo() {}
private BankInfo buildBankInfo() {}
private CompanyInfo buildCompanyInfo() {}
不要将构建 CustomerInfo 的所有细节全部塞入 buildCustomerInfo 方法中,因为某些细节不在同一个抽象层中。讲流程拆解为几个部分,划分为几个抽象层来表示。
2.4 向下规则
让代码拥有自顶向下的阅读顺序,让每个函数后面都跟着位于下一抽象层的函数,这样依赖,在查看函数列表时,就能循着抽象层级向下阅读了(上方的demo也可以说明)。
2.5 使用描述性的名称
别害怕长名称:
长而具有描述性的名称,要比短而令人费解的名称好
长而具有描述性的名称,要比描述性的长注释好
2.6 函数参数
函数的参数越少越好,便于单测的编写和执行。 当三个或者三个以上的函数,可以把部分参数封装成一个对象,传入方法内,或者对方法的意义重新思考,进行拆分和分层。 可变参数吧。。。能少用就少用吧,平时用的也不多。
2.7 分隔指令和询问
函数要么做什么事,要么回答什么事,两者不可兼得。 case:
public boolean set(String attr, String value);
boolean的返回值,意义为设置成功还是失败。那如何去区分“指定属性为空,所以设置失败” 还是 “摄制过程中发生某种异常,导致失败”? 调用者无法判断其含义,但我觉得还行。当然按照书中比较推荐的做法,就是将含义描述清除,如果包含多个含义的方法,可以拆解为多个方法,设置失败可以通过异常抛出来:
public boolean isAttrExists(String attr);
public void set(String attr, String value) throws Exception;
2.8 抽取 try 代码块
将 try catch 代码抽取到下级函数中:
public void delete (Page page) {
deletePageAndAllReferences(page);
}
private void deletePageAndAllReferences(Page page) throws Exception {
try {
doDeletePage(page);
} catch(Exception e) {
logger.error("delete exception", e);
}
}
catch 中尽量不要写跟业务相关的代码,同样 finally 也是。如果是回滚,那就只通过 Spring 的注解去搞,就把异常抛出去。
三、注释
注释,是为了弥补我们在用代码表达意图时遭遇的失败。 糟糕过时的注释,不如清晰准确的注释 清晰准确的注释,不如清晰准确的方法和类以及变量的定义
当然,业务代码和框架代码不太一样。有些情况,甚至大部分情况,不得不用注释去描述复杂的业务,描述业务场景,讲述业务背景和目的,当然最好这些都应该写到wiki中。
四、格式
4.1 概念间垂直方向上的区隔
在封包声明、导入声明和每个函数之间,都有空白行隔开。这样能将整个类分隔成一个个干净的方法区域,方法中也可以适当的用空行来分隔。这样可以避免整个类像一团乱麻一样展现在你的眼前。
4.2 概念相关
概念相关的代码应该放到一起,相关性越强,彼此之间的距离就该越短。这样在阅读代码的时候,方法与方法之间的调用,距离比较近,就不用上下翻飞。否则再加上逻辑的嵌套,特别容易看丢。
六、对象和数据结构
6.1 数据抽象
隐藏实现并非只是在变量之间放一个函数层那么简单。隐藏实现关乎抽象,类并不简单的用取值器和赋值器将其变量推向外间,而是暴露抽象接口,以便用户无需了解数据的实现,就可以操作数据本体。
以最好的方式,呈现某个对象包含的数据。
6.2 数据结构和对象的反对称性
过程式代码:
public class Squeare {
public Point topLeft;
public double side;
}
public class Rectangle {
public Point topLeft;
public double height;
public double width;
}
public class Circle {
public Point center;
public double radius;
}
public class Geometry {
public final double PI = 3.1415;
public double area(Object shape) throws NoSuchShapeException {
if (shape instanceof Square) {
Square s = (Square)shape;
return s.side * s.side;
}
else if (shape instanceof Rectangle) {
Rectangle r = (Rectangle) shape;
return r.height * r.width;
}
else if (shape instanceof Circle ) {
Circle c = (Circle) shape;
return PI * c.radius * c.radius;
}
}
}
过程式代码,便于在不改动既有的数据结构的前提下,添加新函数,但是难以添加新类,因为需要改动所有函数;
面向对象代码:
public class Squeare {
private Point topLeft;
private double side;
public double area() {
return side * side;
}
}
public class Rectangle {
private Point topLeft;
private double height;
private double width;
public double area() {
return height * width;
}
}
public class Circle {
private Point center;
private double radius;
public final double PI = 3.1415;
public double area() {
return PI * radius * radius;
}
}
面向对象代码,便于在不改动既有函数的前提下,添加新类;但是难以添加新函数,因为需要改动所有类。
ps:虽然书上对两种代码做了两面性分析,但是很明显,在 java 中使用面向对象比较好。
七、错误处理
7.1 给出异常发生的环境说明
抛出的异常对象,应创建信息充分的错误信息,需要包含失败的操作和失败类型,以及失败的原因。
7.2 不要在 catch 中添加业务相关的代码
7.3 别返回 null 值
比起返回 null,不如直接抛出异常。当然这里的 null 的意思是,中间出现了异常,然后返回 null。 比如:查询用户信息,未找到用户信息,此时不能返回 null,可以抛出“未找到该用户” 的异常,当然也可以返回一个空的 dto,然后 dto 中有一个 msg 中写着 “未找到该用户”。 查询列表的方法中,未查询到也可以返回一个空 List,这样至少调用方不会直接抛 NPE。
7.4 别传递 null 值
道理其实是相同的,传递 null 的最直接的影响,就是使用方可能会出现 NPE,为了避免,就必须要去加一层判断。这种判空越在上层做,越恶心。 让调用方省心一点,一些必要的判断就在下层做。
九、单元测试
9.1 整洁的测试
整洁的测试有三个要素:
和其他代码相同:明确,简介,有足够的表达力。 编写单测的三个部分:
构造测试数据
操作测试数据
检验操作是否得到期望的结果
9.2 每一个测试只有一个概念,一个断言
无需对超长的函数进行单元测试,把一个超长的测试拆成多个单一概念的单元测试。单元测试的“单元”二字,尽显其义。每个单测只负责一个单元概念的执行和验证,只有一个断言。
9.5 单测的 FIRST 原则
快速(Fast):单测需要快速的执行,快速的发现问题
独立(Independent):单测之间相互独立,不能头一个单测没通过,就导致劣一连串的失败
可重复(Repeatable):
自足验证(Self-Validating):
及时(Timely):及时对上线前的代码进行测试,以保证上线前代码质量
PS: 在我上家公司,单测的推进和保证是 RD 非常头疼的一件事情。部门提出强制要求,保证代码覆盖率在 60 以上,导致大家为了覆盖率而编写单测。一旦为了覆盖率而编写单测,单测就会变成纯粹的负担:既无法保证安全代码的上线,又占用 RD 的开发时间。
单测不应成为负担,它理应是这样的:在你代码上线之前,执行一边单测以后,你就有底气了,上线不怂了。 同时单测也能反哺你代码设计如何。如果你的方法好几百行,要编写单测非常复杂,而且执行的 case 非常多,那就说明你的方法需要进行拆解多层,每层进行独立的单测。
十、类
10.1 单一权责原则
系统应该由许多段晓得嘞而不是少量巨大的类组成。每个小类封装一个权责,只有一个修改的原因,并且与少数其他类一起写协同达成期望的系统行为。
10.2 内聚
方法操作的变量越多,就越粘聚到类上。如果一个类中的每个变量都被每个方法所使用,则该类具有最大的内聚性。
保持内聚性,就会得到许多短小的类: 有一个有许多变量的大函数,我们需要把这个函数拆解成多个小函数。拆解这个过程中,拆解后与拆解前的大函数之间,多个参数传递可能没有得到什么改变。 比如原来的大函数buildStudent的参数列表中有5个参数,拆解后buildStudent变成了buildStudent和buildStudent2,他们可能有的也需要这四5个参数。
/**
* 学生
*/
public class Student {
private String name;
private Integer age;
private String country;
private String province;
private String street;
public Student(String name, Integer age, String country, String province, String street) {
this.name = name;
this.age = age;
this.country = country;
this.province = province;
this.street = street;
}
}
此时我们不需要将方法 buildStudent 的所有参数都传递下去,我们可以将参数上升为类的成员变量,这样就无需传递任何变量,就能拆解代码了。 但是这样做也丧失了类的内聚性,因为随着大函数的拆解,变量上升为实体变量,会堆积越来越多“只为允许少量函数共享而存在的实体变量”。 此时,我们可以将这些“只为允许少量函数共享而存在的实体变量”和“使用他们的函数”(buildStudentAddr() 和 country, province, street)从原来的类中拆解出来,构成一个小类(Address)。 此处将地址信息拆解出来。
/**
* 地址
*/
public class Address {
private String country;
private String province;
private String street;
public Address(String country, String province, String street) {
this.country = country;
this.province = province;
this.street = street;
}
}
/**
* 学生
*/
public class Student {
private String name;
private Integer age;
private Address address;
public Student(String name, Integer age) {
this.name = name;
this.age = age;
}
public Student(String country, String province, String street) {
this.address = new Address(country, province, street);
}
}
将大函数拆解为许多小函数,往往也是将类拆分成多个小类的时机。 ps:举的例子不是特别贴切,仅仅是为了表达描述的意思。
你可能感兴趣的:(代码整洁之道)
《代码整洁之道》读书笔记
fsy351
java 开发语言
《代码整洁之道》读书笔记根据书名,可以知道这本书围绕“代码整洁”的思想和方法展开,但是个人认为,它不仅仅强调了代码整洁内容,更多的还包括代码测试、系统设计、并发编程的部分内容。全书共分为17个章节和2个附加章节。整本书的章节感觉编排有点杂乱,根据个人理解整理成如下结构图:概念整洁代码为何要有整洁代码?代码确然是我们最终用来表达需求的语言,代码永存糟糕的代码会毁灭一家公司PS:当前信息时代,软件是生
代码整洁之道--函数
我只是一个果壳
1、函数应该短小20行封顶最佳。代码块和缩进if语句、else语句、while语句等,其中的代码应该只有一行。2、只做一件事函数应该只做一件事,做好这件事,只做一件事。要判断函数是否只做了一件事,就是看是否能拆分出一个函数,该函数不仅只是单纯的重新诠释其实现。3、每个函数一个抽象层级遵循自顶向下读代码:向下规则我们想要让代码拥有自顶向下的阅读顺序。我们想要让每个函数后面都跟着位于下一抽象层级的函数
我的程序员读书路
weixin_30416497
c# javascript 大数据 ViewUI
CLRviaC#(第三版)你必须知道的.NET(第二版)编码:隐匿在计算机软硬件背后的语言代码整洁之道重构:改善既有代码的设计数据结构与算法:C#语言描述程序员修炼之道:从小工到专家编程珠玑(第2版)深入理解计算机系统(第2版)数据挖掘概念与技术(第2版)高效程序员的45个习惯:敏捷开发修炼之道面向对象分析与设计(第三版)深入浅出设计模式(c#/java版)代码大全第二版设计模式:可复用面向对象软
代码整洁之道 - 函数
NeXt4
快速指南以下是文中关于写好函数的几个关键点短小只做一件事每个函数一个抽象层级使用描述性的名称函数参数,不要超过3个无副作用使用异常代替返回错误码别重复自己结构化编程短小函数的第一规则是要短小。第二条规则是还要更短小。那么函数到底应该多长呢?每个函数都只说一件事。而且,每个函数都依序把你带到下一个函数。这就是函数应该达到的短小程度!只做一件事如果函数只是做了该函数名下同一抽象层上的步骤,则函数还是只
代码整洁之道【7】-- 边界
小北觅
这一章书中全是理论性的东西,再加上中文翻译肯定有词不达意的地方(并未有意冒犯译者,sry),初读起来并没有理解,遂仔细思考后又读了两遍才敢总结。作者在本章提到“边界”的概念,我个人的理解是:使用外部代码(第三方库提供的API、或者其他模块的服务)与自身项目代码结合的时候,自身项目调用外来代码以及外来代码提供的功能,这两部分代码就是边界。如果干净利落的将这些代码整合,就能保持软件边界的整洁。一、使用
<<代码整洁之道>> 总结
山钬君
按照阅读顺讯进行总结,将书中每一个章节内容进行简要总结。一命名只做有意义的命名,并且能见名知意。1.类名对象名只可使用名词或短语2.禁止在接口文件命名使用“I”作为前缀3.制定命名约定,团队中需准守4.禁止复杂的描述,精简并能完整表达意思即可二函数把一件事情拆成若干件小事,会感觉每件小事都是那么容易。1.函数入参量尽量减少2.try/catch必须与逻辑主体进行分离3.
代码整洁之道读书笔记——第十一章:系统 && 第十二章:迭进
pengboboer
代码整洁之道读书笔记 代码整洁之道 代码规范
第十一章系统复杂要人命。它消磨开发者的生命,让产品难以规划、构建和测试11.1如何建造一个城市城市能运转,还因为它演化出恰当的抽象等级和模块11.2将系统的构造和使用分开11.2.1分解main使用应该对构造过程一无所知11.2.2工厂使用抽象工厂模式构建对象11.2.3依赖注入对象不应该负责实体化对自身的依赖,它应当将这份权责移交给其它“有权利”的机制11.3扩容一开始就做对系统纯属神话。我们应
《代码整洁之道》阅读笔记——第12章:迭进
ChenEthan_
研发基础 经验分享
第12章:迭进12.1通过迭进设计达到整洁目的开发时要遵循简单设计的5条规则12.2规则1:运行所有测试全面测试并持续通过所有测试的系统就是可测试的系统。12.3规则2:重构提升内聚性,降低耦合度,切分关注面,模块化系统性关注面,缩小函数和类的尺寸,选用更好的名称等。如何理解重构?不改变软件可观察行为的前提下,改善其内部结构,以提高理解性和降低修改成本。作为开发者,应当把重构作为开发的一部分,一边
代码的整洁之道
~久违~
java 开发语言
代码整洁之道1.有意义的命名1.1介绍软件中随处可见命名。我们给变量、函数、参数、类和包命名。我们给源代码及源代码所在目录命名。这么多命名要做,不妨做好它。下文列出了取个好名字的几条简单规则。1.2名副其实,见名知意变量名太随意,haha、list1、ok、theList这些都没啥意义1.3避免误导包含List、import、java等类名、关键字或特殊字;字母o与数字0,字母l与数字1等提防使用
《代码整洁之道之程序员的职业素养》-编码
Ashley的成长之路
读万卷书 论文阅读
Tips:此文为阅读Bob大叔的《代码整洁之道》一书的摘抄小记,谨慎“食用”代码必须能够正常运行、必须能够帮你解决客户提出的问题、必须能和现有系统结合的天衣无缝且其他程序员能读懂你的代码凌晨三点写出来的代码会在未来一遍又一遍的肆虐我们奉献精神和职业素养更多意义上指要遵循纪律原则而非成为长时间工作的工作狂。确保自己已经将睡眠、健康和生活方式调整到最佳状态,这样才能做到在工作时间里全力以赴很多程序员喜
《代码整洁之道之程序员的职业素养》-验收测试&测试策略
Ashley的成长之路
读万卷书 论文阅读
Tips:此文为阅读Bob大叔的《代码整洁之道》一书的摘抄小记,谨慎“食用”一、验收测试重视沟通,专业开发人员既要做好开发也要做好沟通。“输入糟糕,输出也会糟糕”,职业程序员需要重视与团队及业务部门的沟通,确保这种沟通准确、流畅过早精细化,做业务的人和写程序的人都容易陷入一个陷阱,即过早精细化,业务还没启动项目,就要精确知道最后能得到什么;开发还没评估整个项目,就希望精确知道要交付什么,双方都贪求
《代码整洁之道之程序员的职业素养》-时间管理
Ashley的成长之路
读万卷书 论文阅读
Tips:此文为阅读Bob大叔的《代码整洁之道》一书的摘抄小记,谨慎“食用”关于会议,有两条真理:a、会议是必需的;b、会议浪费了大量的时间学会拒绝会议,受到邀请的会议没有必要全部参加,参加太多会议,只能证明你还不够专业,你应该理智使用时间,所以必须谨慎选择,应当参加哪些会议,礼貌拒绝哪些会议,邀请你参加会议的人并不负责管理你的时间,为时间负责的只有你自己,所以务必保证出席会议可以给自己目前的工作
代码整洁之道—函数
Real_man
在编程的早期,系统由程序和子程序组成,后来,在Fortran和PL/1的年代,系统由程序,子程序和函数组成。如今,只有函数存活下来。函数的规则短小函数的第一规则是要短小,第二规则还是要更短小。虽无法证实,但是经验告诉作者,函数就该短小。if,else,while语句,其中的代码块应该只有一行,该行应该是一个函数调用语句,这样不但能保持函数短小,而且块调用内的函数拥有较具说明性的名称,从而增加了文档
周记19(2.4-2.10)过年这一周
lwiscool
本周金句今天不想跑,所以才去跑,这才是长距离跑者的思维方式。——村上春树学习.成长学习记录1.读书《思维力》《写作是最好的自我投资》《超级快速阅读》《代码整洁之道》图片发自App2.自律课程复习图片发自App3.写作《一切为了她》观后感见下,普通人也有大力量4.每日行动日志打卡每天依然会打卡,虽然跟简略,习惯养成了就不能停。业精于勤荒于嬉,行成于思毁于随。古训不能忘普通人也有大力量电影《一切为了她
Python代码整洁之道:使用异常来代替无意义的返回值
白日与明月
python python 开发语言
异常是python的核心特性,使用异常需要考虑两个事情:当代码中发生任何意外的事情时,返回None或打印日志,有时候可能会隐藏bug。返回None或某些其他值,而不是引发异常,也容易导致混乱。defread_lines_for_python(filename,filetype):ifnotfilenameorfiletypenotin("txt","html"):returnNonelines=[
代码整洁之道—注释
Real_man
别给糟糕的代码加注释——重新写吧若编程语言有足够的表达力,就不那么需要注释——也许根本不需要。注释的恰当用法是弥补我们在用代码表达意图时遭遇的失败,注意,失败。注释总是一种失败,我们总找不到不用注释就能表达自我的方法,总要有注释,这并不值得庆贺。每次写注释,你都该做个鬼脸,感受自己在表达能力的失败。注释不能美化糟糕的代码,与其花时间编写解释你搞出的糟糕代码的注释,不如花时间清洁那堆糟糕的代码,写出
无论你在哪个阶段,这些书,作为程序员都值得你看
JAVA架构师的圈子
我们都想要自己的编程技能能上升到更高级别的水平,但往往不知道从何下手,本文,我将推荐6本书,无论是是什么程序员,这些书都可以让你的能力得到提升1、《代码整洁之道》这本书是我整个职业生涯中读过最好的书之一,读完本书,你会更加清楚编写干净代码的重要性,从变量命名到代码测试,本书涵盖了所有能够优化代码的所有主题。2、《Cleanarchitecture》这本书和前一本一样,是每个程序员必读,它将极大地改
《代码整洁之道》 读书笔记
SingleDigit
写在前面这本书很早就看了,但看的断断续续的。这次疫情严重,在家无聊,打游戏工作之余重新完整看一遍,算是复习吧。另外也是工作了不少时间了,也算是总结一下自己的经验吧。笔记内容第一章整洁代码书中通过各种举例,来告诉我们一件事:时时保持代码整洁。从15年年末开始做游戏客户端程序,自己写过不少烂代码,也写了些还算能看的代码。个人觉得,最最基本的就是要让自己的代码尽可能的干净——先不谈方法封装之类的问题,只
《代码整洁之道》总结和笔记
EricTao2
image前言《代码整洁之道》在业内有很高的知名度,被诸多前辈推荐给后来者阅读。本书以循序渐进改造一个小程序的方式,演示了一个程序可能的各种设计(在代码层面)。手把手教你该怎么设计代码,为何要这样设计,这样设计的好处是什么。通过一周的阅读,总结了如下要点。一函数所有的编程都是从HellWorld这个小函数开始的,学会设计函数非常重要函数要短。短才方便阅读、维护和设计。(每个人都经历过读不懂自己代码
代码整洁之道学习笔记
王乐城愚人云端
代码整洁之道读书笔记一、有意义的命名名副其实表示产品A上线时间剩余天数//差intd;//一般,但和差一样,不知道天数的作用intday;//好intremainDaysBeforeOnline;获取水果订单中所有的id为4的苹果订单//差Listlist1=newArrayList();for(int[]x:theList){if(x[0]==4){list1.add(x)}}returnlis
《代码整洁之道》读书笔记(二)
寒生1988
重构
十、类除非我们将注意力放到代码组织的更高层面,就始终不能得到整洁的代码10.1类的组织遵循标准的java公约,类应该从一组变量列表开始,如果有公共静态常量,应该先出现。然后是私有的静态变量,以及私有实体变量,很少会有公共变量。公共函数应跟着变量列表之后,我们喜欢把由某个公共函数调用的私有工具函数紧随在该公共函数后面。我们喜欢保持变量和工具函数的私有性,但不执著于此。10.2类应该短小对于函数,我们
《代码整洁之道》读书笔记(一)
寒生1988
1024程序员节
一、整洁代码什么是整洁的代码??优雅、效率整洁的代码只做好一件事减少重复代码,提高表达力、提早构建简单抽象。让营地比你来时更干净二、有意义的命名命名规则:1、名副其实变量、函数或者类的名称应该已经答复了所有的大问题。它应该告诉你,它为什么会存在,它做什么事,应该怎么用。如果名称需要注释来补充,那就不算是名副其实。2、避免误导程序员必现避免留下掩藏代码本意的错误线索。应当避免使用与本意相违背的词。提
《代码整洁之道》摘抄
trigger333
程序员 代码规范 代码整洁之道 读书笔记
《代码整洁之道:程序员的职业素养》摘抄1专业主义(开发人员应该怎么保证代码质量)专业人士,就是能对自己犯下的错误负责的人,哪怕那些错误实际上在所难免。所以,雄心勃勃的专业人士们,你们要练习的第一件事就是“道歉”。道歉是必要的,但还不够。你不能一而再、再而三地犯相同的错误。职业经验多了之后,你的失误率应该快速减少,甚至渐近于零。失误率永远不可能等于零,但你有责任让它无限接近零。发布软件时,你应该确保
个人学习书单
追风少年王大爷丶
学习
Python工匠Java核心技术卷1基础知识原书人月神话代码整洁之道ApacheSkyWalking实战
代码整洁之道
一维世界是条线
CleanCode神在细节之中整洁的代码只做好一件事如何在意代码让营地比你来时更干净简洁代码能通过所有测试没有重复代码体现系统中全部设计理念包括尽量少的实体,比如类,方法,函数等如果每个里程都让你感到深合己意,那就是整洁代码。如果代码让编程语言看起来像是专为解决那个问题而存在,就可以称之为漂亮的代码--WardCunningham有意义的命名变量名应该明确它为什么会存在,它做什么事,应该怎么用如果
c++代码整洁之道pdf_别再问如何用Python提取PDF内容了!
weixin_39976166
c++代码整洁之道pdf python提取pdf中的图片 python提取pdf图片 python提取个十百千位数字 Python识别表格图
公众号后台回复“图书“,了解更多号主新书内容作者:陈熹来源:早起Python导读大家好,在之前的办公自动化系列文章中我们已经详细介绍了如何使用Python批量处理PDF文件,包括合并、拆分、水印、加密等操作。今天我们再次回到PDF,详细讲解如何使用Python从PDF提取指定的信息。我们将以一份年度报告PDF为例进行介绍,内含大量文字、表格、图片,具体如下模块安装首先需要安装两个模块,第一个是pd
对象和数据结构
李海成
数据结构
文章目录前言一、从链式调用说起二、数据抽象三、数据、对象的反对称性四、得墨忒尔律五、数据传送对象总结前言代码整洁之道读书随笔,第六章一、从链式调用说起面向对象语言中常用的一种调用形式,链式调用,是一种较受推崇的编码风格,如果你调用一个实例的方法,修改了实例的状态,后续需要调用其他方法,进一步改变实例的状态,那么不需要每次都用变量接收返回值,直接链式调用即可。例如gorm的更新可以这样实现。resu
[译] ROS C++ 代码规范
Corsair_cxs
C++ ROS c++ linux ROS代码规范
内容说明:文章内容翻译自ROSWiki,也引用了部分《代码整洁之道》书中的内容。ROSC++代码规范与谷歌C++代码规范有诸多相似之处,本文主要讲述在编写ROSC++代码时需要遵守的编程规范。无论是ROS官方代码还是用户自定义代码,该规范都适用。感谢ROSwiki提供的资料,由于译者个人水平有限,文中难免有错误出现。如有发现,请及时与我联系,感激不尽!!文章目录前言什么是整洁代码1.代码规范的重要
javascript编程风格指南
少年民仔
javascript javascript 优化 代码风格 规范
本文为转载文章,原文地址:javascript编程风格指南介绍作者根据RobertC.Martin《代码整洁之道》总结了适用于JavaScript的软件工程原则《CleanCodeJavaScript》。本文是对其的翻译。不必严格遵守本文的所有原则,有时少遵守一些效果可能会更好,具体应根据实际情况决定。这是根据《代码整洁之道》作者多年经验整理的代码优化建议,但也仅仅只是一份建议。软件工程已经发展了
JavaScript 风格指南
风神.NET
Javascript设计模式
介绍作者根据RobertC.Martin《代码整洁之道》总结了适用于JavaScript的软件工程原则《CleanCodeJavaScript》。本文是对其的翻译。不必严格遵守本文的所有原则,有时少遵守一些效果可能会更好,具体应根据实际情况决定。这是根据《代码整洁之道》作者多年经验整理的代码优化建议,但也仅仅只是一份建议。软件工程已经发展了50多年,至今仍在不断前进。现在,把这些原则当作试金石,尝
jquery实现的jsonp掉java后台
知了ing
java jsonp jquery
什么是JSONP?
先说说JSONP是怎么产生的:
其实网上关于JSONP的讲解有很多,但却千篇一律,而且云里雾里,对于很多刚接触的人来讲理解起来有些困难,小可不才,试着用自己的方式来阐释一下这个问题,看看是否有帮助。
1、一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面、动态网页、web服务、WCF,只要是跨域请求,一律不准;
2、
Struts2学习笔记
caoyong
struts2
SSH : Spring + Struts2 + Hibernate
三层架构(表示层,业务逻辑层,数据访问层) MVC模式 (Model View Controller)
分层原则:单向依赖,接口耦合
1、Struts2 = Struts + Webwork
2、搭建struts2开发环境
a>、到www.apac
SpringMVC学习之后台往前台传值方法
满城风雨近重阳
springMVC
springMVC控制器往前台传值的方法有以下几种:
1.ModelAndView
通过往ModelAndView中存放viewName:目标地址和attribute参数来实现传参:
ModelAndView mv=new ModelAndView();
mv.setViewName="success
WebService存在的必要性?
一炮送你回车库
webservice
做Java的经常在选择Webservice框架上徘徊很久,Axis Xfire Axis2 CXF ,他们只有一个功能,发布HTTP服务然后用XML做数据传输。
是的,他们就做了两个功能,发布一个http服务让客户端或者浏览器连接,接收xml参数并发送xml结果。
当在不同的平台间传输数据时,就需要一个都能解析的数据格式。
但是为什么要使用xml呢?不能使json或者其他通用数据
js年份下拉框
3213213333332132
java web ee
<div id="divValue">test...</div>测试
//年份
<select id="year"></select>
<script type="text/javascript">
window.onload =
简单链式调用的实现技术
归来朝歌
方法调用 链式反应 编程思想
在编程中,我们可以经常遇到这样一种场景:一个实例不断调用它自身的方法,像一条链条一样进行调用
这样的调用你可能在Ajax中,在页面中添加标签:
$("<p>").append($("<span>").text(list[i].name)).appendTo("#result");
也可能在HQ
JAVA调用.net 发布的webservice 接口
darkranger
webservice
/**
* @Title: callInvoke
* @Description: TODO(调用接口公共方法)
* @param @param url 地址
* @param @param method 方法
* @param @param pama 参数
* @param @return
* @param @throws BusinessException
Javascript模糊查找 | 第一章 循环不能不重视。
aijuans
Way
最近受我的朋友委托用js+HTML做一个像手册一样的程序,里面要有可展开的大纲,模糊查找等功能。我这个人说实在的懒,本来是不愿意的,但想起了父亲以前教我要给朋友搞好关系,再加上这也可以巩固自己的js技术,于是就开始开发这个程序,没想到却出了点小问题,我做的查找只能绝对查找。具体的js代码如下:
function search(){
var arr=new Array("my
狼和羊,该怎么抉择
atongyeye
工作
狼和羊,该怎么抉择
在做一个链家的小项目,只有我和另外一个同事两个人负责,各负责一部分接口,我的接口写完,并全部测联调试通过。所以工作就剩下一下细枝末节的,工作就轻松很多。每天会帮另一个同事测试一些功能点,协助他完成一些业务型不强的工作。
今天早上到公司没多久,领导就在QQ上给我发信息,让我多协助同事测试,让我积极主动些,有点责任心等等,我听了这话,心里面立马凉半截,首先一个领导轻易说
读取android系统的联系人拨号
百合不是茶
android sqlite数据库 内容提供者 系统服务的使用
联系人的姓名和号码是保存在不同的表中,不要一下子把号码查询来,我开始就是把姓名和电话同时查询出来的,导致系统非常的慢
关键代码:
1, 使用javabean操作存储读取到的数据
package com.example.bean;
/**
*
* @author Admini
ORACLE自定义异常
bijian1013
数据库 自定义异常
实例:
CREATE OR REPLACE PROCEDURE test_Exception
(
ParameterA IN varchar2,
ParameterB IN varchar2,
ErrorCode OUT varchar2 --返回值,错误编码
)
AS
/*以下是一些变量的定义*/
V1 NUMBER;
V2 nvarc
查看端号使用情况
征客丶
windows
一、查看端口
在windows命令行窗口下执行:
>netstat -aon|findstr "8080"
显示结果:
TCP 127.0.0.1:80 0.0.0.0:0 &
【Spark二十】运行Spark Streaming的NetworkWordCount实例
bit1129
wordcount
Spark Streaming简介
NetworkWordCount代码
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
Struts2 与 SpringMVC的比较
BlueSkator
struts2 spring mvc
1. 机制:spring mvc的入口是servlet,而struts2是filter,这样就导致了二者的机制不同。 2. 性能:spring会稍微比struts快。spring mvc是基于方法的设计,而sturts是基于类,每次发一次请求都会实例一个action,每个action都会被注入属性,而spring基于方法,粒度更细,但要小心把握像在servlet控制数据一样。spring
Hibernate在更新时,是可以不用session的update方法的(转帖)
BreakingBad
Hibernate update
地址:http://blog.csdn.net/plpblue/article/details/9304459
public void synDevNameWithItil()
{Session session = null;Transaction tr = null;try{session = HibernateUtil.getSession();tr = session.beginTran
读《研磨设计模式》-代码笔记-观察者模式
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
/**
* “观
重置MySQL密码
chenhbc
mysql 重置密码 忘记密码
如果你也像我这么健忘,把MySQL的密码搞忘记了,经过下面几个步骤就可以重置了(以Windows为例,Linux/Unix类似):
1、关闭MySQL服务
2、打开CMD,进入MySQL安装目录的bin目录下,以跳过权限检查的方式启动MySQL
mysqld --skip-grant-tables
3、新开一个CMD窗口,进入MySQL
mysql -uroot
 
再谈系统论,控制论和信息论
comsci
设计模式 生物 能源 企业应用 领域模型
再谈系统论,控制论和信息论
偶然看
oracle moving window size与 AWR retention period关系
daizj
oracle
转自: http://tomszrp.itpub.net/post/11835/494147
晚上在做11gR1的一个awrrpt报告时,顺便想调整一下AWR snapshot的保留时间,结果遇到了ORA-13541这样的错误.下面是这个问题的发生和解决过程.
SQL> select * from v$version;
BANNER
-------------------
Python版B树
dieslrae
python
话说以前的树都用java写的,最近发现python有点生疏了,于是用python写了个B树实现,B树在索引领域用得还是蛮多了,如果没记错mysql的默认索引好像就是B树...
首先是数据实体对象,很简单,只存放key,value
class Entity(object):
'''数据实体'''
def __init__(self,key,value)
C语言冒泡排序
dcj3sjt126com
算法
代码示例:
# include <stdio.h>
//冒泡排序
void sort(int * a, int len)
{
int i, j, t;
for (i=0; i<len-1; i++)
{
for (j=0; j<len-1-i; j++)
{
if (a[j] > a[j+1]) // >表示升序
自定义导航栏样式
dcj3sjt126com
自定义
-(void)setupAppAppearance
{
[[UILabel appearance] setFont:[UIFont fontWithName:@"FZLTHK—GBK1-0" size:20]];
[UIButton appearance].titleLabel.font =[UIFont fontWithName:@"FZLTH
11.性能优化-优化-JVM参数总结
frank1234
jvm参数 性能优化
1.堆
-Xms --初始堆大小
-Xmx --最大堆大小
-Xmn --新生代大小
-Xss --线程栈大小
-XX:PermSize --永久代初始大小
-XX:MaxPermSize --永久代最大值
-XX:SurvivorRatio --新生代和suvivor比例,默认为8
-XX:TargetSurvivorRatio --survivor可使用
nginx日志分割 for linux
HarborChung
nginx linux 脚本
nginx日志分割 for linux 默认情况下,nginx是不分割访问日志的,久而久之,网站的日志文件将会越来越大,占用空间不说,如果有问题要查看网站的日志的话,庞大的文件也将很难打开,于是便有了下面的脚本 使用方法,先将以下脚本保存为 cutlog.sh,放在/root 目录下,然后给予此脚本执行的权限
复制代码代码如下:
chmo
Spring4新特性——泛型限定式依赖注入
jinnianshilongnian
spring spring4 泛型式依赖注入
Spring4新特性——泛型限定式依赖注入
Spring4新特性——核心容器的其他改进
Spring4新特性——Web开发的增强
Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC
Spring4新特性——Groovy Bean定义DSL
Spring4新特性——更好的Java泛型操作API
Spring4新
centOS安装GCC和G++
liuxihope
centos gcc
Centos支持yum安装,安装软件一般格式为yum install .......,注意安装时要先成为root用户。
按照这个思路,我想安装过程如下:
安装gcc:yum install gcc
安装g++: yum install g++
实际操作过程发现,只能有gcc安装成功,而g++安装失败,提示g++ command not found。上网查了一下,正确安装应该
第13章 Ajax进阶(上)
onestopweb
Ajax
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/
How to determine BusinessObjects service pack and fix pack
blueoxygen
BO
http://bukhantsov.org/2011/08/how-to-determine-businessobjects-service-pack-and-fix-pack/
The table below is helpful. Reference
BOE XI 3.x
12.0.0.
y BOE XI 3.0 12.0.
x.
y BO
Oracle里的自增字段设置
tomcat_oracle
oracle
大家都知道吧,这很坑,尤其是用惯了mysql里的自增字段设置,结果oracle里面没有的。oh,no 我用的是12c版本的,它有一个新特性,可以这样设置自增序列,在创建表是,把id设置为自增序列
create table t
(
id number generated by default as identity (start with 1 increment b
Spring Security(01)——初体验
yang_winnie
spring Security
Spring Security(01)——初体验
博客分类: spring Security
Spring Security入门安全认证
首先我们为Spring Security专门建立一个Spring的配置文件,该文件就专门用来作为Spring Security的配置