2009-10-21 106 views
1

想象你有一個創建/複製/移動文件的功能。 [邏輯]分離邏輯/ GUI和用戶交互

對於已經創造了應該複製一個文件/存在,你想要求用戶覆蓋該文件或情況並非如此。[(G)UI]

你是什麼方法如果(G)用戶界面和邏輯完全分離,那麼實現這一點?

我想到的第一件事就是MVC模式,但這意味着無論我需要用戶交互,我都必須使用它。

其他建議?

順便說一句:你會如何實現這個非OO語言?

+0

任何暗示,以什麼語言?它確實有所作爲。 – 2009-10-21 09:15:04

+0

不知道...... C例如。 (或任何你想要的語言:)) – Inno 2009-10-21 09:18:43

+0

我的答案是用C編寫的,但主要處理非OO方法。 – 2009-10-21 09:23:12

回答

0

我可以看到兩種方式:

  • 你有兩個功能,file_exists(...)copy_file(...)。 UI端始終首先調用file_exists,並詢問用戶是否複製該文件是否已經存在。
  • 您只有一個功能copy_file(bool force, ...),如果文件存在,默認情況下會失敗。所以UI端調用函數的默認版本,檢查它是否失敗,以及爲什麼,如果是因爲文件已經存在,請詢問用戶並使用force=true重試。
0

在非OO語言中,我會實現某種事件隊列,父母(或孩子,取決於您的設計)UI在「忙」標誌爲true時輪詢事件。這樣的事件讓對方做其他工作,同時等待「他們回答」的標誌實現。當然,必須遵守雙方的一些暫停以及相互排斥。基本上,這裏暗示了非阻塞I/O原理或您最喜歡的實際無鎖編程理論。

有程度的分離..進程可以溝通。根據您選擇的語言,您通過關係數據庫與原始信號共享內存段,信號量或IPC。對於這樣一個通用的問題,很難更具體。

看到我的評論,需要更多的信息,這樣就可以製作出符合您選擇的語言的答案。

0

我想到的第一件事就是MVC模式,但這意味着我必須在需要用戶交互的任何地方使用它。

這是一件壞事,爲什麼?分離的GUI和邏輯是正好什麼是MVC模式。不要因爲它有一個很長的名字而感到害怕 - 只要你將GUI和邏輯分開,你至少有一個「視圖」和一個「控制器」,如果不是「模型」的話 - 如果你的應用程序有狀態,你也有一個模型。你可能還沒有承認自己呢。

+0

沒什麼不好的,好像有點矯枉過正,你不覺得嗎?如果沒有,恕我直言,沒有理由不實施使用MVC模式的所有(G)UI應用程序... – Inno 2009-11-03 10:37:04

0

從我所看到的,實際上有兩個問題:

  1. 我們有一個算法(邏輯)中,我們希望(通過UI例如用戶)推遲一些操作和決定到別的東西。
  2. 我們希望避免算法與其他事物之間的緊密耦合。

如果我們使用OO語言,有幾個設計模式可以解決這兩個具體問題。

  • 模板方法模式可以解決#1。它不能很好地解決#2問題,因爲典型的實現是通過繼承來實現的。
  • 觀察者模式看起來也很有希望。

所以真的是選擇和混合最簡單的需求和最適合的語言。

在實際應用中,如果談及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++中我引用了一個類。

1

如果GUI和邏輯真的分開,那麼這個問題就不應該出現。根據設計,程序應根據具有默認值的選項覆蓋或不覆蓋。如果GUI可用,則可以設置該選項。實際上,雖然顯而易見的方法是僅僅擁有它並開始複製,但您可以首先查找衝突,然後檢查目標設備是否有足夠的空閒存儲空間。然後,如果出現問題,請不做任何處理,除非有GUI,否則您可以報告問題並詢問是否繼續。

如果您希望設計一個可逐個文件地調用GUI的設計,那麼將其作爲一組n個進程來設計,每個進程複製一個文件,並且提供可選的GUI在錯誤報告部分。 GUI然後可以重新激活複製一個文件邏輯。

0

怎麼樣這種方法[僞代碼]:

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 
    // 

}