Langsung ke konten utama

Object Oriented Programming Pada Delphi - Bag 4

Para Delphi dan OOP Mania, pada artikel sebelumnya kita telah mempelajari cara mengalokasikan dan membebaskan memori sebuah objek. Pada artikel berikut ini, saya akan coba menjelaskan bagaimana cara mendeklarasikan sebuah kelas lengkap dengan method – methodnya. Selamat mengikuti.

Seperti yang telah kita pelajari pada artikel sebelumnya, kelas adalah sebuah pola/rancangan/struktur data. Pada artikel tersebut, kita telah mendeklarasikan kelas sebagai berikut :

Type
 TStudent = Class
  FNama : String;
  FNIS : String;
  FAlamat : String;
  FTelpon : String;
 End;

Jika kita membuat empat objek bertipe TStudent, maka masing-masing objek tersebut akan mempunyai atribut yang sama yaitu nama,nis, alamat dan telpon. Struktur dari masing-masing objek tadi sama persis,dan struktur objek ini ditentukan pada/oleh kelas TStudent.


Atribut-atribut yang ada pada objek student – dalam kasus ini yaitu FNama, FNIS, Falamat ,dan FTelpon, di OOP dikenal dengan beberapa nama. Kadang disebut instance variables, data members, properties dan fields. Hati-hati, jangan terkecoh dengan fields yang berarti kolom pada table.


Jika kita telah terbiasa dengan tipe data Record, tentunya kita akan melihat bahwa struktur sebuah kelas tidak berbeda dengan struktur tipe data record. Keduanya merupakan tipe data yang merupakan gabungan dari beberapa data. Lalu apa yang membedakan kelas dengan tipe data record ? Di dalam kelas, kita bisa membuat procedure (biasa disebut method). Dengan method ini nantinya objek yang kita buat bisa melakukan sesuatu. Method untuk kelas TStudent bisa "RegisterForClass", "SavetoTable", "SendInvoice", dll. Untuk lebih memberi gambaran apa itu method, coba anda buka kelas TstringList dan TiniFile. Sebutkan method-method yang ada pada kedua kelas tersebut.

Saatnya Kita Menuliskan Method


Ada dua langkah yang harus kita lakukan ketika akan membuat sebuah method. Yang pertama, kita harus deklarasikan method tersebut pada bagian deklarasi kelas. Hal ini hampir sama dengan pendeklarasian atribut/properties kelas. Deklarasi ini akan memberitahulan ke compiler method-method apa saja yang dimiliki kelas ini. Method pada kenyataannya sama dengan function atau procedure. Method bisa mengembalikan nilai dan bisa juga menerima parameter. Berikut ini adalah contoh kelas dengan empat atribut dan tiga methods :
Type
 TSquare = Class
  FX, FY : Integer;
  FWidth : Integer;
  Caption : String;
  Function Area : Integer; // hitung luas
  Procedure MoveLeft(dx, dy : Integer); menggerakan ke kiri
  Procedure MoveRight(dx, dy : Integer); menggerakan ke kanan
End;

Langkah selanjutnya yaitu menuliskan baris kode untuk method-method tadi. Kita nanti akan melihat bagaimana cara menuliskan baris kode pada sebuah method , namun sebelum itu coba kita lihat bagaimana kita akan menggunakan method-method tersebut:

Var
 Square1 : TSquare;
 SqWidth : Integer;

Begin
 Square1 := TSquare.Create;
 Try
  Square1.Fx := 10;
  Square1.Fy := 20;
  Square1.FWidth := 7;

  SqWidth := Square1.Area; // 49 nilai yg kita harapkan       Square1.MoveLeft(2, 3);
 Finally
  Square1.Free;
 End;

Seperti yang kita lihat pada baris kode di atas, kita bisa memanggil method dengan menuliskan nama method tersebut diawali dengan nama objeknya (disambung dengan dot/titik) , hal ini sama dengan cara memanggil atribut kelas. Sekarang, jika kita mempunyai dua buah objek bertipe TSquare, dan kita panggil salah satu method, atribut mana yang dipakai oleh method tersebut ? Perhatikan baris kode berikut ini :

Var
 Square1 : TSquare;
 Square2 : TSquare;
 SqWidth : Integer;

Begin
 Square1 := TSquare.Create;
 Square1.FWidth := 7;

 Square2 := TSquare.Create;
 Square2.FWidth := 5;
 SqWidth := Square1.Area; // Hasilnya 49 atau 25?

Berapa nilai sqWidth? Kita inginkan nilainya 49 – yang didapat dari nilai atribut Width x Width. Dan memang demikian. Lalu kenapa bisa nilainya 49 kok bukan 25? Perhatikan, bahwa sebuah method akan menggunakan atribut dari objek yang memanggilnya. Jika kita memanggil method area dari objek Square1 , maka method ini akan menggunakan atribut width milik objek square1 yang bernilai 7.


Sejauh ini kita sudah mengetahui cara mendeklarasikan sebuah method. Selanjutnya kita harus menuliskan baris kode yang merupakan implementasi method yang kita deklarasikan.Kita harus tuliskan baris kode tersebut pada bagian implementation. Bagaimana caranya? Mudah, tuliskan seperti kita menulis sebuah procedure/function seperti biasa. Tapi satu hal yang perlu kita perhatikan. Kita harus bertitahu compiler bahwa procedure yang kita tuliskan bukan procedure seperti biasanya. Caranya dengan menambahkan nama kelas sebelum nama methos (disambung dengan dot/titik). Lihat contoh dibawah ini :

TSquare.Area : Integer;

//dan

Procedure TSquare.MoveLeft(dx, dy : Integer);

Yang perlu anda catat bahwa, kenapa objek yang memanggil method area tidak dijadikan parameter? Lalu bagaimana method – yang aslinya berupa procedure/function biasa – bisa mengakses data dari objek tersebut? Sebenarnya , objek tersebut dijadikan parameter pada method tadi, tapi kita tidak melihatnya, atau lebih tepatnya kita tidak mau menuliskannya. Ketika kita menuliskan baris kode :

SqWidth := Square1.Area; // 49

Compiler sebenarnya mengenerate baris kode :

SqWidth := Area( Square1 )

Jadi secara “Behind the scenes” compiler menjadikan objek sebagai parameter. Di damal method, kita bisa menggunakan “identifier” self untuk mengacu ke objek yang memanggil method tersebut.Ketika kita menuliskan baris kode :
Square1.Area

Di dalam method tersebut Self mengacu ke objek Square1. Jika kita menulis baris kode :

Square2.Area

Berarti Self mengacu ke objek Square2.
Di bawah ini keseluruhan kode untuk method Area:

Function TSquare.Area : Integer;

Begin
 Result := Self.FWidth * Self.FWidth;
End;

Dan di bawah ini keseluruhan kode untuk method MoveLeft dan MoveRight:

Procedure TSquare.MoveLeft( dx, dy : Integer);

Begin
 Self.Fx := Self.Fx – dx;
 Self.Fy := Self.Fy – dy;
End;
Procedure TSquare.MoveRight( dx, dy : Integer);

Begin
 Self.Fx := Self.Fx + dx;
 Self.Fy := Self.Fy + dy;
End;

Pada sebagian besar kasus, penggunaak Self merupakan opsional saja – jadi kita bisa langsung mengakses atribut objek tanpa didahului self, seperti pada baris kode berikut ini :

Function TSquare.Area : Integer;

Begin
 Result := FWidth * FWidth;
End;

Baris kode di atas tidak menimbulkan error. Hal ini karena compiler tahu method yang dipanggil tersebut milik kelas apa, oleh karena itu compiler tahu atribut yang kita akses baik kita menggunakan self atau tidak. . Namun ada satu pengecualian, jika kita mempunyai variable lokal pada method yang namanya sama persis dengan atribut objek, maka untuk mengakses atribut objek harus didahuui dengan self, jika tidak maka compiler akan membaca variable lokal tersebut (bukan atribut objek) , perhatikan contoh di bawah ini :

Function TSquare.Area : Integer;

Var
 FWidth : Integer; 
Begin
 Result := FWidth * FWidth;
End;

Pada method di atas terdapat satu variable lokal bernama Fwidth. Jika kita akses Fwidth tanpa diawalai Self, maka compiler akan memanggil Fwidth (variable lokal) bukan Fwidth (Atribut objek)

Tip

Setelah kita deklarasikan method kita bisa klik Ctrl Shift C –Delphi akan mengenerate kode (hanya outline) di bagian implementation. (Bersambung)


Komentar

Postingan populer dari blog ini

Cara Efektif Menggunakan StringGrid

StringGrid merupakan salah satu VCL yang sangat berguna. Jika anda sudah familiar dengan Webbased Application, anda bisa analogikan StringGrid dengan Table. Table digunakan untuk meenampilkan data. Adapun StringGrid, selain sebagai komponen untuk menampilkan data, dia juga juga bisa sebagai tempat untuk memasukkan data, lihat gambar di bawah ini : Pada gambar di atas, saya menampilkan form jurnal umum sebagai contoh penggunaan StringGrid. Pada contoh di atas, stringgrid dipakai untuk memasukkan data item jurnal berupa Kode dan nama perkiraan, status Debet/Kredit dan Nominal. Untuk memanfaatkan Stringgrid saya mempunyai beberapa konstanta yang mencerminkan nomor urut kolom, misalnya _KolKode merujuk pada kolom Kode Perkiraan, _KolNama merujuk pada kolom Nama. Lebih jelasnya lihat baris kode berikut : Const _KolKode : Integer = 0; _KolNama : Integer = 1; _KolDK : Integer = 2; _KolNominal : Integer = 3; Konstanta-konstanta tersebut saya pakai di beberapa tempat. Diantaran...

Tanda-tanda programmer buruk

Dalam dunia pekerjaan, ada berbagai cara untuk menjadi tidak efektif. Berikut adalah beberapa perilaku yang sering terjadi pada beberapa programmer yang pernah saya kerjakan selama bertahun-tahun: "Saya Seorang Insinyur Perangkat Lunak, Bukan Programmer"  Anda tahu seperti apa mereka. Mereka membawa keyboard mekanis ke kantor? Mereka tidak bisa ikut dalam pertemuan harian karena terlalu sibuk memikirkan masalah tersebut (hanya butuh 5 menit untuk menyampaikan apa yang Anda pikirkan). Berapa lama waktu yang dibutuhkan untuk mendapatkan latte? Saya tidak begitu yakin bagaimana seseorang bisa menjadi begitu sombong dengan pengalaman 3 tahun, tapi begitulah adanya. Saya suka mengesankan orang dengan gelar pekerjaan saya. Siapa? Apa maksud Anda, tidak ada yang peduli. Mungkin sebaiknya Anda menghabiskan lebih banyak waktu untuk bekerja dan sedikit waktu untuk memikirkan status Anda? Papan Tulis di Belakang  Beberapa orang di industri ini memiliki gelar. Saya pernah bekerja deng...

Singleton Pattern

Motivasi Kadang ada keadaan di mana kita hanya boleh memiliki satu instan dari suatu kelas. Sebagai contoh, kita hanya boleh memiliki satu window manager (atau satu sistem file atau satu spooler printer) pada satu aplikasi. Biasanya singleton digunakan untuk managemen sumber daya internal maupun eksternal secara terpusat dan bisa diakses dimanapun. Singleton merupkan salah satu design pattern yang paling sederhana. Singleton hanya melibatkan satu kelas yang bertanggung jawab untuk menginstansiasi dirinya sendiri dan pada saat yang bersamaan menyediakan akses secara global terhadap instan tersebut. Pada pattern singleton, instan bisa diakses dari manapun tanpa harus memanggil contructor dari kelas instan tersebut Tujuan • Memastikan bahwa satu kelas hanya bisa dibuat instannya sekali. • Menyediakan akses secara global terhadap instan singleton tersebut. Implementasi Pada bahasa pemrograman Java, implementasi dari singleton adalah dengan membuat sebuah atribut static pada...