1 整潔代碼
代碼邏輯直截了當;儘量減少依賴關係;依據某種分層戰略完善錯誤處理代碼;性能達到最優;
2 有意義的命名
1)名副其實;2)避免誤導;3)做有意義的區分;4)方法名應該是動詞,如deletePage或者save
3 函數
函數應該儘量短小;它應該只做一件事,做好一件事;
每個函數一個抽象層次:自頂向下讀代碼。每個函數都跟着位於下一個抽象級的函數。
使用描述性的名稱;
抽離try/catch代碼塊:
public void delete(Page page)
{
try
{
deletePageAndAllReferences(page);
}catch(Exception e){}
}
private void deletePageAndAllRefernces() throws Exceptions{
deletePage(page);
registry.deleteReference(page.name);
}
delete函數只處理異常,deletePageAndAllRefernces函數只完全刪除一個page有關。
減少函數代碼的重複。
4 註釋
法律信息;提供信息的註釋;對意圖的解釋;TODO註釋用來保存程序員應該做但是某些原因還沒做的事情。
5 格式
1)概念間垂直方向上的區隔,緊密概念垂直方向靠近。
2)變量聲明儘量靠近使用位置。
3)相關函數應該放在一起。
4)概念相關的代碼應該放在一起。
6 對象和數據結構
1)數據抽象
隱藏實現並非只是在變量之間放上一個函數層那麼簡單。隱藏實現關乎抽象。類並不簡單的取值器和賦值器將其變量推向外間,而是暴露抽象接口。以便用戶無需瞭解數據的實現就能操作數據本體。
具象機動車
public interface Vehicle{
double getFuelTankCapacityInGallons();
double getGallonsofGas();
}
抽象機動車
public interface vehicle{
double getPercentFuelRemianing(){}
}
2)數據,對象的反對稱性
對象把數據隱藏在抽象之後,曝露操作數據的函數;數據結構曝露其數據,沒有提供有意義的函數。Geometry操作形狀類,形狀類都是簡單的數據結構,沒有任何行爲。
過程式形狀代碼
public class Squire
{
public Point topLeft;
public double side;
};
public class Geometry
{
public final double PI=3.14;
public double area(object shape) throws NoSuchShapeException{
if(shape instaceof Squire){
Squire s=(Squire) shape;
return s.side*s.side
}
...
}
};
面向對象的方案
public class Squire implements Shape
{
private Point topLeft;
private double side;
public double area(){
return side*side;
}
};
過程式代碼(使用數據結構的代碼)便於在不改動既有數據結構的前提下添加新函數。面向對象代碼便於在不改動既有函數的前提下添加新類。
3)the Law of Demeter
方法不應該調用任何函數返回的對象的方法。但是類只是數據結構,沒有任何行爲,該定律不再適用。
10 類
1)公共靜態變量應該先出現,其次是私有靜態變量,以及私有實體變量。
2)單一權責原則(SRP)
3)大函數拆分成小函數,據此將類拆分成小類。
4)爲了修改而組織。
一組必須打開修改的類
public class Sql
{
public Sql();
public string create()
public string selectALl()
};
一組封閉類
abstarct public class Sql
{
public Sql(){}
abstract public String generate();
};
public class CreateSql extends Sql
{
public CreateSql();
@override public String generate()
};
11 系統
IOC實現分離構造和使用。Spring 框架提供了最有名的Java DI容器。用戶在XML配置文件中定義相互關聯的對象,然後Java代碼請求特定的對象。