搜尋
首頁資料庫mysql教程【善于防守-健壮代码的防御性编程技巧】

最近在看【美】Pete GoodLiffe写的《编程匠艺》,很有感触。边读边想,发现能够与作者产生强烈的共鸣,这真是一种美妙的感觉。所以想把与作者产生共鸣和得学习的一些地方记下来,来加深对这些被实践证明了是正确的编程技巧的掌握。 防御性编程:顾名思义,防

最近在看【美】Pete GoodLiffe写的《编程匠艺》,很有感触。边读边想,发现能够与作者产生强烈的共鸣,这真是一种美妙的感觉。所以想把与作者产生共鸣和值得学习的一些地方记下来,来加深对这些被实践证明了是正确的编程技巧的掌握。

【善于防守-健壮代码的防御性编程技巧】

防御性编程:顾名思义,防御性编程是一种细致的,谨慎的编程方法。为了开发可靠的软件产品,我们要谨慎地设计系统的每个细节,便是其能尽可能的“保护”自己,,我们通过明确的代码中增加很多的假设,当假设在现实的客户环境中执行时才不至于崩溃,给一些客户莫名奇妙的错误或者异常。防御性编程是一种防卫方式,而不是一种补救方式。

【善于防守-健壮代码的防御性编程技巧】

图1 修补性的编程

下面是常见的防御性编程技巧:

1.使用好的编码风格和合理的设计:

好的编码风格会让人耳目一新,而且越是清晰地代码,越是体现了作者思路的清晰度,模块组件内部的高内聚,低耦合也会使代码的维护和使用更加便捷,更不容易出错。

2.不要仓促的编写代码:

不要在脑袋里有了大体思路之后就马上很“职业”地噼里啪啦的敲下代码,然后大体检查后剩下的就交给编译器去检查吧,于是运行通过,编写下面一个函数,这样就会隐藏大量的危险的代码,久而久之就会陷入自己给自己挖的大坑里,拔都拔不出腿。

关键: 欲速则不达。每敲一个字,都要想清楚自己要输入的是什么。

3. 不相信任何人:

不相信任何可能给自己写的代码带来麻烦的人,这些人包括:真正的客户,恶意的用(有可能是黑客),客户端的代码(Client Code),运行环境(可能存在磁盘空间已满,网络断开等),外部运行库(自己写的代码所依赖的外部dll已从请求位置移除)。

4 . 编码的目标是清晰,不是一味地准求简洁:

如果从简洁(可能理解起来比较困惑)和清晰(可能比较冗长)的代码里选择一种,我想大部分人会选择清晰地代码,尽管比较冗长(毕竟代码不是写在花银子买来的纸上的 :-) )。

5.不想让其他人做他们不该做的事情:

设计上不想让其他人访问的属性或者方法要尽量将可访问性限制在类或者包的内部。

6.编译时打开所有的警告开关

日益发达,功能强大的编译器会告诉我们,哪些代码写的不太符合规范,哪些变量声明了未使用等等这些可能在实际的运行环境中给我们带来意外结果,我们却感觉莫名其妙,无从下手修补的代码。重视编译后的警告信息会让我们的代码更加健壮。

7.使用安全的数据结构:

最常见安全隐患是缓冲区溢出,例如:一个buffer的长度是10,但是向buffer写入了长度为11的数据,这样会可能覆盖掉其他的数据,这样可能会造成遭难性的影响。当然现在.net 这样优秀的开发平台有CLR去管理内存,给我们腾出了更多的时间和精力去考虑我们想要用代码完成的事情。

8.检查所有的返回值:

如果一个函数有返回值,这样做肯定是有理由的。要对这个返回值进行检查,如果不对返回值检查就会产生很多难以察觉的错误。检查这个返回值,这个返回值可能是一个错误代码(C程序一般都是返回错误代码吧),必须辨别这个代码并处理所有的错误,忍受这个错误,危险就会悄无声息的潜入我们的程序。C#提供了沿堆栈逐级向外抛出的异常机制,我们应该在写的C#代码中,对不同级别的异常做合理的封装(底层异常要体现底层这个级别来例如:DBException,业务层的异常要体现出业务类的异常来ProductInfoInitialException)。

9.审慎的处理内存等宝贵的资源:

