青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

【設(shè)計實踐】The Practice of Programming 01

The Practice of Programming - Chapter 1 Style

1.1  Names

       A name should be informative, concise, memorable, and pronounceable if possible.

   

* Use descriptive names for globals, short names for locals.

Global variables need names long enough and descriptive enough to remind the reader of their meaning.

It's also helpful to include a brief comment with the declaration of each global.

The longer the program, the more important is the choice of good, descriptive, systematic names.

* Be consistent.

Give related things related names that show their relationship and high-light their difference.

* Use active names for functions.

* Be accurate.

   

1.2 Expressions and Statements

   

* Indent to show structure.

A consistent indentation style is the lowest-energy way to make a program's structure self-evident.

* Use the natural form of expressions.

Write expressions as you might speak them aloud.

* Parenthesize to resolve ambiguity.

* Break up complex expressions.

* Be clear.

the goal is to write clear code, not clever code.

* Be careful with side effects.

   

1.3 Consistency and Idioms

* Use a consistent indentation and brace style.

* Use idioms for consistency.

A central part of learning any language is developing a familiarity with its idioms.

* Use else-ifs for multi-way decisions.

   

1.4 Function Macros

* Avoid function macros.

* Parenthesize the macro body and arguments.

In C++, inline functions avoid the syntactic trouble while offering whatever performance advantage macros might provide.

They are appropriate for short functions that set or retrieve a single value.

   

1.5 Magic Numbers

Magic numbers are the constants, array sizes, character positions, conversion factors, and other literal numric values that appear in programs.

   

* Given names to magic numbers.

* Define numbers as constants, not macros.

The C preprocessor is a powerful but blunt tool, however, and macros are a dangerous way to program because they change the lexical structure of the program underfoot. Let the language proper do the work.

* Use character constants, not integers.

* Use the language to calculate the size of an object.

   

1.6 Comments

* Don't belabor the obvious.

* Comment functions and global data.

* Don't comment bad code, rewrite it.

* Don't contradict the code.

* Clarify,don't confuse.

   

1.7 Why bother?

The main concerns of programming style: descriptive names, clearity in expressions, straightforward control flow, readability of code and comments, and the importance of consistence use of conventions and idioms in achieving all of these.

Well-written code is easier to read and to understand, almost surely has fewer errors, and is likely to be smaller than code that has been carelessly tossed together and never polished.

The key observation is that good style should be a matter of habit.

Once they become automatic, your subconscious will take care of many of the details for you, and even the code you produce under pressure will be better.

   

   

程序設(shè)計實踐 - 第1章

1. 風格

1.1 名字

一個名字應(yīng)該是非形式的、簡練的、容易記憶的,如果可能的話,最好是能夠拼讀的。

* 全局變量使用具有說明性的名字,局部變量用短名字。

全局變量的名字應(yīng)該足夠長,具有足夠的說明性。給每個全局變量聲明附一個簡短注釋也非常有幫助。

對于長的程序,選擇那些好的、具有說明性的、系統(tǒng)化的名字就更加重要。

* 保持一致性。

* 函數(shù)采用動作性名字。

* 要準確。名字與其實現(xiàn)保持準確的對應(yīng)。

   

1.2 表達式和語句

* 用縮行顯示程序的結(jié)構(gòu)。

采用一種一致的縮行風格,是使程序呈現(xiàn)出結(jié)構(gòu)清晰的最省力的方法。

* 使用表達式的自然形式。

表達式應(yīng)該寫得你能大聲念出來。

* 用加括號的方式排除二義性。

* 分解復(fù)雜的表達式。

* 要清晰。

目標應(yīng)該是寫出最清晰的代碼,而不是最巧妙的代碼。

* 小心副作用。

++這一類運算符具有副作用,它們除了返回一個值外,還將隱含地改變變量的值。

   

1.3 一致性和習慣用法

* 使用一致的縮排和加括號風格。

如果你工作在一個不是自己寫的程序上,請注意保留程序原有的風格。

* 為了一致性,使用習慣用法。

在學習一個語言的過程中,一個中心問題就是逐漸熟悉它的習慣用法。

   

-----------------------------------------------

常見習慣用法之一是循環(huán)的形式。

例如:

for(i = 0; i < n; i++)

array[i] = 1.0;

C++Java里常見的另一種形式是把循環(huán)變量的聲明也包括在內(nèi):

for(int i = 0; i < n; i++)

array[i] = 1.0;

