任何程序員都應該保持一個良好的編碼習慣,以便于以后的維護
常見的命名方式分別有
駝峰命名法、匈牙利命名法、帕斯卡命名法和下劃線命名法,其中前三種是較為流行的命名法
int main()
{
char ch='h';
short sh=5;
int n=10;
float lf=3.14f;
double dbl=9.65000;
long l=1016;
long long ll=10647;
__int32 i32=45;
__int64 i64=8963210;
printf("ch=%c and siezof=%d\r\n", ch,sizeof(ch));
printf("sh=%d and sizeof=%d\r\n",sh,sizeof(sh));
printf("n=%d and sizeof=%d\r\n", n, sizeof(n));
printf("lf=%lf and sizeof=%d\r\n", lf, sizeof(lf));
printf("dbl=%f and sizeof=%d\r\n", dbl, sizeof(dbl));
printf("l=%d and sizeof=%d\r\n", l, sizeof(l));
printf("ll=%lld and sizeof=%d\r\n", ll, sizeof(ll));
printf("i32=%d and sizeof=%d\r\n", i32, sizeof(i32));
printf("i64=%I64d and sizeof=%d\r\n", i64, sizeof(i64));
return 0;
}
程序運行結果
printf可以留著明天學啦。
在我們平時刷題的時候,你可能會寫過很多諸如
int a,b,c
int [] arrays=new int arrays[10];
if((numbers > 10 && flag=='true') || flag=='false')
這種代碼,對于我們自己練習編程或者解決一個算法題,當然沒有問題。但是如果是在一個工程中,尤其是幾十上百人維護了幾年的工程中,還使用這種寫法,傾瀉自己天馬行空的才華,保證leader不打死你哦。
所以,對于代碼的整潔性,可讀性,自古以來就有很多大神做出過總結,比如這本《clean code》,中文名叫做《代碼整潔之道》,今天,我們就來看看吧。
命名思想
首先就是命名,命名可以說是一切程序的基礎,如果用三個字來形容那就是——“有意義”。
你要做到,當一個人看到你的命名,就知道這個變量/函數是干什么的。
來看這一段代碼:
public List<int[]> getThem() {
List<int[]> list1=new ArrayList<int[]>();
for (int[] x : theList)
if (x[0]==4)
list1.add(x);
return list1;
}
這段代碼非常簡潔,但是非常模糊,我們不知道theList到底是什么,為什么x==4作為判斷,list1又是什么?
現在我們來改一改:
public List<int[]> getFlaggedCells() {
List<int[]> flaggedCells=new ArrayList<int[]>();
for (int[] cell : gameBoard)
if (cell[STATUS_VALUE]==FLAGGED)
flaggedCells.add(cell);
return flaggedCells;
復制代碼
從上面的代碼中,我們可以馬上看出來,flaggedCells表達的是標致cell,而cell位于gameBoard中,就是一個游戲面板,只需要再通過文件名,知道這是一個【掃雷游戲】,那么cell就是每一個格子,if語句中就是判斷每一個格子是否被點擊過,如果是,就添加到flaggedCells中,我們顯然知道他想要干什么——搜集玩家點擊過的格子并返回。
但是,上面的代碼嗎使用的是 int 數組,比如int[] cell,每一個數組內部的數表示cell的狀態,可是cell并不需要那么多狀態,而且這樣導致每次使用這個狀態的時候都要重新定義數組,狀態是cell的一個屬性,所以,完全可以定義一個cell的類,將他的狀態封裝進入。
public List<Cell> getFlaggedCells() {
List<Cell> flaggedCells=new ArrayList<Cell>();
for (Cell cell : gameBoard)
if (cell.isFlagged())
flaggedCells.add(cell);
return flaggedCells;
}
這樣子很清晰看出,gameBoard由Cell組成,從gameBoard中取出標記過的cell放入flaggedCells中,這樣的代碼是不是感覺渾然天成,自然而然呢?
命名規范
通過以上事例,你應該理解在寫工程項目時,諸如數組,鏈表,字典這些底層結構應該要封裝在User,Cell,Address這種類中,使用的時候直接使用這些類即可,這是一種大局觀的思維,現在我們來做一些較為細節的落地規范。對于什么駝峰命名,匈牙利命名我相信你不會陌生,但是我在這里再強調兩個地方。
第一原則
短小
如果還有第二原則,那還是短小。
短小到什么程度,最多20~30行吧,
所以要求,一個函數,只做一件事情,
什么叫做只做一件事情呢?
就拿處理數據來說,我們說【處理用戶數據】是一件事,你也可以說是做了三件事:
當然,這個例子有點抬杠的意思,不過反映的現實是,代碼中各種邏輯往往你中有我,我中有你,到底一件事情的邊界在哪里?
這個因人而異,我只能提出書中的方法。
你可能會說,對于像if,while,switch這種語句,往往動輒十幾行,短不了啊!
首先,這個原則不是鐵律,實在太長也沒辦法。
其次,對于這些語句,完全可以講里面的邏輯做一個封裝,比如這種:
public static String renderPageWithSetupsAndTeardowns(
PageData pageData, boolean isSuite) throws Exception {
if (isTestPage(pageData))
includeSetupAndTeardownPages(pageData, isSuite);
return pageData.getHtml();
}
if 語句之后做了一件includeSetupAndTeardownPages的事情,不僅極大增強了可讀性,而且代碼短了不少。
關于參數
當你看jdk源碼或者是android源碼的時候,你會發現他們經常做調用,尤其是同名的方法重載,在看《算法》這本書的時候,也是,比如關于快速排序的:
public static void quickSort(int [] arrays){
quickSort(arrays,0,arrays.length-1);
}
private static void quickSort(int [] arrays,int left,int right){
...
}
我在一開始接觸的時候,覺得雖然好看,但未免麻煩,隨著經驗的提升,這是一種非常好的編程習慣。
首先,對于用戶來說,他想要進行快排,想傳的只有數組,左右邊界都包含進去了,你為什么要他多傳參數?同時第一個方法使用的是public,就表示這是暴露給用戶的。
其次,第二個方法在第一個方法中被調用,用private保護了起來,避免了無數麻煩。
所以,越是業務層的邏輯,越要寫參數少的代碼,如果參數必須要很多,那就用一個private的函數封裝起來,你讓用戶擁有一百個參數輸入,對他來說,那不是自由,那是災難。
蘋果和微信的使用體驗就是將這種哲學貫徹到極致的代表。
最好的注釋,就是代碼本身。
用代碼能解釋清楚的事情,盡量少用注釋,如果注釋太多,只能證明代碼寫得爛……
不過有些地方還是有必要寫代碼的。
位置
最好寫在方法頂部,不插入到實際代碼中,比如那個面試幾乎必問的String中的equals方法,源碼如下:
...
* @see #compareTo(String)
* @see #equalsIgnoreCase(String)
*/
public boolean equals(Object anObject) {
if (this==anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString=(String)anObject;
int n=length();
if (n==anotherString.length()) {
int i=0;
while (n-- !=0) {
if (charAt(i) !=anotherString.charAt(i))
return false;
i++;
}
return true;
}
}
return false;
}
警示的注釋
這里可以寫一些告誡他人的代碼,讓后來的接盤俠能夠引起重視。
//When I wrote this, only God and I understood what I was doing
//Now, God only knows
簡單說就是,下面的代碼一定有用,但是我也看不懂了,你別碰O(∩_∩)O哈哈~
在知乎上看到還有這樣的。
//如果這段報錯,你在機器上裝一個360安全衛士,相信我我
以為是開玩笑,結果裝了就真的好了。這個是前人留給我的。
//這個服務有問題的話,你可以問某某某,這段是他寫的。
這個是在我離職交接時寫的,出賣了未離職的一個同事。
//執行成功后發送一條通知短信,穩定后注釋掉
手機號是寫死的,我看到這段的時候還沒有注釋,這一年每天凌晨他都能收到短信。
這些人水平怎么樣另說,但是對于后人還是用心的。
TODO注釋
這個就不說了,很常用。
看完了有用的注釋,我們來看看沒用的注釋
多余的
// Utility method that returns when this.closed is true. Throws an exception
// if the timeout is reached.
public synchronized void waitForClose(final long timeoutMillis)
throws Exception
{
if(!closed)
{
wait(timeoutMillis);
if(!closed)
throw new Exception("MockResponseSender could not be closed");
}
}
這就是把代碼做了什么又描述一遍,沒有任何意義。
被注釋掉的代碼
InputStreamResponse response=new InputStreamResponse();
response.setBody(formatter.getResultStream(), formatter.getByteCount());
// InputStream resultsStream=formatter.getResultStream();
// StreamReader reader=new StreamReader(resultsStream);
// response.setContent(reader.read(formatter.getByteCount()));
相信很多人都有這樣的行為,在自己寫算法題的時候用來測一測沒有任何問題,但是對于后來者來說,他該怎么辦?
他一定會想:也許是有用的呢?不然為什么之前要寫。
但是他又看不懂或者覺得沒必要看,于是就留了下,然后這樣的代碼就會越來越多,最終成為傳說中的祖傳代碼。
不用心
注釋要清楚,如果注釋還要寫注釋來解釋,根本沒有意義。
比如下面這個,為什么要用200?
/*
* start with an array that is big enough to hold all the pixels
* (plus filter bytes), and an extra 200 bytes for header info
*/
this.pngBytes=new byte[((this.width + 1) * this.height * 3) + 200];
對于多數人來說,命名函數與注釋基本上就是程序的主要組成部分,能夠處理好這三樣就能寫出非常好的代碼了,當leader看到你的提交的時候,看到的是如此優雅的代碼,我想,他也會覺得是一種享受吧,就和詩歌一樣。
作者:神鷹夢澤
鏈接:https://juejin.im/post/5f14043b6fb9a07e802055ce
來源:掘金
ello,大家好,暖寶給大家帶來js新的干貨,覺得文章不錯,點擊右上角關注暖夕H2
ECMAScript是一種由Ecma國際(前身為歐洲計算機制造商協會,英文名稱是European Computer Manufacturers Association)通過ECMA-262標準化的腳本程序設計語言。這種語言在萬維網上應用廣泛,它往往被稱為JavaScript或JScript,但實際上后兩者是ECMA-262標準的實現和擴展。它是一種翻譯核心解釋器,ECMAScript實際上是一種腳本在語法和語義上的標準。
Dom文檔對象模型(Document Object Model,簡稱DOM),是W3C組織推薦的處理可擴展標志語言的標準編程接口,它是操作Html的一種能力。
Bom BOM(Browser Object Model) 是指瀏覽器對象模型。
1》未定義
2》變量定義為空
parseInt()用來轉整數,parseFloat()用來轉小數
“==”先轉換類型后比較
“===”不轉換類型,直接比較
舉例:
局部變量在定義的函數里使用,全局變量在任何地方都能夠使用
閉包:子函數可以使用父函數的局部變量
舉例:
變量的命名規則為可讀性,易看懂,規范性。
匈牙利命名法是由匈牙利程序員Charles Simonyi發明的一種編程語言中對變量進行命名的規范。基本原則是:變量名=屬性+類型+對象描述,其中每一對象的名稱都要求有明確含義,可以取對象名字全稱或名字的一部分。要基于容易記憶容易理解的原則。保證名字的連貫性是非常重要的。
舉例:表單的名稱為form,那么在匈牙利命名法中可以簡寫為frm,則當表單變量名稱為Switchboard時,變量全稱應該為 frmSwitchboard。這樣可以很容易從變量名看出Switchboard是一個表單,同樣,如果此變量類型為標簽,那么就應命名成lblSwitchboard。可以看出,匈牙利命名法非常便于記憶,而且使變量名非常清晰易懂,這樣,增強了代碼的可讀性,方便各程序員之間相互交流代碼。
好了,今天干貨到這里了,記得關注暖夕H2,更多好的技術干貨帶給你。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。