10

単純なC#WindowsフォームアプリケーションでUIとビジネスロジックを分離する方法についてアドバイスをお願いします。

この例を見てみましょう:

UIは、単純なテキストボックスとボタンで構成されています。ユーザーは0から9までの数字を入力し、ボタンをクリックします。プログラムは数値に10を追加し、その値でテキストボックスを更新する必要があります。

ここに画像の説明を入力してください

ビジネスロジックの部分は、UIを認識していないはずです。これはどのように達成できますか?

空のプロセスクラス(ビジネスロジック)は次のとおりです。

namespace addTen
{
    class Process
    {
        public int AddTen(int num)
        {
            return num + 10;
        }
    }
}

要件は次のとおりです。

  1. ユーザーがボタンをクリックすると、どういうわけか、Process::AddTenが呼び出されます。
  2. テキストボックスは、Process::AddTenの戻り値で更新する必要があります。

この2つを接続する方法がわかりません。

4

4 に答える 4

8

まず、クラス名を変更する必要があります。「プロセス」はクラスライブラリ内のクラスの名前であり、コードを読んでいる人を混乱させる可能性があります。

この回答の残りの部分で、クラス名をMyProcessorに変更したと仮定します(まだ悪い名前ですが、よく知られている、頻繁に使用されるクラスではありません)。

また、ユーザー入力が実際に0〜9の数値であることを確認するためのコードが欠落しています。これは、クラスコードではなくフォームのコードで適切です。

  • TextBoxの名前がtextBox1であると仮定します(フォームに追加された最初のTextBoxに対してVSで生成されたデフォルト)
  • さらに、ボタンの名前がbutton1であると仮定します

Visual Studioで、ボタンをダブルクリックして、次のようなボタンクリックイベントハンドラーを作成します。

protected void button1_Click(object sender, EventArgs e)
{

}

イベントハンドラー内に、次のようにコードを追加します。

 protected void button1_Click(object sender, EventArgs e)
 {
   int safelyConvertedValue = -1;
   if(!System.Int32.TryParse(textBox1.Text, out safelyConvertedValue))
   {
     // The input is not a valid Integer value at all.
     MessageBox.Show("You need to enter a number between 1 an 9");
     // Abort processing.
     return;
   }

   // If you made it this far, the TryParse function should have set the value of the 
   // the variable named safelyConvertedValue to the value entered in the TextBox.
   // However, it may still be out of the allowable range of 0-9)
   if(safelyConvertedValue < 0 || safelyConvertedValue > 9)
   {
     // The input is not within the specified range.
     MessageBox.Show("You need to enter a number between 1 an 9");
     // Abort processing.
     return;
   }

   MyProcessor p = new MyProcessor();
   textBox1.Text = p.AddTen(safelyConvertedValue).ToString();
 }

アクセス修飾子が適切に設定されているクラスは、次のようになります。

namespace addTen       
{       
    public class MyProcessor
    {       
        public int AddTen(int num)       
        {       
            return num + 10;       
        }       
    }       
}    
于 2012-07-18T17:58:28.323 に答える
3

たとえば、「Process.cs」という別のクラスを作成できます。そこに移動する処理またはデータ計算を伴うメソッド。あなたの場合、例えば:

public class Process
{
 public int AddTen(int num)
 {
   return num + 10;
 }
}

UIクリックイベントには、「プロセスレイヤー」への呼び出しがあります。

 var myProcess = new Process();
  //and then calculation
  var initNumber = Convert.ToInt32(textBox.Text);
  var calculatedValue = myProcess.AddTen(initNumber);

  textBox.Text = calculatedValue.ToString();

このようにして、計算などのビジネスロジックは個別に保持されます。UIが変更された場合でも、Web、Windows、またはモバイルフォームのいずれであっても、myProcess.AddTen()メソッドを呼び出すだけで済みます。

于 2012-07-18T18:03:42.957 に答える
2

'Process'クラスを公開します(@DavidStrattonが言うように、名前を変更します):

public class MyProcess

私はあなたがstringからあなたの値を解析TextBox.Textするべきだと思いますint

private void button1_Click(object sender, EventArgs e)
{
    MyProcess myProcess = new MyProcess();
    string result = textBox1.Text;
    int number;

    if(int.TryParse(textBox1.Text, out number))
    {
        result = myProcess.AddTen(number).ToString();
    }

    textBox1.Text = result;
}
于 2012-07-18T18:02:53.020 に答える
0

ロジックを完全に分離するために、ボタンを含み、ハンドラーを管理できる基本クラスを宣言できます。特定のプロセスは基本クラスを継承でき、ロジックを設定できます。最後に、フォームはクラスのインスタンスを宣言し、ボタンを渡すことができます。

これは次のようになります。

class BaseProcessor
{

    System.Windows.Forms.Button myButton;
    public System.Windows.Forms.Button MyButton
    {
        get
        {
            return myButton;
        }
        set
        {
            myButton = value;
            myButton.Click += new System.EventHandler(this.MyButton_Click);
       }
    }

    public BaseProcessor()
    {
    }

    public virtual void MyButton_Click(object sender, EventArgs e)
    {
    }

次に、プロセスを宣言します。

class MyProcess : BaseProcessor
{

    public override void MyButton_Click(object sender, EventArgs e)
    {
        MessageBox.Show("This is my process");
    }
}

次に、フォーム内でプロセスのインスタンスを宣言し、ボタンを添付します。

public partial class Form1 : Form
{

    MyProcess myProcess = null;

    public Form1()
    {
        InitializeComponent();

        myProcess = new MyProcess
        {
            MyButton = button1
        };
    }

}

この方法を使用すると、フォームにビジネスロジックコードはありません。私の意見では、ボタンのクリックなどのイベントは非常に一般的であるため、親クラスは便利です。

于 2019-01-09T16:07:10.573 に答える