-----------------------------------------------

下面是C語言掃描一個鏈表的標準循環(huán):

for(p = list; p != NULL; p = p->next)

...

-----------------------------------------------

無窮循環(huán):

for( ;; )

...

while(1)

...

-----------------------------------------------

常見的另一個慣用法是把一個賦值放進循環(huán)條件里:

while( (c = getchar()) != EOF)

putchar(c);

-----------------------------------------------

一個不好的例子:

char *p, buf[256];

gets(buf);

p = malloc(strlen(buf));

strcpy(p, buf);

問題1.

絕不要使用函數(shù)gets,因為你沒辦法限制它由輸入那兒讀入內(nèi)容的數(shù)量。這常常會導(dǎo)致一個安全性問題。

問題2.

還有另一個問題:strlen求出的值沒有計入串結(jié)尾的'\0'字符,而strcpy卻將復(fù)制它。

習慣寫法是:

p = malloc(strlen(buf)+1);

strcpy(p, buf);

或在C++里:

p = new char[strlen(buf)+1];

strcpy(p , buf);

如果這里沒有+1,就要當心。

strdup可以使避免上述錯誤變得更簡單。可惜strdup不是ANSI C標準中的內(nèi)容。

問題3.

上面兩個版本都沒有檢查malloc的返回值。

在實際程序中,對于mallocreallocstrdup及任何牽涉到存儲分配的函數(shù),它們的返回值都必須做檢查。

-----------------------------------------------

   

* else-if表達多路選擇。

多路選擇的習慣表示法形式如下:

if (condition1)

statement1

else if (condition2)

statement2

...

else if (conditionn)

statementn

else

default-statement

   

1.4 函數(shù)宏

* 避免使用函數(shù)宏。

函數(shù)宏最常見的一個嚴重問題是:如果一個參數(shù)在定義中出現(xiàn)多次,它就可能被多次求值。

如果調(diào)用時的實際參數(shù)帶有副作用,結(jié)果就可能產(chǎn)生一個難以捉摸的錯誤。

例子:

<ctype.h>中:

#define isupper(c) ((c) >= 'A' && (c) <= 'Z')

如果這樣調(diào)用

while (isupper(c = getchar())),

兩次輸入的字符c被分別與'A''Z'比較了。

   

C語言標準允許將isupper及類似函數(shù)定義為宏,但要求保證它們的參數(shù)只求值一次。

如果希望更安全些,那么就一定不要嵌套地使用像getchar這種帶有副作用的函數(shù)。

改寫如下:

while ((c = getchar()) != EOF && isupper(c))

有時多次求值帶來的是執(zhí)行效率問題,而不是真正的錯誤。

   

* 給宏的體和參數(shù)都加上括號。

如果一個操作比較復(fù)雜,或者它很具一般性,值得包裝起來,那么還是應(yīng)該使用函數(shù)。

C++提供的inline函數(shù)既避免了語法方面的麻煩,而且又可得到宏能夠提供的執(zhí)行效率,很適合來定義那些設(shè)置或者提取一個值的短信函數(shù)。

   

1.5 神秘的數(shù) (翻譯的有點...

神秘的數(shù)包括各種常數(shù)、數(shù)組的大小、字符位置、變換因子以及程序中出現(xiàn)的其他以文字形式寫出的數(shù)值。

   

* 給神秘的數(shù)起個名字。

* 把數(shù)定義為常數(shù),不要定義為宏。

C語言預(yù)處理程序是一個強有力的工具,但是它又有些魯莽。

使用宏進行編程是一種很危險的方式,因為宏會在背地里改變程序的詞法結(jié)構(gòu)。我們應(yīng)該讓語法去做正確的工作。

(譯者注:預(yù)處理命令不是C語言本身的組成部分,而是一組輔助成分。這里說"讓語言...",也就是說不要用預(yù)處理命令做。)

* 使用字符形式的常量,不要用整數(shù)。

例子:

if (c >= 65 && c <= 90)

...

這種寫法完全依賴于特殊的字符表示方式。

這樣寫更好些:

if (c >= 'A' && c <= 'Z')

...

但是,如果在某個編碼字符集里的字母編碼不是連續(xù)的,或夾有其他字母,那么這種描述就是錯的。

最好是直接使用庫函數(shù)。

if(isupper(c))

...

-----------------------------------------------

程序里許多上下文中經(jīng)常出現(xiàn)的0。如果我們把每個0的類型寫得更明確更清楚,對讀程序的人理解其作用是很有幫助的。

例如,用 (void*)0 NULL 表示C里的空指針值,用'\0'而不是0表示字符串結(jié)尾的空字節(jié)。

然而在C++里人們都已經(jīng)接受了用0(而不是NULL)表示空指針。Java里則定義了關(guān)鍵字null

   

* 利用語言去計算對象的大小。

不要對任何數(shù)據(jù)類型使用顯式寫出來的大小。

例:

 char buf[1024];

 fgets(buf, sizeof(buf), stdin);

對于那些可以看清楚的數(shù)組(不是指針),下面的宏定義能計算出數(shù)組的元素個數(shù):

#define NELEMS(array) (sizeof(array) / sizeof(array[0]))

   

1.6 注釋

* 不要大談明顯的東西。

注釋應(yīng)該提供那些不能一下子從代碼中看到的東西,或者把那些散布在許多代碼里的信息收集到一起。

* 給函數(shù)和全局數(shù)據(jù)加注釋。

* 不要注釋差的代碼,重寫它。

* 不要與代碼矛盾。

當你改變代碼時,一定要注意保證其中的注釋是準確的。

* 澄清情況,不要添亂。

注釋應(yīng)該在困難的地方盡量幫助讀者,而不是給他們設(shè)置障礙。

   

注釋很重要,但是也不必盲目注釋。

注釋是一種工具,它的作用就是幫助讀者理解程序中的某些部分,而這些部分的意義不容易通過代碼本身直接看到。

   

1.7 為何對此費心

注重程序設(shè)計的風格:具有說明性的名字、清晰的表達式、直截了當?shù)目刂屏鳌⒖勺x的代碼和注釋,以及在追求這些內(nèi)容時一致地使用某些規(guī)則和慣用法的重要性。

   

書寫良好的代碼更容易閱讀和理解,幾乎可以保證其中的錯誤更少。

好風格應(yīng)該成為一種習慣。

一旦這種習慣變成自動的東西,你的潛意識就會幫助你照料許多細節(jié)問題,甚至你在工作壓力下寫出的代碼也會更好。

posted on 2010-03-26 23:39 LynnRaymond 閱讀(333) 評論(0)  編輯 收藏 引用 所屬分類: Reading Books


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2010年3月>
28123456
78910111213
14151617181920
21222324252627
28293031123
45678910

導(dǎo)航

統(tǒng)計

常用鏈接

留言簿

