書籍簡(jiǎn)介:
一個(gè)好的程序,不僅僅是能得出正確的運(yùn)行結(jié)果,而且還應(yīng)在其內(nèi)部保持清晰的代碼邏輯和語義,否則,跟隨在正常結(jié)果之后的也許是艱難的代碼維護(hù)工作,對(duì)程序進(jìn)行一處修改往往會(huì)牽一發(fā)而動(dòng)全身,一不小心就會(huì)埋下深深的陷患。從另一個(gè)角度來說,如果每一行代碼的質(zhì)量都很高,那么這個(gè)軟件產(chǎn)品也一定是高質(zhì)量的。這就像ISO 9000的質(zhì)量體系認(rèn)證一樣,與其在產(chǎn)品生產(chǎn)完成之后再進(jìn)行檢驗(yàn),不如控制每一步生產(chǎn)環(huán)節(jié)的質(zhì)量。
本書由淺入深、由表及里地講述存在于C#編碼開發(fā)中的各種質(zhì)量問題,讓讀者清楚地了解什么是應(yīng)該做的,什么是不應(yīng)該做的。C#提供的每種語言機(jī)制的功能背后,體現(xiàn)了怎樣的邏輯含義。當(dāng)遇到具體的問題時(shí),應(yīng)該如何選擇與取舍。閱讀完此書的每一個(gè)章節(jié),都會(huì)讓讀者站在更高的角度C#體系擁有更深的認(rèn)識(shí)和把握,不斷向軟件開發(fā)的更高層次邁進(jìn)。
作者簡(jiǎn)介:
包善東(網(wǎng)名Richard Bao)作者是群碩軟件開發(fā)有限公司的一名交互設(shè)計(jì)師和軟件工程師。9歲時(shí)萌生了對(duì)編程的濃厚興趣,從此走上了軟件開發(fā)的道路,至今已積累了十多年的編程經(jīng)驗(yàn)。作者還曾是其學(xué)校交響樂團(tuán)的大提琴兼鋼琴演奏員,在英、法、德、港、臺(tái)及內(nèi)地多次進(jìn)行演出。
出版日期:
2008年10月
章節(jié)目錄:
第1章 基本的代碼風(fēng)格
1.1 換行的講究
1.1.1 尋找最佳的斷行位置
1.1.2 每行只寫一條語句
1.1.3 分行定義變量
1.2 避免代碼過于擁擠
1.2.1 使用空行分隔代碼塊
1.2.2 使用空格降低代碼密度
1.3 如何縮進(jìn)
1.3.1 嵌套或包含關(guān)系引起的縮進(jìn)
1.3.2 因換行而產(chǎn)生的縮進(jìn)
1.3.3 使用空格還是Tab鍵
1.4 大括號(hào)
1.4.1 大括號(hào)的位置
1.4.2 空的大括號(hào)結(jié)構(gòu)
1.4.3 僅包含單個(gè)語句的結(jié)構(gòu)體
1.5 保持項(xiàng)目文件的條理性
1.5.1 解決方案的結(jié)構(gòu)呼應(yīng)
1.5.2 代碼文件的結(jié)構(gòu)
1.5.3 使用#region標(biāo)記來隱藏細(xì)節(jié)
第2章 養(yǎng)成良好的注釋習(xí)慣
2.1 何時(shí)需要注釋
2.1.1 解釋代碼的意圖
2.1.2 對(duì)局部變量的說明
2.1.3 充當(dāng)代碼標(biāo)題
2.1.4 指出例外情況
2.1.5 開發(fā)過程的提示
2.2 注釋的格式
2.2.1 單行注釋
2.2.2 多行注釋
2.3 正確使用XML文檔注釋
2.3.1 結(jié)構(gòu)與類的XML文檔注釋
2.3.2 屬性的XML文檔注釋
2.3.3 方法的XML文檔注釋
2.3.4 構(gòu)造函數(shù)的XML文檔注釋
2.3.5 事件的XML文檔注釋
2.3.6 枚舉類型的XML文檔注釋
2.3.7 泛型的XML文檔注釋
2‘3.8 其他標(biāo)記
第3章 一般命名規(guī)范
3.1 選用合適的名稱
3.1.1 使用字符的限制
3.1.2 使用含義明確的英語
3.2 大小寫規(guī)則
3.2.1 Pascal規(guī)則
3.2.2 Camel規(guī)則
3.2.3 首字母縮寫詞與簡(jiǎn)寫詞
3.2.4 應(yīng)在何時(shí)使用何種大小寫規(guī)則
3.3 考慮跨語言編程
3.3.1 不要通過大小寫區(qū)分標(biāo)識(shí)符
3.3.2 避免與其他語言的關(guān)鍵字重復(fù)
3.3.3 避免使用特定語言的術(shù)語
3.4 命名一致與沖突
3.4.1 大小寫無關(guān)原則
3.4.2 對(duì)基類型的命名暗示
3.4.3 對(duì)參數(shù)與屬性的關(guān)系暗示
3.4.4 屬性名稱與自身類型同名
3.4.5 與命名空間相關(guān)的命名沖突
3.5 匈牙利命名法
3.5.1 匈牙利命名法的弊端
3.5.2 考慮為控件應(yīng)用匈牙利命名法
第4章 處理數(shù)據(jù)
4.1 關(guān)于數(shù)據(jù)類型
4.1.1 整數(shù)
4.1.2 浮點(diǎn)數(shù)
4.1.3 布爾類型
4.1.4 字符與字符串
4.2 變量的使用
4.2.1 盡可能使用內(nèi)置關(guān)鍵字
4.2.2 初始化一切變量
4.2.3 集中使用變量
4.3 使用枚舉
4.3.1 何時(shí)使用枚舉
4.3.2 如何為枚舉命名
4.3.3 關(guān)于枚舉項(xiàng)
4.3.4 標(biāo)記枚舉
4.4 魔數(shù)——以字面數(shù)值出現(xiàn)在代碼中的常量
4.5 復(fù)雜的表達(dá)式
4.5.1 運(yùn)算符的副作用
4.5.2簡(jiǎn)化表達(dá)式
第5章 分支結(jié)構(gòu)
5.1 使用if結(jié)構(gòu)
5.1.1“==”與“=”的問題
5.1.2 如何處理復(fù)雜的條件
5.2 使用switch結(jié)構(gòu)
5.2.1 break語句
5.2.2 使用default子句要注意的問題
5.3 選擇if還是switch?
5.4 關(guān)于判斷順序的設(shè)計(jì)
5.4.1 先判斷最有可能成立的條件
5.4.2 預(yù)防因條件短路而丟失操作
5.5 慎用goto語句
第6章 循環(huán)結(jié)構(gòu)
6.1 使用for還是while
6.1.1 for和while的語義比較
6.1.2 簡(jiǎn)單的數(shù)值迭代——for和while的思維模式的差j
6.1.3 預(yù)知循環(huán)次數(shù)——微波爐加熱的啟示
6.1.4 集合迭代——獨(dú)特的foreach結(jié)構(gòu)
6.2 循環(huán)變量的使用
6.2.1 循環(huán)變量的命名
6.2.2 循環(huán)變量的定義
6.2.3 避免循環(huán)變量的非常規(guī)應(yīng)用
6.3 提高循環(huán)效率
6.3.1 避免不必要的重復(fù)勞動(dòng)
6.3.2 避免不必要的循環(huán)
第7章 如何使用函數(shù)
7.1 為什么要使用函數(shù)
7.1.1 函數(shù)與方法
7.1.2 代碼復(fù)用
7.1.3 隱藏細(xì)節(jié)——使用函數(shù)進(jìn)行抽象
7.2 函數(shù)重載
7.2.1 重載的語義——為調(diào)用者提供方便
7.2.2 保持核心代碼唯一
7.3 參數(shù)的設(shè)計(jì)
7.3.1 參數(shù)的命名
7.3.2 不要使用保留項(xiàng).
7.3.3 何時(shí)使用變長參數(shù)列表
7.3.4 何時(shí)使用ref參數(shù)和out參數(shù)
7.3.5 參數(shù)的順序
7.3.6 重載函數(shù)的參數(shù)一致性體現(xiàn)
7.4 參數(shù)檢查的必要性
7.4.1 檢查零值及空引用
7.4.2 檢查枚舉類型
7.4.3 防止數(shù)據(jù)被篡改
7.4.4 在何處檢查合法性
7.5 函數(shù)的出口——離開函數(shù)的三種方式
7.5.1 返回值的用法
7.5.2 離開函數(shù)的時(shí)機(jī)
第8章 結(jié)構(gòu)與類
8.1 結(jié)構(gòu)與類的比較
8.1.1 值類型與引用類型
8.1.2 何時(shí)應(yīng)當(dāng)使用結(jié)構(gòu)
8.1.3 何時(shí)應(yīng)當(dāng)使用類
8.2 結(jié)構(gòu)與類的命名
8.2.1 措辭
8.2.2 避免與命名空間沖突
8.2.3 不要使用“C”前綴
8.2.4后綴的使用
8.3 如何搭建一個(gè)典型的結(jié)構(gòu)
8.3.1 找準(zhǔn)核心數(shù)據(jù)
8.3.2 數(shù)據(jù)的表現(xiàn)形式
8.3.3 定義等價(jià)原則
8.3.4實(shí)現(xiàn)基本運(yùn)算
8.4 如何真正面向?qū)ο?br>第9章 封裝
9.1 構(gòu)造函數(shù)
9.1.1 構(gòu)造函數(shù)的語義
9.1.2 何時(shí)使用靜態(tài)構(gòu)造方法
9.1.3 構(gòu)造函數(shù)的參數(shù)及其初始化
9.2 Finalize函數(shù)
9.2.1 垃圾回收器
9.2.2 IDisposable接口——顯式釋放資源的方法
9.2.3 釋放資源的一般范式
9.3 何時(shí)應(yīng)該使用字段
9.3.1 存儲(chǔ)核心數(shù)據(jù)
9.3.2 維持中間結(jié)果
9.3.3 常量字段
9.4 如何使用字段
9.4.1 字段的命名
9.4.2 訪問控制
9.5 何時(shí)應(yīng)該使用屬性
9.5.1 屬性的語義
9.5.2 數(shù)據(jù)訪問控制
9.5.3 需要的后續(xù)操作
9.5.4 簡(jiǎn)單的數(shù)據(jù)處理
9.5.5 預(yù)定義的對(duì)象實(shí)例
9.6 如何使用屬性
9.6.1 屬性的命名
9.6.2 訪問控制
9.6.3 提供合理的默認(rèn)值
9.6.4 保持輕量級(jí)的操作
9.6.5 在屬性中拋出異常
9.7 何時(shí)應(yīng)該使用方法
9.7.1 表示某種操作
9.7.2 耗時(shí)的任務(wù)——方法在形式上的暗示作用
9.7.3 有副作用的操作
9.7.4 返回不確定的值
9.7.5 返回?cái)?shù)組或集合對(duì)象
9.8 如何使用方法
9.8.1 方法的命名
9.8.2 檢查傳入的參數(shù)
9.9 靜態(tài)類型及成員
9.10 嵌套類型及其適用場(chǎng)合
9.11 可變類型的安全性
9.12 使用程序集與命名空間
9.12.1 程序集的劃分
9.12.2 為什么要使用命名空間
9.12.3 命名空間的命名
9.12.4 命名空間的管理
第10章 繼承與多態(tài)
10.1 如何利用類繼承
10.1.1 自上而下逐步細(xì)化
10.1.2 自下而上逐步抽象
10.2 繼承限制
10.2.1 強(qiáng)制繼承的抽象類型
10.2.2 密封類型
10.2.3 擴(kuò)展方法——直接向已有類型添加功能
10.3 關(guān)于接口
10.3.1 接口的語義
10.3.2 接口的命名
10.3.3 使用接口還是類繼承
10.4 何時(shí)應(yīng)當(dāng)顯式實(shí)現(xiàn)接口
10.4.1 解決接口之間的命名沖突
1 0.4.2 提供強(qiáng)類型操作
10.4.3 隱藏僅用于通過接口訪問的成員
10.5 使用多態(tài)
10.5.1 何時(shí)應(yīng)進(jìn)行重寫
10.5.2 應(yīng)當(dāng)重寫哪個(gè)成員
10.5.3 保持參數(shù)名稱一致
10.6運(yùn)算符重載
10.6.1 可重載的運(yùn)算符
10.6.2 符合運(yùn)算符的本意
10.6.3 運(yùn)算符的關(guān)聯(lián)性
10.6.4 類型轉(zhuǎn)換運(yùn)算符的重載
第11章 泛型機(jī)制
11.1 裝箱與取消裝箱
11.2 何時(shí)使用泛型
11.3 泛型的類型參數(shù)設(shè)計(jì)
11.3.1 類型參數(shù)的命名
11.3.2 使用類型參數(shù)的時(shí)機(jī)
第12章 事件與委托
12.1 何為事件驅(qū)動(dòng)模式
12.2 如何響應(yīng)事件
12.2.1 事件處理函數(shù)
12.2.2代碼的分配
12.2.3 事件偵聽器的使用
12.3如何提供事件
12.3.1 何時(shí)應(yīng)當(dāng)提供事件
12.3.2 事件的命名
12.3.3 傳遞與事件相關(guān)的數(shù)據(jù)
12.3.4 用于事件的委托及其要遵守的約定
12.3.5 觸發(fā)事件
12.4 使用委托
12.4.1 何時(shí)使用委托
12.4.2 何時(shí)使用匿名方法
12.4.3 基類型與派生類型
第13章 集合類型
13.1 系統(tǒng)內(nèi)置集合類型
13.1.1 數(shù)組
13.1.2 列表
13.1.3 字典
13.1.4 其他類型
13.2 選用適當(dāng)?shù)募项愋鸵紤]的幾個(gè)方面
13.2.1 容量
13.2.2進(jìn)出次序
13.2.3 定位的問題——索引/鍵訪問
13.2.4 元素結(jié)構(gòu)
13.2.5 排序
13.3 性能比較
13.4 提供自己的集合類型
13.4.1 何時(shí)應(yīng)提供集合類型
13.4.2 集合類型的命名
13.4.3 提供與內(nèi)置集合類型一致的行為
13.4.4 索引器及其應(yīng)遵守的規(guī)則
13.4.5 迭代器
第14章 LINQ查詢
14.1 提高LINQ查詢的效率
14.1.1 查詢語法和方法語法的區(qū)別
14.1.2 LINQ查詢的創(chuàng)建、執(zhí)行與性能
14.1.3 減少返回的數(shù)據(jù)量
14.2 LINQ中的錯(cuò)誤處理一一采用防御式編程
14.3 LINQ查詢的相關(guān)機(jī)制
14.3.1 匿名類型
14.3.2 隱式類型的局部變量
14.3.3 Lambda表達(dá)式與匿名函數(shù)
第15章 異常
15.1 處理異常時(shí)應(yīng)遵守的規(guī)范
15.2 拋出異常
15.2.1 異常的語義
15.2.2 不應(yīng)使用異常的位置
15.2.3 控制異常
15.2.4 異常的重新拋出——重新包裝時(shí)要注意的
15.3 選用合適的異常類型
15.3.1 常見的異常類型
15.3.2 不應(yīng)使用的異常類型
15.4 異常提示信息
15.5 設(shè)計(jì)自定義異常及應(yīng)遵循的約定
第16章 全球化與本地化
16.1 分離與特定區(qū)域相關(guān)的信息
16.2 處理特定區(qū)域性的數(shù)據(jù)
16.2.1 區(qū)分區(qū)域性與界面區(qū)域性
16.2.2 在內(nèi)部使用Unicode
16.2.3 文本的比較與排序
16.2.4 不要假定區(qū)域性的行為
16.3 何時(shí)使用固定區(qū)域性
16.4 用戶界面應(yīng)注意的細(xì)節(jié)
16.4.1 使用資源
16.4.2 術(shù)語
16.4.3 界面布局
16.4.4 歧義
16.4.5 組合文本
附錄A:C#、VB.NET、J#關(guān)鍵字表
附錄B:常用的異常類型
封面圖: