想象你有一個創建/複製/移動文件的功能。 [邏輯]分離邏輯/ GUI和用戶交互
對於已經創造了應該複製一個文件/存在,你想要求用戶覆蓋該文件或情況並非如此。[(G)UI]
你是什麼方法如果(G)用戶界面和邏輯完全分離,那麼實現這一點?
我想到的第一件事就是MVC模式,但這意味着無論我需要用戶交互,我都必須使用它。
其他建議?
順便說一句:你會如何實現這個非OO語言?
想象你有一個創建/複製/移動文件的功能。 [邏輯]分離邏輯/ GUI和用戶交互
對於已經創造了應該複製一個文件/存在,你想要求用戶覆蓋該文件或情況並非如此。[(G)UI]
你是什麼方法如果(G)用戶界面和邏輯完全分離,那麼實現這一點?
我想到的第一件事就是MVC模式,但這意味着無論我需要用戶交互,我都必須使用它。
其他建議?
順便說一句:你會如何實現這個非OO語言?
我可以看到兩種方式:
file_exists(...)
和copy_file(...)
。 UI端始終首先調用file_exists
,並詢問用戶是否複製該文件是否已經存在。copy_file(bool force, ...)
,如果文件存在,默認情況下會失敗。所以UI端調用函數的默認版本,檢查它是否失敗,以及爲什麼,如果是因爲文件已經存在,請詢問用戶並使用force=true
重試。在非OO語言中,我會實現某種事件隊列,父母(或孩子,取決於您的設計)UI在「忙」標誌爲true時輪詢事件。這樣的事件讓對方做其他工作,同時等待「他們回答」的標誌實現。當然,必須遵守雙方的一些暫停以及相互排斥。基本上,這裏暗示了非阻塞I/O原理或您最喜歡的實際無鎖編程理論。
有程度的分離..進程可以溝通。根據您選擇的語言,您通過關係數據庫與原始信號共享內存段,信號量或IPC。對於這樣一個通用的問題,很難更具體。
看到我的評論,需要更多的信息,這樣就可以製作出符合您選擇的語言的答案。
我想到的第一件事就是MVC模式,但這意味着我必須在需要用戶交互的任何地方使用它。
這是一件壞事,爲什麼?分離的GUI和邏輯是正好什麼是MVC模式。不要因爲它有一個很長的名字而感到害怕 - 只要你將GUI和邏輯分開,你至少有一個「視圖」和一個「控制器」,如果不是「模型」的話 - 如果你的應用程序有狀態,你也有一個模型。你可能還沒有承認自己呢。
沒什麼不好的,好像有點矯枉過正,你不覺得嗎?如果沒有,恕我直言,沒有理由不實施使用MVC模式的所有(G)UI應用程序... – Inno 2009-11-03 10:37:04
從我所看到的,實際上有兩個問題:
如果我們使用OO語言,有幾個設計模式可以解決這兩個具體問題。
所以真的是選擇和混合最簡單的需求和最適合的語言。
在實際應用中,如果談及C#例如,我們可以實現模板方法和觀察混合是這樣的:
// This will handle extensions to the FileCopy algorithm
abstract class FileCopyExtention
{
public abstract Response WhatToDoWhenFileExists();
}
// the copy function, pure logic
public static void Copy(string source, string destination, FileCopyExtention extension)
{
if (File.Exists(destination))
{
var response = _extension.WhatToDoWhenFileExists();
if (response == overwrite)
// overwrite the file
else
// error
}
}
// This is our user-interactive UI extension
class FileCopyUI : FileCopyExtention
{
public override Response WhatToDoWhenFileExists()
{
// show some UI, return user's response to the caller
}
}
// the program itself
void Main()
{
Copy("/tmp/foo", "/tmp/bar", new FileCopyUI());
}
爲主題的變化,您可以使用事件,委託或任何語言你所選擇的提供。
在C中,這可能是一個函數指針,在C++中我引用了一個類。
如果GUI和邏輯真的分開,那麼這個問題就不應該出現。根據設計,程序應根據具有默認值的選項覆蓋或不覆蓋。如果GUI可用,則可以設置該選項。實際上,雖然顯而易見的方法是僅僅擁有它並開始複製,但您可以首先查找衝突,然後檢查目標設備是否有足夠的空閒存儲空間。然後,如果出現問題,請不做任何處理,除非有GUI,否則您可以報告問題並詢問是否繼續。
如果您希望設計一個可逐個文件地調用GUI的設計,那麼將其作爲一組n個進程來設計,每個進程複製一個文件,並且提供可選的GUI在錯誤報告部分。 GUI然後可以重新激活複製一個文件邏輯。
怎麼樣這種方法[僞代碼]:
UIClass
{
//
// Some code
//
bool fileCopied = false;
do {
try {
fileCopied = CopyFile(fileName);
} catch (FileExists) {
//
// Ask "File exists! Overwrite?" If "No", exit do-loop
//
} catch (FileLocked) {
//
// Ask "File Locked! Repeat?", If "No", exit do-loop
//
} catch (etc...) {
//
// etc.
//
}
} while (!fileCopied);
//
// Some code
//
}
LogicClass
{
//
// Some code
//
bool CopyFile(string fileName)
{
//
// copy file
//
}
//
// Some code
//
}
任何暗示,以什麼語言?它確實有所作爲。 – 2009-10-21 09:15:04
不知道...... C例如。 (或任何你想要的語言:)) – Inno 2009-10-21 09:18:43
我的答案是用C編寫的,但主要處理非OO方法。 – 2009-10-21 09:23:12