通過這段時間的思考,經過實際編碼的驗證,總結了一下幾條設計技巧,記錄備忘。
1 模組要提供讓外部調用者可以擷取模組內部運行資訊的手段
在模組設計中,模組內部的運行資訊通過回調的形式,給模組外部調用者提供查詢模組運行狀態的手段。最常見用途的可能就是作業記錄了。回呼函數是個好東西,在C/C++裡叫做函數指標,在.net裡叫做事件。
這種模組內部的暴露只是暴露運行資訊,而不要把內部成員暴露出來,否則就與模組的低耦合(類的封裝)相違背了。
以C#為例:
using System;namespace ConsoleApplication1{ class Program { static void Main(string[] args) { A a = new A(); a.log += a_log; a.Test(); } static void a_log(object sender, string e) { Console.WriteLine(DateTime.Now.ToString("u") + " " + e); } } class A { public event EventHandler<String> log; private void OnLog(String msg) { if (log != null) { log(this, msg); } } public void Test() { OnLog("begin do something..."); //do something OnLog("done."); } }}
2 設定檔、UI、程式運行狀態的關係
為了讓介面和功能分離,UI不要直接控製程序的運行狀態,而是要在UI和程式狀態之間加入一個設定檔層。即
UI-----設定檔------程式初始狀態
設定檔一般都採用xml格式。這樣就需要制定xml設定檔的規範,有了這個規範,UI和程式設計就可以獨立進行了。當然一開始,往往不太容易很明確的確定設定檔規範,需要一個迭代的過程。
這樣做帶來的好處是顯而易見的,最明顯的就是程式的可移植性。因為移植最難的地方也就是UI了,既然UI與程式本身沒有直接聯絡了,所以移植非常簡單。
要做到這種分離方式,必須保證設定檔的規範性。一旦這個規範修改了,UI和程式都需要相應的修改。
虛擬碼如下:
// 功能類 class A { private String filePath; //設定檔路徑 public static A FromXml(); //從xml設定檔初始化功能模組 } //介面類 class UI { private String filePath; //設定檔路徑 public void FromXml(); //從xml設定檔初始化UI public void ToXml(); //儲存當前UI配置為設定檔 }