就從這小小系統的範例練習, 開始說起吧. 7年過去了, 在資訊系統架構上又經歷了一大段的洗禮, 最終我又回到了當初最看重的RDBMS中的預儲程序(PL).
進貨算為了確保進貨的交易事務性, 不知不覺就寫了快10支的PL和報表(SQL-Views), 從進貨, 進貨作廢, 進貨退出, 進貨退出作廢, 以上行為又要即時重新計算進貨庫存量, 確實花了點時間構思. 以後再慢慢整理故事, 在這先備忘用. (也當成初用這Blog新介面的上手練習.)
@interface).java。Tip: 在使用Unicode轉義符或是一些實際的Unicode字符時,建議做些註釋給出解釋,這有助於別人閱讀和理解。
String unitAbbrev = "μs"; | 贊,即使沒有註釋也非常清晰
String unitAbbrev = "\u03bcs"; // "μs" | 允許,但沒有理由要這樣做
String unitAbbrev = "\u03bcs"; // Greek letter mu, "s" | 允許,但這樣做顯得笨拙還容易出錯
String unitAbbrev = "\u03bcs"; | 很糟,讀者根本看不出這是什麼
return '\ufeff' + content; // byte order mark | Good,對於非印表字符,使用轉義,並在必要時寫上註釋
Tip: 永遠不要由於害怕某些程序可能無法正確處理非ASCII字符而讓你的程式碼可讀性變差。當程序無法正確處理非ASCII字符時,它自然無法正確運行, 你就會去fix這些問題的了。(言下之意就是大膽去用非ASCII字符,如果真的有需要的話)
import java.util.*;com.google imports(僅當這個原始檔案是在com.google包下)java importsjavax imports.java後綴)。package-info.java,該文件中可沒有package-info類。if, else, for, do, while語句一起使用,即使只有一條語句(或是空),也應該把大括號寫上。return new MyClass() {
@Override public void method() {
if (condition()) {
try {
something();
} catch (ProblemException e) {
recover();
}
}
}
};
{},不需要換行。例外:如果它是一個多塊語句的一部分(if/else 或 try/catch/finally) ,即使大括號內沒內容,右大括號也要換行。void doNothing() {}
package和import語句(見3.2節和3.3節)。Tip: 提取方法或區域變數可以在不換行的情況下解決程式碼過長的問題(是合理縮短命名長度吧)
非賦值運算符處斷開,那麼在該符號前斷開(比如+,它將位於下一行)。注意:這一點與Google其它語言的程式設計風格不同(如C++和JavaScript)。 這條規則也適用於以下「類運算符」符號:點分隔符(.),類型界限中的&(),catch塊中的管道符號(catch (FooException | BarException e)賦值運算符處斷開,通常的做法是在該符號後斷開(比如=,它與前面的內容留在同一行)。這條規則也適用於foreach語句中的分號。()(如if, for catch等)。})(如else, catch)。{),兩個例外:@SomeAnnotation({a, b})(不使用空格)。String[][] x = foo;(大括號間沒有空格,見下面的Note)。)。catch (FooException | BarException e)。foreach語句中的分號。, : ;及右括號())後new int[] {5, 6}和new int[] { 5, 6 }都是可以的。Note:這個規則並不要求或禁止一行的開關或結尾需要額外的空格,只對內部空格做要求。
private int x; // this is fine
private Color color; // this too
private int x; // permitted, but future edits
private Color color; // may leave it unaligned
Tip:對齊可增加程式碼可讀性,但它為日後的維護帶來問題。考慮未來某個時候,我們需要修改一堆對齊的程式碼中的一行。 這可能導致原本很漂亮的對齊程式碼變得錯位。很可能它會提示你調整週圍程式碼的空白來使這一堆程式碼重新水平對齊(比如程式員想保持這種水平對齊的風格), 這就會讓你做許多的無用功,增加了reviewer的工作並且可能導致更多的合併衝突。
private enum Suit { CLUBS, HEARTS, SPADES, DIAMONDS }
int a, b;。new int[] {
0, 1, 2, 3
}
new int[] {
0,
1,
2,
3
}
new int[] {
0, 1,
2, 3
}
new int[]
{0, 1, 2, 3}
String[] args, 而非String args[]。case FOO:或default:),後面跟著一條或多條語句。break, continue, return或拋出異常來終止,要麼通過一條註釋來說明程序將繼續執行到下一個語句組, 任何能表達這個意思的註釋都是OK的(典型的是用// fall through)。這個特殊的註釋並不需要在最後一個語句組(一般是default)中出現。示例:switch (input) {
case 1:
case 2:
prepareOneOrTwo();
// fall through
case 3:
handleOneTwoOrThree();
break;
default:
handleLargeNumber(input);
}
default語句組,即使它什麼程式碼也不包含。@Override
@Nullable
public String getNameIfPresent() { ... }
@Override public int hashCode() { ... }
@Partial @Mock DataLoader loader;
/* ... */風格,也可以是// ...風格。對於多行的/* ... */註釋,後續行必須從*開始, 並且與前一行的*對齊。以下示例註釋都是OK的。/*
* This is // And so /* Or you can
* okay. // is this. * even do this. */
*/
Tip:在寫多行註釋時,如果你希望在必要時能重新換行(即註釋像段落風格一樣),那麼使用/* ... */。
public protected private abstract static final transient volatile synchronized native strictfp
\w+。name_, mName, s_name和kName,在Java程式設計風格中都不再使用。UpperCamelCase風格編寫。Test結束。例如,HashTest或HashIntegrationTest。lowerCamelCase風格編寫。test_ ,例如testPop_emptyStack。 並不存在唯一正確的方式來命名測試方法。CONSTANT_CASE,全部字母大寫,用下劃線分隔單詞。那,到底什麼算是一個常數?打算改變物件一般是不夠的,它要真的一直不變才能將它示為常數。// Constants
static final int NUMBER = 5;
static final ImmutableList<String> NAMES = ImmutableList.of("Ed", "Ann");
static final Joiner COMMA_JOINER = Joiner.on(','); // because Joiner is immutable
static final SomeMutableType[] EMPTY_ARRAY = {};
enum SomeEnum { ENUM_CONSTANT }
// Not constants
static String nonFinal = "non-final";
final String nonStatic = "non-static";
static final Set<String> mutableCollection = new HashSet<String>();
static final ImmutableSet<SomeMutableType> mutableElements = ImmutableSet.of(mutable);
static final Logger logger = Logger.getLogger(MyClass.getName());
static final String[] nonEmptyArray = {"these", "can", "change"};
lowerCamelCase風格編寫。lowerCamelCase風格編寫。lowerCamelCase風格編寫,比起其它類型的名稱,區域變數名可以有更為寬鬆的縮寫。UpperCamelCase)和小駝峰式命名法(lowerCamelCase)。 有時,我們有不只一種合理的方式將一個英語詞組轉換成駝峰形式,如縮略語或不尋常的結構(例如"IPv6"或"iOS")。Google指定了以下的轉換方案。散文形式(prose form)開始:Prose form Correct Incorrect
------------------------------------------------------------------
"XML HTTP request" XmlHttpRequest XMLHTTPRequest
"new customer ID" newCustomerId newCustomerID
"inner stopwatch" innerStopwatch innerStopWatch
"supports IPv6 on iOS?" supportsIpv6OnIos supportsIPv6OnIOS
"YouTube importer" YouTubeImporter
YoutubeImporter*
Note:在英語中,某些帶有連字符的單詞形式不唯一。例如:"nonempty"和"non-empty"都是正確的,因此方法名checkNonempty和checkNonEmpty也都是正確的。
@Override註解給用上。AssertionError重新拋出。)try {
int i = Integer.parseInt(response);
return handleNumericResponse(i);
} catch (NumberFormatException ok) {
// it's not numeric; that's fine, just continue
}
return handleTextResponse(response);
expected,則它可以被不加註釋地忽略。下面是一種非常常見的情形,用以確保所測試的方法會拋出一個期望中的異常, 因此在這裡就沒有必要加註釋。try {
emptyStack.pop();
fail();
} catch (NoSuchElementException expected) {
}
Foo aFoo = ...;
Foo.aStaticMethod(); // good
aFoo.aStaticMethod(); // bad
somethingThatYieldsAFoo().aStaticMethod(); // very bad
Object.finalize。Tip:不要使用finalize。如果你非要使用它,請先仔細閱讀和理解Effective Java第7條款:「Avoid Finalizers」,然後不要使用它。
/**
* Multiple lines of Javadoc text are written here,
* wrapped normally...
*/
public int method(String p1) { ... }
/** An especially short bit of Javadoc. */
<p>,並且它和第一個單詞間沒有空格。@param, @return, @throws, @deprecated, 前面這4種標記如果出現,描述都不能為空。 當描述無法在一行中容納,連續行需要至少再縮進4個空格。A {@code Foo} is a...或This method returns...開頭, 它也不會是一個完整的祈使句,如Save the record...。然而,由於開頭大寫及被加了標點,它看起來就像是個完整的句子。Tip:一個常見的錯誤是把簡單的Javadoc寫成/** @return the customer ID */,這是不正確的。它應該寫成/** Returns the customer ID. */。
getFoo,Javadoc是可選的(即,是可以不寫的)。這種情況下除了寫「Returns the foo」,確實也沒有什麼值得寫了。Tip:如果有一些相關資訊是需要讀者瞭解的,那麼以上的例外不應作為忽視這些資訊的理由。例如,對於方法名getCanonicalName, 就不應該忽視文檔說明,因為讀者很可能不知道詞語canonical name指的是什麼。