1、有意义,名副其实:降低代码的模糊度,明确说明代码的用途;
函数:
①询问关于参数的问题(判断),②转换参数的内容(要有返回值),③参数是个事件(无返回值)
注释:
1、
2、
3、
4、
5、
6、
7、
格式:
1、
2、
3、
4、
5、
6、
7、
8、
9、
对象和数据结构(过程式代码):
隐藏实现关乎抽象,并不是简单的添加取值器和赋值器;
1、
过程式代码便于在不改变既有代码的同时,添加新的函数(过程);
面向对象便于在不改变既有函数的情况下,添加新的类(对象),但是如果抽象类添加新的函数,就需要修改抽象类的所有子类;
2、
3、
数据结构暴露数据,没有明显的行为;便于向既有数据结构添加新行为,同时也难以向既有函数添加新数据结构。
错误的处理:
1、
解决:抛出异常或者返回特例对象;
2、
3、
4、
保持边界整洁:(电子书缺失)
1、
2、
更多设计模式:http://blog.youkuaiyun.com/qinysong/archive/2006/08/09/1041818.aspx
单元测试:
2、整洁测试的标准:可读性;
3、双重标准:由于运行环境的差异,测试代码和生产代码可以有不同的标准,如效率、内存等;
4、单个测试的断言数量应该最小化,只测试一个概念;
5、F.I.R.S.T规则:
F fast:测试需要频繁运行,因此要能快速运行;
I Independent:测试应该相互独立;
R Repeatable:测试应当能在任何环境中重复;
S Self-validating:自足验证,测试应该能看到成功与否的结果;
T timely:测试应该及时编写,应该恰好在生产代码之前编写;
类:
1、类的组织:自顶向下原则,变量列表(公共先于私有,静态先于实体),方法列表(工具方法紧跟在所属方法之后);
2、类应该短小:类名越明确,类的职责就越清晰;
(1)每个类单一权责,只有一个修改它的原因,并与少量的其他类协同完成工作;
(2)内聚:类中含有最少的变量,且每个方法都使用每个变量,此时内聚度最高,类应该是内聚高的;
3、隔离修改:具体类实现细节,抽象类只呈现概念,利用接口和抽象类可以隔离因为细节的改变而带来的改变类的风险;
系统:
1、构造与应用代码应该隔离开:就好像建设大楼时,构建大楼的吊车、铲车之类的东西,在大楼投入使用时已经完全不存在一样;软件系统应该讲启动过程和启动过程之后的运行时逻辑分开,在启动过程中创建应用对象,也会存在相互的依赖。
public Service getService(){
return new MyServiceIml(...);
}
这种延迟化赋值的好处是:在使用对象之前不用关心这种架空构造;坏处是:必须实现这个构造方法,不然无法编译,即使这个对象在运行时永远不会被使用。
解决方法:
(1)分解main,将系统中的全部构造过程搬迁到main或者main模块中:main函数创建对象,再将对象传递给应用,应用直接使用;
(2)工厂,可以让应用控制实体创建的时机;
(3)依赖注入,控制反转IoC是依赖管理的手段,它将应用需要的依赖对象的创建权责从对象中拿出来,放在一个专注于此事的对象中,并通过依赖注入(赋值器)将依赖对象传递给应用;
2、扩容
AOP,面向方面变成。Java中三种方面和类似方面的机制:代理,纯AOP框架,AspectJ
(1)Java代理:Proxy.newInstance(被代理接口,InvocationHandler h)方法执行后,被代理类的所有方法都会被加上Handler的处理逻辑,这是简单的AOP,但是太复杂;
(2)纯AOP框架:Spring AOP(需进一步了解)
(3)AspectJ语言
最佳的系统架构由模块化的关注面领域组成,每个关注面均用纯Java对象实现。不同的领域之间用最不具有侵害性的方面或类方面工具整合起来。这种架构能测试驱动,就像代码一样。