隨筆分類

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久久久999| 亚洲福利av| 亚洲大片精品永久免费| 国产精品亚洲综合| 国产精品毛片一区二区三区| 欧美视频中文字幕在线| 国产精品成人国产乱一区| 国产精品国产精品| 国产在线观看精品一区二区三区| 原创国产精品91| 日韩亚洲精品电影| 欧美在线日韩在线| 欧美成人一区二区在线| 日韩视频免费大全中文字幕| 亚洲无限av看| 欧美freesex交免费视频| 欧美日韩国产三区| 久久综合中文色婷婷| 国产精品私人影院| 久久精品国产亚洲aⅴ| 久久精品盗摄| 欧美成人首页| 欧美三级特黄| 在线观看视频欧美| 久久精品国产亚洲aⅴ| 国产精品久久久亚洲一区 | 欧美日本韩国一区二区三区| 国产精品成人久久久久| 亚洲精品美女91| 久久尤物视频| 亚洲欧美国产高清va在线播| 欧美日韩18| 亚洲免费在线视频一区 二区| 欧美激情视频在线播放| 免费成人黄色| 一区二区免费在线播放| 亚洲欧洲一区二区在线观看| 欧美综合国产| 激情成人av在线| 久久女同精品一区二区| 欧美一区二区视频在线观看| 国产精品毛片a∨一区二区三区| 亚洲午夜高清视频| 亚洲欧美中文日韩v在线观看| 欧美日韩另类在线| 欧美亚洲免费电影| 欧美中文字幕不卡| 亚洲三级视频| 伊人婷婷久久| 亚洲国产欧美一区二区三区同亚洲| 免费日韩精品中文字幕视频在线| 91久久在线播放| 日韩视频一区二区在线观看 | 99视频日韩| 一本色道久久88综合亚洲精品ⅰ | 一区二区高清视频| 尹人成人综合网| 亚洲精品一区二区三区av| 国产精品永久免费在线| 免费观看久久久4p| 国产精品美女久久福利网站| 欧美激情精品久久久久久久变态| 国产精品成人播放| 91久久精品久久国产性色也91| 国产欧美日韩专区发布| 亚洲乱码视频| 日韩视频欧美视频| 99re66热这里只有精品4| 久久综合伊人77777麻豆| 一区二区三区欧美| 欧美激情一区二区在线| 欧美视频在线免费看| 亚洲国产99精品国自产| 黄色成人免费网站| 玖玖玖国产精品| 久久一二三四| 日韩视频一区二区三区在线播放免费观看 | 国产免费观看久久黄| 亚洲午夜电影网| 久久成人国产精品| 国产日韩一区二区| 久久中文欧美| 亚洲最新色图| 久久精品亚洲精品国产欧美kt∨| 国产情人节一区| 久久久蜜桃精品| 亚洲黄色一区| 欧美在线欧美在线| 亚洲高清视频在线观看| 欧美精品1区| 久久久av毛片精品| 一区二区三区精品国产| 欧美在线免费观看| 日韩午夜三级在线| 国产精品一区久久| 久久久久在线| 亚洲激情综合| 国产亚洲精品自拍| 国产精品午夜在线观看| 欧美激情亚洲| 欧美黄色一区二区| 久久gogo国模裸体人体| 亚洲人成在线观看网站高清| 久久一区二区三区四区| 欧美影院一区| 欧美专区亚洲专区| 亚洲无线观看| 亚洲午夜91| 一本色道久久综合亚洲精品婷婷 | 欧美风情在线观看| 欧美一区二区三区啪啪| 一个色综合导航| 亚洲视频在线观看视频| 亚洲性视频网址| 亚洲字幕在线观看| 一本色道久久综合亚洲精品高清 | 欧美日韩视频一区二区| 欧美裸体一区二区三区| 欧美日韩亚洲天堂| 国产精品v日韩精品| 国产精品免费网站在线观看| 国产精品扒开腿爽爽爽视频| 国产精品一区免费视频| 国产日本亚洲高清| 狠狠狠色丁香婷婷综合激情| 在线观看日韩av| 久久久久久久91| 欧美成人日韩| 欧美激情视频一区二区三区不卡| 91久久久在线| 欧美主播一区二区三区美女 久久精品人 | 亚洲在线观看视频| 久久人体大胆视频| 欧美精品免费播放| 激情综合电影网| 艳女tv在线观看国产一区| 久久精品亚洲精品| 亚洲天堂av在线免费| 久久综合色8888| 国产日韩精品久久| 亚洲视频一起| 亚洲精品欧洲精品| 免费欧美高清视频| 国内精品免费午夜毛片| 欧美一区久久| 亚洲免费人成在线视频观看| 欧美成人午夜剧场免费观看| 亚洲九九爱视频| 欧美激情一区二区三区在线视频 | 日韩一区二区免费高清| 久久精品国产久精国产一老狼| 国产精品久久久久久久久久久久| 亚洲人成在线观看一区二区| 欧美aⅴ99久久黑人专区| 久久激情网站| 亚洲国产成人精品久久| 欧美激情一区二区| 欧美本精品男人aⅴ天堂| 日韩午夜高潮| 亚洲电影毛片| 亚洲第一黄色网| 国产精品国产自产拍高清av| 一区二区三区四区五区精品| 亚洲一区二区在线| 伊人久久大香线蕉综合热线| 免费在线看一区| 国产精品黄色| 麻豆91精品| 国产精品jizz在线观看美国| 久久精品九九| 欧美日韩免费一区二区三区| 亚洲欧美视频在线| 麻豆国产va免费精品高清在线| 亚洲视频一区在线观看| 美国三级日本三级久久99| 99精品热视频| 免费观看久久久4p| 欧美在线短视频| 欧美日精品一区视频| 亚洲国产精品一区二区尤物区| 国产精品免费观看在线| 在线视频亚洲| 亚洲每日在线| 欧美电影免费| 欧美激情导航| 亚洲人成在线免费观看| 免费欧美在线| 久久久久久九九九九| 午夜精品999| 欧美一级大片在线观看| 国产精品久久久久av| 亚洲视频在线观看三级| 亚洲欧美综合网| 国产视频一区二区在线观看 | 亚洲一区久久久| 另类国产ts人妖高潮视频| 国模私拍视频一区| 猛干欧美女孩| 亚洲网站啪啪| 欧美成人黄色小视频|