Object Oriented Programming Pada Delphi - Bag 5

Delphi Lover, pada artikel sebelumnya kita telah belajar membuat kelas sendiri lengkap dengan method-methodnya. Pada artikel ini, kita akan mempelajari konvensi penamaan kelas, membuat kelas yang sering dipakai di dunia nyata. Dengan mempelajari artikel ini diharapkan baris kode kita mudah dibaca (karena sesuai dengan konvensi di Delphi) dan memperdalam pemahaman kita tentang kelas, objek dan cara penggunaanya. Selamat mengikuti.


Konvensi Penamaan Pada Delphi

Salah satu konvensi pada Delphi adalah nama kelas selalu diawali dengan huruf T (te) yang merupakan sigkatan dari type. Itulah mengapa pada artikel-artikel terdahulu kita menamakan TSquare dan Tstudent bukan Student dan Square. Coba perhatikan kelas-kelas bawaan Dephi semua diawali dengan huruf T (type), mis TButton, TForm, dll.




Konvensi lainnya yaitu nama atribut selalu diawali dengan huruf F (ef), yang merupakan singkatan dari Field. Akan lebih jelas kenapa diawali huruf F (ef) setelah kita mempelajari istilah properties pada artikel-artikel berikutnya. Untuk sekarang ikuti dulu aja : )




Kelas MRU List

Sudah ada beberapa hal tentang OOP yang kita pelajari, namun contoh berikut, yang merupakan contoh yang sering terjadi di dunia nyata akan lebih memperdalam pemahaman kita tentang OOP. Kita akan membuat kelas (tipe data baru) MRUList – yaitu sebuah kelas yang akan dipakai untuk mencatat string yang sering digunakan pada sebuah aplikasi (Most Recently Used). Contoh implementasi MRU antara lain :


1.Produk Microsoft Office, bisa menampilkan file yang paling sering dipakai.
2.Delphi , bisa menampilkan file-file yang baru saja dibuka.


Kita akan membuat sebuah aplikasi di mana user bisa melihat string apa saja yang baru saja dipakai. Karena kita belum mempelajari semua fitur OOP di delphi, kelas yang akan kita buat merupakan kelas yang sederhana dulu. Kita akan mencoba memakai fitur-fitur OOP yang sudah kita pelajari selama ini.
OK, sekarang kita mulai dengan menentukan operasi-operasi apa saja yang akan dilakukan oleh kelas. Kira-kira operasi yang kita butuhkan meliputi :


1.Operasi Query berapa elemen yang ada di list;
2.Operasi untuk menambahkan string pada MRU List;
3.Operasi untuk menampilkan string yang ada pada posisi tertentu;


Ketika kita menambahkan sebuah string pada list, string tersebut akan berada di awal list.Pada aplikasi ini kita harus tentukan jumlah maksimal string yang bisa ditampung di dalam list. Jika sudah mencapai jumlah maksimal, ketika ada string yang ditambahkan lagi, maka kita harus menghapus string yang terakhir dan menempatkan string yang baru pada awal list. Itulah mengapa aplikasi ini disebut MRU (Most Recently Used) List, karena kita dengan aplikasi ini kita bisa mengetahui daftar string apa saja yang baru saja dipakai.
Berikut ini deklarasi awal dari kelas yang akan kita buat :

Type
  TMruList = Class
    Function Count : Integer;
    Procedure Add( s : String);
    Procedure GetString( n : Integer) : String
  End;
Berdasarkan deklarasi kelas di atas, berikut ini contoh penggunaannya :

Var
  muList : TMruList;
  s : String;

Begin
  // inisialisasi objek / alokasikan memori
  mruList := TMruList.Create;
  Try 
    // menambahkan string ke objek
    mruList.Add(‘Spence’);
    mruList.Add(‘Jones’);

    // akses string dalam list
    // string terakhir dipakai berada di index 0
    s := mruList.GetString( 0 );
    // s berisi Jones (string terakhir);
 Finally
  // bebaskan memori
  mruList.Free;
 End;
End;

Pada contoh di atas, kita alokasikan dan membebasan meori pada procedure yang sama. Jika kita menggunakan kelas ini pada sebuah form, maka kita sebaiknya mengalokasikan memori pada saat form dicreate (onCreate Event) dan membebaskan memori pada saat form didestrory (onDestroy event).


OK, sekarang tiba saatnya kita menuliskan baris kode di bagian implementasi kelas. Namun sebelum itu, kita harus tentukan dulu bagaimana caranya menyimpan string pada kelas ini. Solusi terbaik mungkin dengan menggunakan TstringList untuk menyimpan string. Ketika user menambahkan string ke dalam MRUList, kita tambahkan saja string tersebut pada awal stringlist. OK, karena solusi untuk menyimpan string kita gunakan stringlist, maka kita harus deklarasikan sebuah variable yang bertipe TstringList. Kira-kira bagian deklarasi dari kelas TmruLIst seperti di bawah ini :
Type
  TMruList = Class
    FMList : TStringList;
    Function Count : Integer;
    Procedure Add( s : String);
    Procedure GetString( n : Integer) : String
  End;

Dengan demikian kelas di atas harus mengalokasikan memori untuk variable FMList. Kita harus menambahkan baris kode berikut ini :

FMList := TStringList.Create;

Dimana kita harus tambahkan baris kode di atas? Hmmm , perhatikan, proses pengalokasian memori untuk kelas TmruLIst tidak otomatis mengalokasikan memori untuk varable FMList. Kita bisa mengalokasikan memori untuk variable FMList (dengan menambahkan baris kode di atas) pada baris setelah kita alokasikan memori untk kelas TmruList ini. Lihat baris kode berikut :

mruList := TMruList.Create;
mruList.FMList := TStringList.Create;

Tapi cara yang demikian cara yang kurang bagus (poor design) . Dengan cara di atas berarti kita mewajibkan programmer lain yang menggunakan kelas ini untuk melakukan operasi yang berurutan, yaitu mengalokasikan memori untuk kelas, lalu mengalokasikan memori untuk variable FMList. Demikian juga ketika akan melakukan proses membebaskan memori, programmer harus membebaskan memori FMList dulu baru membebaskan memori untuk kelas ini. Hal ini sangat merepotkan dan cenderung menambah resiko kesalahan.



Ada satu solusi untuk masalah di atas, yaitu dengan menyerahkan proses pengalokasian memori pada constructor dan pembebasan memori pada destructor. Cara ini akan kita implementasikan nanti pada artikel berikutnya. Untuk sementara kita akan menggunakan array dengan panjang yang kita tetapkan di awal. Array ini dipakai untuk menampung string. Selain itu kita juga mendeklarasikan satu variable yang akan mencatat berapa string yang digunakan pada satu waktu. Lihat baris kode berikut ini :

Const
 MRUMaxItems = 4;

Type
 TMruList = Class
  FMList : Array[0..MRUMaxItems – 1] of String;
  FNumItems : Integer;
  Function Count : Integer;
  Procedure Add( s : String);
  Function GetString( n : Integer) : String
 End;
Implementation

// Return the number of elements in the MRUList
Function TMruList.Count : Integer;
Begin
 Result := Self.FNumItems;
End;
// Shift all the elements in the list up by one, add new element at the start
Procedure TMruList.Add(s : String);
Var
 i : Integer;
Begin
 For i := max(Self.FNumItems, MRUMaxItems - 1] DownTo 1   Do
  Self.FMList[i] := Self.FMList[i – 1];

 Self.MList[0] := s;
 Self.FNumItems := Max(FNumItems + 1, MRUMaxItems);
End;
Function GetString( n : Integer ) : String;
Begin
 If (n >= 0) and (n <= Self.FNumItems - 1) Then
  Result := Self.FMList[n];
End; 

(Bersambung)

0 comments:

Post a Comment