Author : Muchammad Aly mBA, S.Kom * Download (*.doc)
Dalam pembuatan aplikasi database dengan Delphi, umumnya kita menggunakan komponen-komponen database, baik berupa komponen koneksi (Misal: TAdoConnection, IBDatabase, dst), turunan TDataset (Misal: TAdoTable, TQuery, dst) atau kontrol databound (DBGrid, DBEdit, dst).
Dengan pendekatan pengembangan aplikasi seperti ini, kita biasa menuliskan perintah sql, business logic, validasi input, pengaturan tampilan sekaligus dalam satu form (satu unit).
Pengembangan aplikasi ini mempunyai kelemahan dari satu sisi. Diantaranya:
- Sulit dikembangkan dalam suatu tim yang saling bekerja sama. Misalkan tim yang menangani desain tampilan, ketika menyisipkan/ mengedit kode-kode yang merubah tampilan sangat boleh jadi business logic menjadi ikut terpengaruh. Demikian juga ketika tim yang menangani database, ketika dibutuhkan perubahan perintah sql, sangat boleh jadi tingkah laku form akan berubah.
- Sulit dimaintenance. Programmer yang meneruskan pengembangan aplikasi mau tidak mau harus memahami source code secara keseluruhan sebelum dapat ikut berpartisipasi. Hal ini disebabkan keterkaitan yang demikian erat logika pemrograman dalam satu form/satu unit. Satu perubahan yang kecil dapat mempengaruhi keseluruhan tingkah laku form.
Untuk menghindari hal tersebut di atas dibutuhkan pemisahan penulisan source code dalam bagian-bagian tertentu. Salah satu metode pemisahan source code ini adalah dengan menggunakan paradigma MVC yang merupakan kependekan dari Model View Controller.
Pengertian MVC
Yaitu suatu istilah metode pengembangan / pembuatan aplikasi dengan memisahkan elemen-elemen penulisan source code menjadi tiga bagian, yaitu:
Model
Model di sini berperan sebagai representasi dari data yang terlibat dalam suatu proses transaksi. Setiap kali method / function dari suatu aplikasi butuh untuk melakukan akses ke dalam suatu data, maka function / method tersebut tidak langsung berinteaksi dengan sumber data tersebut melainkan harus melalui model terlebih dahulu. Secara praktis, dalam pemrograman database Delphi, model ini berwujud unit-unit yang berisi perintah SQL dan koneksi database.
View
View di sini berperan sebagai presentation layer atau pengatur user interface (tampilan) bagi user dari suatu aplikasi. Data yang dibutuhkan oleh user akan diformat sedemikian rupa agar dapat tampil dan dipresentasikan dengan format tampilan yang memang disesuaikan dengan kebutuhkan user, biasanya layer View juga bertugas untuk melakukan validasi data yang diinputkan user. Secara praktis, dalam pemrograman Delphi, view berwujud unit form yang hanya berisi perintah-perintah yang berhubungan dengan efek tampilan dan bagaimana data itu ditampilkan.
Controller
Controller di sini berperan sebagai logic aspect dari suatu aplikasi / mengatur user flow. Controller lah yang akan menentukan bussiness process dari aplikasi yang dibangun. Controller akan merespon setiap inputan dari user dengan melakukan pemanggilan terhadap model dan view yang sesuai sehingga request / permintaan dari user tersebugt dapat terpenuhi dengan baik. Biasanya layer controller juga digunakan untuk mengatur ijin akses dan permission. Secara praktis, dalam pemrograman Delphi, controller dapat berupa unit yang berisi function / procedure yang berisi logika bisnis.
MVC dan MVP
MVP (Model View Presentation) adalah turunan dari MVC. Presentation mempunyai kesamaan fungsi dengan Controller. Perbedaan MVC dan MVP hanya terletak pada arah komunikasi antar elemen. Pada MVC, Viewbisa langsung berkomunikasi dengan Model tanpa melalui Controller. Pada MVP, komunikasi View denganModel harus melalui Presentation.
Berikut ini ilustrasi yang menggambarkan perbedaan MVC dan MPV
Contoh PENERAPAN MVC dan MVP DALAM DELPHI PROGRAMMING
Pada contoh di atas, komunikasi antara View dan Model pada MVC terjadi melalui penggunaan variabelSearchResult pada unit first_model.pas.
Pada contoh MVP di atas, komunikasi antara View ke Model terjadi melaui Presentation dengan kembalian nilai dari Presentation.
Karena perbedaan yang tipis antara MVP dan MVC, sebagian orang tetap menyebut MVP sebagai MVP. Untuk selanjutnya, pada tulisan ini, tidak dibedakan istilah antara MVC dan MVP
Penerapan dalam Source Code SMS Manager
Pada bagian ini saya memberikan salah satu penerapan paradigma MVC pada source code Project SMS Manager Power Logic sebagai contoh, dengan menggunakan:
- Satu Unit controller berlaku untuk seluruh unit view pada project, dengan nama con_SMSManager.pas
- Satu Unit Model berlaku dengan nama mod_SMSManager.pas.
Pada contoh kali ini source code yang akan terapkan paradigm MVC ada pada method :
procedure TfrmKirimSms.btnTampilkanClick(Sender: TObject);
pada unit ufrmKirimSms.pas dengan source code sebagai berikut:
1 procedure TfrmKirimSms.btnTampilkanClick(Sender: TObject);
2 var
3 STampil,
4 qryWhere : String;
5 sWaktuAwal,
6 sWaktuAkhir : string;
7 TotalHalaman,
8 jmlData : integer;
9 begin
10 if cbMarketing.ItemIndex=-1 then begin
11 MessageDlg(‘Isikan User ID dulu ..!’,mtWarning,[mbOK],0);
12 Exit;
13 end;
14
15 if edCustID1.Text <> ” then
16 qryWhere := ‘ and B.CUST_ID=’+quotedstr(Trim(edCustID1.Text))+”;
17
18 sWaktuAwal := QuotedStr(FormatDateTime(‘yyyy-mm-dd hh:nn:ss’,dtTanggal1.DateTime));
19 sWaktuAkhir := QuotedStr(FormatDateTime(‘yyyy-mm-dd hh:nn:ss’,dtTanggal2.DateTime));
20
21 //sudah digantikan model QueryCountLogSmsOut
22 if cbHalaman.Checked then
23 begin
24 SDataset := DBConn.NewDataset(‘select count(*) ‘+
25 ’ from LOG_SMS_OUT A LEFT JOIN AKUN_CUST B on A.hp_tujuan=B.cust_hp where A.WAKTU_REQUEST between ‘+
26 sWaktuAwal+’ and ‘+sWaktuAkhir+’ and A.USER_ID=’+
27 quotedstr(cbMarketing.Items.Names[cbMarketing.ItemIndex])+’ ‘+qryWhere
28 ,True);
29 try
30 JmlData := SDataset.Fields[0].AsInteger;
31 finally
32 end;
33 end;
34
35 TotalHalaman := Ceil(JmlData/PAGEVIEW);
36 lbJmlData.Caption :=’Jumlah Data : ‘+inttoStr(JmlData)+’ – Tampil halaman ‘+floattostr(edHal.Value)+
37 ‘ dari total ‘+inttostr(TotalHalaman)+’ halaman’;
38
39 STampil := inttostr((ceil(edHal.Value)-1)*PAGEVIEW);
40
41 //telah digantikan dengan modul QueryViewLogSmsOut
42 DM.DoDataGrid(DBConn,’select first ‘+inttostr(PAGEVIEW)+’ SKIP ‘+STampil+
43 ‘ A.URUT, A.WAKTU_REQUEST, A.HP_TUJUAN, B.CUST_ID, A.ISI_SMS ‘+
44 ‘ from LOG_SMS_OUT A LEFT JOIN AKUN_CUST B on A.hp_tujuan=B.cust_hp where A.WAKTU_REQUEST between ‘+
45 sWaktuAwal+’ and ‘+sWaktuAkhir+’ and A.USER_ID=’+
46 quotedstr(cbMarketing.Items.Names[cbMarketing.ItemIndex])+’ ‘+qryWhere,
47 sgrdLogSmsOut);
48 end;
Dari potongan source code di atas, bisa kita simpulkan bahwa yang akan kita pisahkan menjadi
Controller dan Model ada pada source code nomor 24 – 27 dan 42 - 47. Sehingga source code untuk view menjadi seperti berikut:
1 procedure TfrmViewKirimSms.btnTampilkanClick(Sender: TObject);
2 var
3
4 TotalHalaman,
5 jmlData : integer;
6 sDataset : IDataset;
7 begin
8 if cbMarketing.ItemIndex=-1 then begin
9 MessageDlg(‘Isikan User ID dulu ..!’,mtWarning,[mbOK],0);
10 Exit;
11 end;
12
13
14 DoCountLogSmsOut(cbMarketing.Items.Names[cbMarketing.ItemIndex], edCustID1.Text,
15 dtTanggal1.DateTime, dtTanggal2.DateTime, jmlData);
16
17 TotalHalaman := Ceil(JmlData/PAGEVIEW);
18 lbJmlData.Caption :=’Jumlah Data : ‘+inttoStr(JmlData)+’ – Tampil halaman ‘+floattostr(edHal.Value)+
19 ‘ dari total ‘+inttostr(TotalHalaman)+’ halaman’;
20
21
22
23 DoViewLogSmsOut(cbMarketing.Items.Names[cbMarketing.ItemIndex], edCustID1.Text,
24 dtTanggal1.DateTime, dtTanggal2.DateTime,PAGEVIEW,(ceil(edHal.Value)), sDataset);
25
26 DM.DoDataGrid(sDataset,sgrdLogSmsOut);
27
28 end;
Procedure dengan awalan Do adalah controller. Pada contoh di atas, source code DoViewLogSmsOut adalah sebagai berikut:
1 procedure DoViewLogSmsOut(UserId, CustID: string; FromWhen, ToWhen: TDateTime;
2 NumDataPerPage, PageIndex: Integer; var Dataset: IDataset);
3 begin
4
5 Dataset:= QueryViewLogSmsOut(UserId,CustID,FromWhen,ToWhen,
6 NumDataPerPage,(PageIndex-1) * NumDataPerPage );
7
8 end;
Procedure dengan awalan Query adalah Model. Source Code untuk Model QueryViewLogSmsOut adalah sebagai berikut:
1 function QueryViewLogSmsOut(UserId, CustID: string; FromWhen, ToWhen: TDateTime;
2 NumRecs, AfterRecIdx: Integer): IDataset;
3
4 var
5 sPeriod1, sPeriod2: string;
6 begin
7
8 sPeriod1:= QuotedStr(FormatDateTime(‘yyyy-mm-dd hh:nn:ss’, FromWhen));
9 sPeriod2:= QuotedStr(FormatDateTime(‘yyyy-mm-dd hh:nn:ss’, ToWhen));
10 LastExecuteQuery:=
11 ‘SELECT FIRST ‘+IntToStr(NumRecs)+’ SKIP ‘+ IntToStr( AfterRecIdx) +
12 ‘ A.URUT, A.WAKTU_REQUEST, A.HP_TUJUAN, B.CUST_ID, A.ISI_SMS ‘+
13 ‘ from LOG_SMS_OUT A LEFT JOIN AKUN_CUST B on A.hp_tujuan=B.cust_hp ‘ +
14 ‘ where A.WAKTU_REQUEST between ‘+
15 sPeriod1+’ and ‘+sPeriod2+’ and A.USER_ID=’+ QuotedStr(UserId);
16 if CustID<>” then
17 LastExecuteQuery:= LastExecuteQuery + ‘ and B.CUST_ID=’+quotedstr(CustID);
18 Result:= DBConn.NewDataset(LastExecuteQuery,True);
19 end;
Sumber :
0 comments: