命令行界面設計

轉載信息

轉自子清行:命令行界面設計,原作者保留所有權利。

正文

雖然已存在大量關於圖形用戶界面(GUIs)設計的文章,可是介紹命令行界面(CLIs)設計的卻很少。本文嘗試介紹幾個關於CLI設計最重要的準則。

本文假設該命令行工具用於 *nix 系統(例如 GUN/Linux、BSD、Mac OS X,UNIX),並且會頻繁地參考這些系統中的常用工具。

命令行界面類型

命令行界面主要有三種:

  • 非交互
  • 基於行的交互
  • 文本用戶界面

非交互式程序在調用後不再需要任何用戶干預。諸如 ls、mv 和 cp。

基於行的交互式程序在執行期間經常需要與用戶交互。它們會往標準輸出中寫入文本信息,還可能會請求用戶通過標準輸入來輸入信息。屬於這類的程序有 ed 和 metasploit。

文本用戶界面介於 GUI 和 CLI 之間。它們在終端仿真器裏運行了一個圖形用戶界面。例如 nethack 和 vi。許多(但非全部)在 ×nix 上的文本用戶界面都是使用 curses 或較新的 ncurses。

本文重點關注非交互式程序,而文本用戶界面幾乎沒有涉及。

命令行界面的優勢

都 21 世紀了,爲什麼還用命令行界面?圖形用戶界面早在十幾年前就發明了!

時至今日,許多命令行界面仍擁有幾個勝過圖形用戶界面的優勢。它們在超級用戶、程序員以及系統管理員中間很流行;部分原因是許多優勢很適合他們的品味:

  • 易於自動化:使用腳本,很多命令行程序都能輕鬆實現自動化;
  • 快速地啓動:許多命令行程序多次在啓動時間上擊敗它們同類的 GUI 程序;
  • 易於遠程調用:也許只是我而已,但我更喜歡通過 SSH 或 VNC 遠程控制計算機;
  • 對系統要求較低:這使得 CLI 在嵌入式系統中更有用;
  • 更高的效率:只需鍵入一些字符就能做很多事情,而不必在菜單中搜索,提高你的工作效率;
  • 對鍵盤友好:抓着鼠標容易分心。

命令行界面的劣勢

已經羅列了命令行界面的優勢,最好也給出它們的劣勢。最主要的缺點是學習曲線比較陡峭,很多情況下你不得不去翻手冊;而使用 GUI 產品時你能自己估計出很多東西。

在顯示和編輯圖形化信息時 GUIs 也有優勢。包括照片處理和看電影(我總希望有個程序能將電影實時地轉換成 ASCII 字符圖片並在我的終端裏展示,這會非常得酷)。

避免使用交互

相較於非交互式用戶界面,交互式界面更難自動化。易於自動化是命令行界面最大的優點,如果讓你的工具採用交互式界面,就會失去這個優點。

個別情況下交互式工具會比非交互式更合理,但至少不要在這個優勢不明顯的時候這樣做。你的工具不應該要求用戶(交互式地)輸入那些很容易以參數形式傳遞給程序的東西。

命名你的工具

我想要強調給每個命令行工具取一個好名字的重要性。因爲一個壞的名字很容易被忘記,意味着用戶將不得不花更多的時間去查尋。

名字要短。長的名字不方便輸入,所以別管你的版本控制程序叫“my-aswsome-version-control-program”。給它取個短一些的名字,例如 avc(Awesome Version Control)

名字還要容易記。別取ytzxzy這樣的名字。

參數

對於參數有很多可以說。首先,按照標準習慣,單字母選項用一個連字號做前綴,並且可以直接跟隨多個(比如 -la 和 -l -a 是一個意思)。多字母選項由兩個連字號做前綴,並寫每個參數之間必須用空格隔開。參看 ls 或 cp 的參數,遵循它們的工作方式。dd 沒有遵循標準,因此常遭人詬病。

繼續標準習慣的主題,如果有一個與你的程序功能類似的工具(或者是同一分類的工具,例如都屬於文件管理)用一些選項來做某些事情,將它的行爲複製到你的程序中會是一個不錯的主意。看看大多數 *nix 文件管理工具,例如 mv、cp 和 rm,它們都提供了 -i 選項,並提供相同的行爲:要求用戶確認操作。它們同樣都提供了 -f 選項來強制執行(這讓計算機開啓來很蠢,不過你在使用選項的時候知道自己在做什麼,不是嗎?)。

顧名思義,選項(options)應該是可選的(optional)。但它有時會被人遺忘。命令行工具應該允許不帶任何參數就可執行。比如 cd,沒有參數時返回到自己的家目錄。有些程序沒有參數的話可能沒有意義,比如 mv,但大多數情況,你都能找到有意義的標準的行爲(不過請記住,只單單輸出錯誤信息並退出也比做些用戶不期望發生的傻事要好(哦,你沒有給 rm 任何選項,那最好刪除c磁盤上所有的文件,以保證你要刪除的文件會被刪掉))。

在 *nix 世界裏有個習慣:任何在雙連字號之後的東西都將被看成文件名,即使名字中包含了連字號(比如 cmd – -FILE-)。如果參數列表以單個連字號結尾,就從標準輸入中讀取。

小心使用那些只是大小寫不同的標記(比如 -R 和 -r),它們很難記。

總是提供與短參數相應的長參數。不要只提供 -i,也要一起提供 –interactive。

提供 –version 和 –help

這兩個選項你應該總是包含在你的程序中:--version--help。第一個選項輸出程序的版本信息;第二個介紹這是一個什麼程序,如何使用以及目前常用的——如果不是所有——選項。

讀取輸入

確保你的程序可以從管道或通過文件重定向中讀取數據

如果文件名作爲參數傳遞給程序,就讀取文件的內容作爲輸入。如果沒有提供這樣的參數,就從標準輸入中讀取,一直到 CTRL+D

此時無聲勝有聲

如果程序沒什麼重要的事情要說,就保持安靜(人也適用)。當我執行 mv 時,我不希望它告訴我它已將一個文件移到另一個地方去了。畢竟,這不正是我讓它做的事情麼?這對我來說是確信無疑的,所以不需要顯式地告訴我。當那些並不期望發生的事情發生了,才應該打破沉默。例如我想移動的文件不存在,或者我在目標目錄下沒有寫的權限。

要注意,你的程序不需要在每次調用的時候都輸出它的版本號、版權信息,或作者的名字。這些只是額外的噪音,浪費空間,使用遠程會話時浪費帶寬,還可能導致輸出很難被自動處理,比如將它們通過管道轉發給其他程序。

同樣的,也不要強調這些輸出是什麼。用戶應該知道自己在用什麼程序。whoami 僅僅輸出當前用戶的名字。如果輸出“The name of the current user is: x”,那單純提取名字就會更費功夫。

很多程序提供-v(verbose)選項讓程序變得更囉嗦;還有一個-q(quiet)選項讓程序閉嘴(可能除了一些致命錯誤)。默認行爲不應是完全沉寂,而是大多數情況下保持沉默。程序只在適當的時候輸出一些東西

如果讓用戶輸入 yes 或 no

有時,你的程序可能出於不同的原因需要詢問 yes 或 no。最常見的是要求用戶確認(do you really want to do this?);或者可能是計算機試着提供問題的解決方法(Table USERS doesn’t exist, do you want me to create it for you?)。

當問題的答案要麼是 yes 或是 no(或者 y 和 n),你應該給問題後面給出(y/n)

Do you really want to do this (y/n)?

多數程序要求你在鍵入字母后手工敲回車。雖然這顯得多餘,但大多數程序都這麼做,爲了保持一致,讓用戶不要感到驚訝,你的程序也應該要求用戶這樣做。

告訴我你想要什麼樣的輸入

如果你的程序請求輸入一個日期,但又不告訴我該怎麼輸入,我就會很困惑:

Enter a date:

能提示我要輸入日期的格式,就不會造成困擾了:

Enter a date (YYYY-MM-DD):

同樣的,如果程序只是要求輸入一個長度,我就不曉得它會是千米、米、英里、英尺……?當一個東西有不同的單位時,就該把單位告訴我。

每個程序只做一件事情,並把它做好

這是 UNIX 哲學中最重要部分的其中一條,並經歷過時間的考驗。作爲一條很好的建議,它的歷史可以追溯到上世紀60年代後期或70年代初期。在實踐中,這意味着你不該創造一個文件管理程序,而應創造一個程序用於刪除文件,另一個用於移動文件,還有一個用於複製文件。

在“只做一件事”的副作用中,你更需要關注“做好一件事”這一點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章