Ada 樣式指南/簡介
風格是一個經常被忽視但非常重要的寫作屬性。寫作風格直接影響最終產品的可讀性和可理解性。程式設計風格,作為用計算機語言編寫原始碼,也遭受了這種忽視。程式需要讓人類能夠閱讀和理解,而不僅僅是機器能夠比較。這種要求對於建立高質量的產品至關重要,這些產品不僅滿足使用者需求,而且能夠按計劃開發並在估計成本內完成。本書旨在幫助計算機專業人員編寫更好的 Ada 程式。它提供了一套具體的風格指南,用於以規範的方式使用 Ada 95 的強大功能(Ada 參考手冊 1995)。
每個指南都包含一個關於應遵循的原則的簡潔陳述以及遵循該指南的基本原理。在大多數情況下,都會提供使用該指南的示例,並且在某些情況下,還會包含另一個示例來展示違反該指南的後果。明確指出了應用該指南的可能例外情況,並在適當的情況下提供了進一步的解釋性說明。在某些情況下,會提供例項以顯示可以作為標準執行的更具體的指導。在選定的情況下,自動化說明會討論如何自動執行指南的執行。
Ada 被設計用來支援開發高質量、可靠、可重用和可移植的軟體。由於多種原因,沒有任何程式語言可以單獨確保實現這些理想的目標。例如,程式設計必須嵌入到一個規範的開發過程中,該過程以有組織的方式處理需求分析、設計、實現、驗證、確認和維護。語言的使用必須符合基於成熟軟體工程原則的良好程式設計實踐。本書旨在幫助彌合這些原則與 Ada 實際程式設計實踐之間的差距。
本書中的許多指南旨在促進清晰的原始碼。這些指南的目標是提高程式演變、適應和維護的易用性。易於理解的原始碼更有可能正確且可靠。輕鬆的適應需要對軟體有透徹的理解;清晰度極大地促進了這一點。有效的程式碼改編是程式碼重用的先決條件,程式碼重用具有大幅降低系統開發成本的潛力。最後,由於維護(實際上是演變)是一個在系統整個生命週期中持續進行的昂貴過程,因此清晰度在降低維護成本方面發揮著重要作用。在整個生命週期中,程式碼需要閱讀和理解的次數遠遠多於編寫的次數;因此,投資編寫可讀、易於理解的程式碼是值得的。
本簡介的其餘部分討論了本書的組織結構以及如何由不同角色的人員使用所提供的材料,包括 Ada 新手程式設計師、有經驗的 Ada 程式設計師、面向物件程式設計師、軟體專案經理、承包機構、標準制定組織以及從現有的 Ada 83 程式(Ada 參考手冊 1983)過渡到 Ada 95 的規劃人員。
本書的格式遵循了 Ada Quality and Style: Guidelines for Professional Programmer's,版本 02.01.01 (AQ&S 83)(軟體生產力聯盟 1992)廣受好評的指南格式。樣式指南分為幾個部分,對應於每個程式設計師在建立高質量、可靠、可重用和可移植的 Ada 軟體時必須做出的主要決策。各部分之間存在一些重疊,因為並非所有程式設計決策都可以獨立做出。
各個章節分別介紹原始碼呈現、可讀性、程式結構、程式設計實踐、併發、可移植性、可重用性和效能,以及一個新章節介紹面向物件特性。每章最後都總結了其中包含的指南。最後一章展示了由 Michael B. Feldman 博士和 Bjorn Kallberg 先生提供的哲學家就餐問題的完整實現。本書中的許多指南都用於建立此示例。附錄提供了 Ada 參考手冊(1995)各節與本樣式指南中指南之間的交叉引用矩陣。
本書使用了過去 20 年來發展起來的通用軟體工程詞彙。軟體工程是一門發展迅速的學科,擁有相對較新的概念和術語。但是,為了建立一個共同的參考框架,需要從 Ada 參考手冊(1995)和基本原理(1995)中提取必要的定義。
在整本書中,都引用了有關 Ada 風格和其他 Ada 問題的其他資訊來源。參考文獻列在書的末尾。還提供了一個參考書目。
在本指南中,“Ada”指的是 1995 年 2 月釋出的最新 Ada 標準(有時也稱為 Ada 95)。對早期 Ada 標準的引用明確表示為“Ada 83”。
第 2 章和第 3 章直接解決了建立清晰、可讀和易於理解的原始碼的問題。第 2 章側重於程式碼格式,第 3 章介紹了註釋的使用、命名約定和型別等問題。
程式碼清晰度主要有兩個方面:(1)在頁面或螢幕上仔細且一致地佈局原始碼,第 2 章介紹了這一點,這可以極大地增強可讀性;(2)仔細注意程式碼的結構,第 3 章介紹了這一點,這可以使程式碼更容易理解。這在小規模(例如,透過仔細選擇識別符號名稱或規範地使用迴圈)和大規模(例如,透過正確使用包)上都是正確的。這些指南同時處理佈局和結構。
程式碼格式和命名約定偏好往往非常個人化。您必須權衡您個人喜好與專案中其他工程師的喜好,以便就整個專案團隊將遵循的一套一致的約定達成一致。自動程式碼格式化程式可以幫助執行這種一致性。
第 4 章介紹了整體程式結構。正確的結構可以提高程式的清晰度。這類似於較低級別的可讀性,幷包括高階結構的問題,特別是包和子包的使用、可見性和異常。本章中的大多數指南都與應用健全的軟體工程原則有關,例如資訊隱藏、抽象、封裝和關注點分離。
第 5 章介紹了定義一致和邏輯語言特性用法的指南。這些指南涵蓋了語法的可選部分、型別、資料結構、表示式、語句、可見性、異常和錯誤執行。
第 6 章定義了正確使用併發性的方法,以開發可預測、可靠、可重用和可移植的軟體。主題包括任務、受保護單元、通訊和終止。Ada 語言的一個主要增強領域是對共享資料的更好支援。任務機制一直是保護共享資料的唯一可用方法。本章中的指南支援使用受保護型別來封裝和同步對共享資料的訪問。
第 7 章和第 8 章從略微不同的角度探討了面向變化的設計問題。第 7 章探討了可移植性的基本原理,即軟體從一個計算機系統或環境更改到另一個計算機系統或環境的難易程度,以及特定功能的使用對可移植性的影響。第 8 章探討了程式碼的可重用性,即程式碼可以在不同的應用程式中使用而無需進行最小更改的程度。
第 7 章討論的可移植性指南需要仔細注意。即使目前沒有預見到移植所得軟體的需要,遵守這些指南也很重要。遵循這些指南可以提高所得程式碼在使用不同 Ada 實現的專案中的潛在可重用性。您應該堅持,當特定的專案需求迫使放寬某些可移植性指南時,源文字的不可移植功能應突出顯示。
第 8 章給出的可重用性指南基於封裝和麵向變化的設計原則。這些指南強調,理解和清晰度、健壯性、適應性和獨立性都是有用且理想的,即使預期不會重用,因為生成的程式碼對計劃內和計劃外的更改更具抵抗力。
第 9 章定義了一組以面向物件術語為基礎的指南,這些指南利用了 Ada 95 中的一些 Ada 83 中沒有的功能。這些指南討論了使用 Ada 的新特性,例如型別擴充套件(帶標記型別)、抽象帶標記型別和抽象子程式來實現單一繼承、多重繼承和多型性。
第 10 章定義了一組旨在增強效能的指南。我們認識到,某些效能方法與可維護性和可移植性存在矛盾。本章中的大多數指南都寫著“. . . 當測量的效能表明時”。“表明”意味著您已確定,在您的環境中,提高應用程式效能帶來的好處超過了對所得程式碼的可理解性、可維護性和可移植性的負面影響。
本書面向參與用 Ada 編寫的軟體系統實際開發的人員。以下部分討論瞭如何最有效地利用所提供的材料。具有不同 Ada 經驗水平或在軟體專案中扮演不同角色的讀者需要以不同的方式使用本書。
本書有多種使用方法:作為良好的 Ada 風格指南;作為有助於編寫更好的 Ada 程式的指南的綜合列表;或作為參考書,用於查閱特定語言功能的使用示例和設計權衡討論。本書包含許多指南,其中一些非常複雜。沒有必要同時學習所有這些指南;您不太可能同時使用語言的所有功能。但是,建議所有程式設計師(以及在可能的情況下,其他 Ada 專案人員)努力閱讀並理解第 2 章、第 3 章、第 4 章和第 5 章直至第 5.7 節。其中一些內容相當困難(例如,討論可見性的第 4.2 節),但它涵蓋了 Ada 有效使用的一些基本問題,對於參與構建 Ada 系統的任何軟體專業人員來說都非常重要。
本書並非作為 Ada 入門教材或 Ada 語言的完整手冊。我們假設您已經瞭解 Ada 的語法並對語義有基本的瞭解。有了這樣的背景,您會發現這些指南很有用、資訊豐富,並且經常具有啟發性。
如果您正在學習 Ada,則應配備一本關於該語言的綜合入門教程。兩本關於 Ada 83 的優秀的入門教材是 Barnes (1989) 和 Cohen (1986)。兩位作者都出版了涵蓋 Ada 95 的新書(Barnes 1996,Cohen 1996)。熟悉這些教材後,建議您結合 Rationale (1995) 使用它們。Ada 參考手冊 (1995) 應被視為這些書籍的配套資料。大多數指南都參考了 Ada 參考手冊 (1995) 中定義所討論語言功能的部分。附錄 A 將 Ada 語言參考手冊的部分內容交叉引用到指南中。
乍一看,Ada 提供了種類繁多的功能。它是一個強大的工具,旨在解決難題,幾乎每個功能在某種情況下都有其合法的應用。這使得以有紀律且有組織的方式使用 Ada 的功能尤其重要。遵循這些指南可以使學習 Ada 變得更容易,並幫助您掌握其明顯的複雜性。從一開始,您就可以編寫利用語言最佳功能的程式,並以設計者預期的方式進行。
有經驗的其他程式語言程式設計師常常試圖將 Ada 視為他們熟悉的語言,但語法略有不同。必須不惜一切代價避免這種陷阱;它會導致程式碼變得複雜,從而破壞了 Ada 的那些使其非常適合構建高質量系統的特性。您必須學會“思考 Ada”。遵循本書中的指南並閱讀其使用示例將幫助您儘可能快速和輕鬆地做到這一點。
在某種程度上,學習 Ada 的新手程式設計師具有一定的優勢。從一開始就遵循指南有助於培養一種清晰的程式設計風格,有效地利用該語言。如果您屬於此類,建議您將這些指南應用於您作為學習 Ada 的一部分所執行的練習。最初,透過專注於指南本身及其支援示例來培養良好的程式設計習慣,比理解每個指南的基本原理更重要。
許多指南的基本原理幫助有經驗的程式設計師理解和接受指南中提出的建議。一些指南本身也針對必須進行工程權衡的有經驗的程式設計師。這在可移植性、可重用性和效能方面尤其如此。這些更難的指南和基本原理將使您瞭解影響每個程式設計決策的問題。然後,您可以利用這些認識來識別最終在您成為有經驗的 Ada 程式設計師時將被要求進行的工程權衡。
作為一名有經驗的 Ada 程式設計師,您編寫的程式碼已經符合本書中的許多指南。但是,在某些領域,您可能採用了與此處介紹的不同的個人程式設計風格,並且可能不願意更改。仔細審查與您當前風格不一致的指南,確保您理解其基本原理,並考慮採用它們。本書中的指南整體體現了一種一致的方法,用於生成高質量的程式,而過多的例外情況會削弱這種方法。
一致性是普遍採用通用指南的另一個重要原因。如果專案的全體人員都以相同的風格編寫原始碼,則許多關鍵的專案活動會更容易。一致的程式碼簡化了正式和非正式的程式碼審查、系統整合、專案內的程式碼重用以及支援工具的提供和應用。在實踐中,公司或專案標準可能要求對偏離指南的情況進行明確註釋,因此採用非標準方法可能需要額外的額外工作。
本書中的一些指南,尤其是在併發性、可移植性、可重用性、面向物件特性和效能方面的章節,側重於設計權衡。這些指南要求您考慮使用 Ada 特性是否適合您的應用程式的設計決策。通常有幾種方法可以實現特定的設計決策,這些指南討論了您在做出決策時應考慮的權衡。
作為一名有經驗的面向物件程式設計師,您會讚賞為優雅地擴充套件 Ada 語言以包含強大的面向物件特性所付出的努力。這些新特性與現有的語言特性和詞彙緊密整合。本書有意從風格的角度出發進行編寫;因此,本書貫穿始終都使用了 Ada 面向物件特性。這些特性的規範使用將有助於建立更易於閱讀和修改的程式。這些特性還為您構建可重用元件提供了靈活性。第 9 章討論了面向物件程式設計以及繼承和多型性問題。前面的章節交叉引用了第 9 章中的指南。
如果您已經進行過面向物件設計,那麼您會發現更容易利用第 9 章中的許多概念。面向物件設計的成果將包括一組有意義的抽象和類層次結構。抽象需要包括設計物件的定義,包括結構和狀態、物件上的操作以及每個物件的預期封裝。設計這些抽象和類層次結構的細節超出了本書的範圍。許多好的資源提供了這方面的詳細資訊,包括 Rumbaugh 等人 (1991)、Jacobson 等人 (1992)、ADARTS 指南 (軟體生產力聯盟 1993) 和 Booch (1994)。
技術管理在確保專案過程中產生的軟體正確、可靠、可維護和可移植方面發揮著關鍵作用。管理層必須在專案範圍內建立對高質量程式碼生產的承諾;定義專案特定的編碼標準和指南;培養對統一遵守所選編碼標準對於產品質量至關重要的理解;並建立檢查和執行該遵守情況的政策和程式。本書中包含的指南可以幫助實現這一目標。
管理人員的一項重要活動是為專案或組織定義編碼標準。這些指南本身並不構成一套完整的標準;但是,它們可以作為標準的基礎。一些指南指出了多種決策範圍,但並沒有規定具體的決策。例如,本書中的第二條指南(指南 2.1.2)提倡使用一致的空格數進行縮排,並在基本原理中指出 2 到 4 個空格是合理的。您應該與您的高階技術人員一起審查每一條此類指南,並就其例項化做出決定,這將構成您的專案或組織標準。
另外兩個領域需要管理層做出關於標準化的決策。指南 3.1.4 建議您避免在物件或單元名稱中使用任意縮寫。您應該為允許使用應用程式特定術語的較短版本的專案準備一份可接受縮寫的詞彙表(例如,FFT 表示快速傅立葉變換或 SPN 表示隨機佩特里網)。您應該保持此詞彙表簡短,並將其限制在需要作為名稱一部分頻繁使用的術語。必須不斷參考冗長的詞彙表才能理解原始碼,這使得閱讀變得困難。
第 7 章中給出的可移植性指南需要仔細注意。即使目前沒有預見到移植所得軟體的需要,遵守這些指南也很重要。遵循這些指南可以提高所得程式碼在使用不同 Ada 實現的專案中的潛在可重用性。您應該堅持,當特定專案需求迫使放寬某些可移植性指南時,原始碼的不可移植特性會得到突出顯示。遵守第 7 章中的指南需要定義和標準化專案或組織特定的數值型別,以代替(可能不可移植的)預定義數值型別。
您關於標準化問題的決策應納入專案或組織編碼標準文件中。有了編碼標準,您需要確保遵守這些標準。獲得您的程式設計人員全心全意地承諾使用這些標準至關重要。鑑於這種承諾以及您的程式設計師生產的高質量 Ada 程式碼的示例,進行有效的正式程式碼審查以檢查對專案標準的合規性將變得容易得多。
Hefley 等人 (1992) 討論了一些關於 Ada 專案管理的一般問題。
此處提供的許多指南都足夠具體,可以作為公司或專案的程式設計標準。其他一些指南需要在作為標準使用之前做出關於特定例項化的管理決策。在這種情況下,會提供一個示例例項化並在所有示例中使用。此類例項化應被視為比指南本身更弱的建議。在某些情況下,如果示例是從已發表的作品中提取的,則作者的風格將保持不變。
本書中提供的其他指南有意以需要考慮的設計選擇的形式表達。這些指南不能作為專案必須遵循的硬性規則來例項化。例如,您不應將指南 6.1.1 和 6.1.2 解釋為專案禁止使用任務。相反,這些指南旨在幫助設計人員在使用受保護物件和任務之間進行權衡,從而引導設計人員在這些特性之間做出更明智的選擇。
本文件中的指南並非旨在獨立作為標準。在某些情況下,不清楚是否可以強制執行指南,因為它僅旨在讓工程師瞭解權衡。在其他情況下,關於指南仍然存在選擇,例如每個縮排級別使用多少空格。
當指南過於籠統而無法顯示示例時,每個指南的“例項化”部分包含更具體的指南。這些例項化可以被視為標準,並且更有可能得到執行。任何試圖從本文件中提取標準的組織都需要評估完整的上下文。每條指南在相關的指南被實踐時效果最佳。如果孤立地使用,指南可能幾乎沒有或沒有益處。
過渡問題分為兩大類:語言之間不相容性,特別是向上相容性,以及新語言特性的利用。
Ada 95 的向上相容性是該語言的主要設計目標。在實踐中可能發生的 Ada 83 和 Ada 95 之間少量的不相容性很容易克服(參見 Ada 95 Rationale [1995] 附錄 X,標題為向上相容性)。有關相容性問題的詳細資訊,請參見 Taylor (1995) 和 Intermetrics (1995)。
過渡規劃人員可以透過本書以兩種方式深入瞭解語言特性的利用。首先,表 1 顯示了新的 Ada 95 語言特性對風格指南章節的影響。其次,附錄 A 將 Ada 參考手冊 (1995) 的章節對映到特定的風格指南。
本風格指南使用以下排版約定
- 襯線字型 資訊的一般呈現。
- 斜體襯線字型 出版物標題和強調。
- 粗體襯線字型 章節標題。
- 粗體無襯線字型 指南、例項化、示例、基本原理、註釋、異常、自動化註釋、警告以及摘要部分中的子標題的子標題。
- 打字機字型:
Syntax of code.