1

ファイルを作成/コピー/移動する関数があると想像してください。[論理]

コピー/作成する必要のあるファイルが既に存在する場合は、ファイルを上書きするかどうかをユーザーに確認してください。[(G)UI]

(G)UIとロジックが完全に分離されている場合、これを実装するためのアプローチは何ですか?

最初に頭に浮かぶのはMVCパターンですが、これは、ユーザーとの対話が必要な場所でMVCパターンを使用する必要があることを意味します。

他に何か提案はありますか?

ところで:これを非OO言語でどのように実装しますか?

4

6 に答える 6

1

GUIとロジックが実際に分離されている場合、この質問は発生しないはずです。プログラムは、設計上、デフォルト値のオプションに基づいて上書きするか、上書きしないようにする必要があります。GUIが利用可能な場合は、オプションを設定できます。

実際、明らかなアプローチは、それを手に入れてコピーを開始することですが、最初のパスで競合を探し、ターゲットデバイスに十分な空きストレージがあることを確認することができます。次に、問題がある場合は、何もせずに終了します。ただし、GUIがない場合は、問題を報告して、続行するかどうかを尋ねることができます。

GUIをファイルごとに呼び出すことができる設計が必要な場合は、その周りのロジックを、それぞれが1つのファイルをコピーするn個のプロセスのセットとして設計し、オプションのGUIをエラーレポートで使用できるようにします。セクション。その後、GUIはファイルを1つコピーするロジックを再度呼び出すことができます。

于 2009-10-23T14:22:49.970 に答える
0

最初に頭に浮かぶのはMVCパターンですが、これは、ユーザーとの対話が必要な場所でMVCパターンを使用する必要があることを意味します。

そして、これはなぜ悪いことですか?GUIとロジックを分離することは、まさにMVCパターンの目的です。名前が長いからといって怖がらないでください。GUIとロジックを分離するとすぐに、少なくとも「モデル」ではないにしても、「ビュー」と「コントローラー」ができます。アプリケーションに状態がある場合は、モデルもあります。あなたはまだそれを自分自身に認めていないかもしれません。

于 2009-10-22T11:43:14.053 に答える
0

私は2つの方法を見ることができます:

  • 2つの関数がfile_exists(...)ありcopy_file(...)ます。UI側は常にfile_exists最初に呼び出し、ファイルをコピーするかどうかをユーザーに尋ねます。ファイルはすでに存在します。
  • 関数は1つだけでcopy_file(bool force, ...)、ファイルが存在する場合はデフォルトで失敗します。そのため、UI側は関数のデフォルトバージョンを呼び出し、失敗したかどうかを確認します。ファイルが既に存在するために失敗した場合は、ユーザーに確認して、を使用して再試行しforce=trueます。
于 2009-10-21T09:11:34.703 に答える
0

非OO言語では、親(または設計によっては子)UIが「ビジー」フラグがtrueのときにイベントをポーリングする、ある種のイベントキューを実装します。このようなイベントにより、反対側は「彼らが答えた」フラグが実現するのを待っている間に他の作業を行うことができます。もちろん、相互排除だけでなく、両方向のタイムアウトも監視する必要があります。基本的に、ここではノンブロッキングI/Oの原則または実用的なロックフリープログラミングに関するお気に入りの理論を暗示しています。

分離の程度があります..プロセスは通信できます。選択した言語に応じて、プリミティブ信号を使用するリレーショナルDBを介して、メモリセグメント、セマフォ、またはIPCを共有します。このような一般的な質問でより具体的にするのは難しいです。

私のコメントを参照してください。選択した言語で機能する回答を作成できるように、もう少し情報が必要です。

于 2009-10-21T09:14:37.120 に答える
0

私が見ることができることから、本当に2つの問題があります:

  1. 一部の操作と決定を他の何か(たとえば、UIを介したユーザー)に延期したいアルゴリズム(ロジック)があります。
  2. アルゴリズムと他の何かとの間の緊密な結合を避けたいと思います。

オブジェクト指向言語を使用する場合、これら2つの特定の問題に対処するいくつかの設計パターンがあります。

  • テンプレートメソッドパターンは#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 ++では、私が推測するクラスへの参照です。

于 2009-10-22T13:03:02.023 に答える
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
    //

}
于 2009-11-03T10:31:20.347 に答える