31 Desember 2014

Contoh MVC : Kalkulator

Model-view-controller (MVC) adalah pola yang digunakan untuk mengisolasi logika dari antarmuka pengguna. Menggunakan MVC, Model merupakan informasi (data) dari aplikasi dan aturan yang digunakan untuk memanipulasi data, View sesuai dengan elemen user interface seperti teks, item kotak centang, dan sebagainya, dan Controller mengelola rincian melibatkan komunikasi antara model dan view. Controller menangani tindakan pengguna seperti keystrokes dan gerakan mouse ke dalam model atau tampilan yang diperlukan.

Figure4.gif
Di sini saya akan menunjukkan contoh kalkulator dalam arsitektur MVC. Sebuah gambaran singkat; Formulir akan menangani view dan event yang akan diteruskan ke kontroler yang kemudian akan memanggil method pada model, seperti Tambah / Kurangi / NumberPress. Model mengurus semua pekerjaan dan memegang event saat ini kalkulator. Hal yang sulit tentang MVC adalah tempat yang terpisah dapat membingungkan.

Ciri khas pola Instansiasi MVC terlihat seperti berikut ini. Sebuah hal penting yang harus diperhatikan; controller mengambil sebuah antarmuka untuk tampilan dan model. Hal ini penting untuk mengetahui bahwa view biasanya akan berinteraksi dengan controller jika perlu pemberitahuan event melalui tampilan (seperti klik tombol).

static class Program
{
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        frmCalcView view = new frmCalcView();
        CalculatorModel model = new CalculatorModel();
        CalcController controller = new CalcController(model, view);
        Application.Run(view);
    }
}
class CalcController : IController
{
    ICalcModel model;
    ICalcView view;

    public CalcController( ICalcModel model, ICalcView view)
    {
        this.model = model;
        this.view = view;
        this.view.AddListener(this);
    }

    public void OnClick( int number )
    {
        view.Total = model.SetInput(number).ToString();
    }

    public void OnAdd()
    {
        model.ChangeToAddState(); 
    }
}

Perhatikan bahwa view tidak berinteraksi dengan model, itu hanya menerima permintaan update dari controller. Kontroler akan mengakses view melalui total properti. View juga melewati event klik pada controller.
View ini tidak harus tahu tentang Controller, kecuali kita harus memberikan pemberitahuan beberapa event sehingga lewat dalam IController. Lalu memanggil event handler pada kontroler melalui IController.
public partial class frmCalcView : Form, ICalcView
{
    IController controller;
    public frmCalcView( )
    {
        InitializeComponent();
    }
    public void AddListener( IController controller )
    {
        this.controller = controller;
    }
    private void lbl_Click(object sender, EventArgs e)
    {
        controller.OnClick((Int32.Parse(((Label)sender).Text)));
    }
    private void lblPlus_Click(object sender, EventArgs e)
    {
        controller.OnAdd();
    }

ICalcView Members
    public string Total
    {
        get
        {
            return textBox1.Text;
        }
        set
        {
            textBox1.Text = value;
        }
      }
}

Sekarang kita akan melihat pada model. Perhatikan bahwa itu harus melakukan "pekerjaan" dari kalkulator dan menangani negara.

    class CalculatorModel : ICalcModel
    {
        public enum States { NoOperation, Add, Subtract };
        States state;
        int currentValue;
        public States State
        {
            set { state = value; }
        }
        public int SetInput ( int number )
        {
            if (state == States.NoOperation)
            {
                currentValue = number;
            }
             else if (state == States.Add)
            {
                currentValue = Add(currentValue , number );
            }
            return currentValue;
        }
        public void ChangeToAddState()
        {
            this.state = States.Add;
        }
        public int Add( int value1, int value2 )
        {
            return value1 + value2;
        }
        public int Subtract(int value1, int value2)
        {
            throw new System.ApplicationException(" Not implemented yet");
        }
}