这些资源包括:内存,磁盘文件,网络连接,数据库连接。哈哈,现在jvm,clr都可以做到自动的清理资源和垃圾回收,我们真是太幸福了,但是也不要太大意了,我们还是需要显示的释放那些我们不再需要的资源,毕竟jvm和clr都是遵循一定的机制(详见http://www.cnblogs.com/anorthwolf/archive/2009/12/07/1618744.html),我们必须显示的终止对那些不再使用和不会被自动清理的对象的引用,不太先进的垃圾回收器会被循环引用对象所蒙蔽。

10.尽量晚的声明变量:

也就是要靠着使用变量最近的代码段来声明变量。

11.在声明变量的位置初始化变量:

如果初始化了所有的变量,那么他的用途就是明确的。“如果我不初始化它,我就不关心它”的经验主义是错误的,如果一个变量在一个位置声明,在另一个位置初始化,并在第三个地方被使用,那么一旦初始化代码被跳过,就会得到意想不到的结果,到时候我们再去查找原因,那就难喽。

12.小心的进行强制类型装换:

有些类型之间虽然可以进行强制类型转换,但是有些类型在转换的过程中会丢失掉一些数据。

13.提供默认的行为:

例如:Switch语句,要对default 有默认的实现。

14.检查数值的上下线:

.net 框架中已经对一些数值类型有了范围的约束,但是如果我们在一些业务开发中要对是否符合现实情况作出检查:例如年龄不能为负数等等。

15.约束:

约束主要包括:

1.5.1 前置条件:输入一段代码之前必须为真。

1.5.2 后置条件:输入一段代码之后必须为真。

1.5.3 不变条件:程序运行到一个特定点,必须为真。

1.5.3 断言:任何其他关于程序在给定位置的状态的陈述。

具体内容是:

检查所有的数组边界。

在废除指针前,断言指针是否清零。

确保函数参数的有效性。

在函数结果返回前,进行充分的检查。

在操作对象之前证明他的状态时一致的。

总结一下,编写正确而且优秀的代码是很重要的,这需要记录下你所做的所有的设想。这样会使程序维护起来更加的容易,会使错误减少。防御性编程就是一种预想最坏的情况并为之做好准备的方法。他是一种可以防止简单的错误变成难以找到的错误的技术。与防御性代码一起使用编入代码的约束,会使程序更加的健壮。

作者:小伦 出处:http://www.cnblogs.com/shiyulun1984/

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
MySQL的位置:數據庫和編程MySQL的位置:數據庫和編程Apr 13, 2025 am 12:18 AM

MySQL在數據庫和編程中的地位非常重要,它是一個開源的關係型數據庫管理系統,廣泛應用於各種應用場景。 1)MySQL提供高效的數據存儲、組織和檢索功能,支持Web、移動和企業級系統。 2)它使用客戶端-服務器架構,支持多種存儲引擎和索引優化。 3)基本用法包括創建表和插入數據,高級用法涉及多表JOIN和復雜查詢。 4)常見問題如SQL語法錯誤和性能問題可以通過EXPLAIN命令和慢查詢日誌調試。 5)性能優化方法包括合理使用索引、優化查詢和使用緩存,最佳實踐包括使用事務和PreparedStatemen

MySQL:從小型企業到大型企業MySQL:從小型企業到大型企業Apr 13, 2025 am 12:17 AM

MySQL適合小型和大型企業。 1)小型企業可使用MySQL進行基本數據管理,如存儲客戶信息。 2)大型企業可利用MySQL處理海量數據和復雜業務邏輯,優化查詢性能和事務處理。

幻影是什麼讀取的,InnoDB如何阻止它們(下一個鍵鎖定)?幻影是什麼讀取的,InnoDB如何阻止它們(下一個鍵鎖定)?Apr 13, 2025 am 12:16 AM

InnoDB通過Next-KeyLocking機制有效防止幻讀。 1)Next-KeyLocking結合行鎖和間隙鎖,鎖定記錄及其間隙,防止新記錄插入。 2)在實際應用中,通過優化查詢和調整隔離級別,可以減少鎖競爭,提高並發性能。

mysql:不是編程語言,而是...mysql:不是編程語言,而是...Apr 13, 2025 am 12:03 AM

MySQL不是一門編程語言,但其查詢語言SQL具備編程語言的特性:1.SQL支持條件判斷、循環和變量操作;2.通過存儲過程、觸發器和函數,用戶可以在數據庫中執行複雜邏輯操作。

MySQL:世界上最受歡迎的數據庫的簡介MySQL:世界上最受歡迎的數據庫的簡介Apr 12, 2025 am 12:18 AM

MySQL是一種開源的關係型數據庫管理系統,主要用於快速、可靠地存儲和檢索數據。其工作原理包括客戶端請求、查詢解析、執行查詢和返回結果。使用示例包括創建表、插入和查詢數據,以及高級功能如JOIN操作。常見錯誤涉及SQL語法、數據類型和權限問題,優化建議包括使用索引、優化查詢和分錶分區。

MySQL的重要性:數據存儲和管理MySQL的重要性:數據存儲和管理Apr 12, 2025 am 12:18 AM

MySQL是一個開源的關係型數據庫管理系統,適用於數據存儲、管理、查詢和安全。 1.它支持多種操作系統,廣泛應用於Web應用等領域。 2.通過客戶端-服務器架構和不同存儲引擎,MySQL高效處理數據。 3.基本用法包括創建數據庫和表,插入、查詢和更新數據。 4.高級用法涉及復雜查詢和存儲過程。 5.常見錯誤可通過EXPLAIN語句調試。 6.性能優化包括合理使用索引和優化查詢語句。

為什麼要使用mysql?利益和優勢為什麼要使用mysql?利益和優勢Apr 12, 2025 am 12:17 AM

選擇MySQL的原因是其性能、可靠性、易用性和社區支持。 1.MySQL提供高效的數據存儲和檢索功能,支持多種數據類型和高級查詢操作。 2.採用客戶端-服務器架構和多種存儲引擎,支持事務和查詢優化。 3.易於使用,支持多種操作系統和編程語言。 4.擁有強大的社區支持,提供豐富的資源和解決方案。

描述InnoDB鎖定機制(共享鎖,獨家鎖,意向鎖,記錄鎖,間隙鎖,下一鍵鎖)。描述InnoDB鎖定機制(共享鎖,獨家鎖,意向鎖,記錄鎖,間隙鎖,下一鍵鎖)。Apr 12, 2025 am 12:16 AM

InnoDB的鎖機制包括共享鎖、排他鎖、意向鎖、記錄鎖、間隙鎖和下一個鍵鎖。 1.共享鎖允許事務讀取數據而不阻止其他事務讀取。 2.排他鎖阻止其他事務讀取和修改數據。 3.意向鎖優化鎖效率。 4.記錄鎖鎖定索引記錄。 5.間隙鎖鎖定索引記錄間隙。 6.下一個鍵鎖是記錄鎖和間隙鎖的組合,確保數據一致性。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器