Filesystem 庫的設計

簡介
要求
現實
原理
被放棄的設計
參考

簡介

開始的時候,Filesystem 庫的主要動機是 Boost 管理工具存在的問題。各種腳本是用 Python, Perl, Bash, 和 Windows 命令語言編寫的。沒有一種腳本語言對於所有 Boost 管理員而言都是熟悉和可接受的。然而,他們都是熟練的 C++ 程序員 - 為什麼不能用 C++ 來作為腳本語言?

C++ 中缺乏的腳本程序特性主要是在多種文件系統上操作目錄及其內容的能力。Filesystem 庫的開發填補了這一空白。

本庫的目標不是與傳統的腳本語言進行競爭,而是要在已經選定 C++ 的前提下提供一個解決方案。

要求

現實

原理

以上 要求 現實 決定了許多 C++ 接口設計。特別地,對編寫類似於腳本代碼的期望,直接導致了大量的努力,以保證象 exists( "foo" ) 這樣的簡單表達式可以如所期望的那樣。

有關詳細設計決定背後的原理,請見 FAQ.

以下是 path 類設計的幾個關鍵點:

錯誤檢查是特別困難的地方。一個關鍵是對於文件名和目錄名,可移植性不是普遍真理。反之,程序員必須解決"我想要把這個路徑移植到什麼操作系統上?"的問題。通過為這個問題提供多種答案的支持,Filesystem 庫提醒程序員必須第一時間提出這個問題。

被放棄的設計

operations.hpp

Dietmar Kuhl 原本的 dir_it 設計和實現支持寬字符文件和目錄名。在 Library Working Group 成員展開討論後,由於在不提供寬字符原生支持的系統上無法確定可移植的語義,該設計被放棄了。請見 FAQ.

早期的接口設計中,使用了顯式命名函數來提供大量便利操作,不帶編譯期或運行期的選項。存在著大量的函數名,使用起來非常混亂,而且接口也更大。所得的好處看起來理論大於實際。

基於編譯期(而不是運行期)的標誌和選項(通過策略、枚舉或整型模板參數)的設計由於過於複雜而被放棄,它們通常要花費較多的時間和努力。由於需要 用名字空間甚至別名來限定屬性或選項的名字,這使得將它們用作模板參數時非常難看;不真正寫一下代碼你是無法完全認識到這一點的。

還有另一組便利函數(如帶權限的 remove, prune, recurse, 以及其它選項,加上謂詞,還有其它可能的過濾特性),由於其細節過於複雜和存在爭議而被放棄了。

剩下的就是一組低層操作的工具集,用戶可以從中創建更複雜的便利操作,還有少量便利函數,用戶會發現它們剛好夠用。

path.hpp

有許多被放棄的路徑設計,我沒有把它們都記下來。有幾類是基於策略的類模板的,提供給構造函數的運行期策略,與操作相關的運行期策略,它們都被考慮並實現過,但最終都由於太過複雜且好處不多而被放棄。

另外一個被考慮的設計是 國際化

錯誤檢查

有不少錯誤檢查機制的設計被放棄,有一些是在嘗試後放棄的。特別嘗試了完全自動的錯誤檢查。但是自動錯誤檢查會使得整個庫的設計變得過於複雜。

有些設計帶有對路徑的錯誤檢查。有些則帶有對操作函數的錯誤檢查。一個基於策略的錯誤檢查模板設計被部分地實現,然後由於它對於每天的腳本程序編程而言過於複雜而被放棄了。

最終的設計,部分依賴於顯式的錯誤檢查函數調用,這更為簡單,雖然它的確一定程度上依賴於程序員的自律。但是它允許關心可移植性的程序員可以非常確定他們的程序可以正確地工作在他們所選擇的目標系統上。

參考

[IBM-01] IBM Corporation, z/OS V1R3.0 C/C++ Run-Time Library Reference, SA22-7821-02, 2001, www-1.ibm.com/servers/eserver/zseries/zos/bkserv/
[ISO-9660] International Standards Organization, 1988
[Kuhn] UTF-8 and Unicode FAQ for Unix/Linux, www.cl.cam.ac.uk/~mgk25/unicode.html
[MSDN] Microsoft Platform SDK for Windows, Storage Start Page, msdn.microsoft.com/library/en-us/fileio/base/storage_start_page.asp
[POSIX-01] IEEE Std 1003.1-2001, ISO/IEC 9945:2002, and The Open Group Base Specifications, Issue 6. Also known as The Single UnixR Specification, Version 3. Available from each of the organizations involved in its creation. For example, read online or download from www.unix.org/single_unix_specification/. The ISO JTC1/SC22/WG15 - POSIX homepage is www.open-std.org/jtc1/sc22/WG15/
[URI] RFC-2396, Uniform Resource Identifiers (URI): Generic Syntax, www.ietf.org/rfc/rfc2396.txt
[UTF-16] Wikipedia, UTF-16, en.wikipedia.org/wiki/UTF-16
[Wulf-Shaw-73] William Wulf, Mary Shaw, Global Variable Considered Harmful, ACM SIGPLAN Notices, 8, 2, 1973, pp. 23-34

Revised 02 August, 2005

c Copyright Beman Dawes, 2002

Use, modification, and distribution are subject to the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at www.boost.org/LICENSE_1_0.txt)