Object Oriented Programming (OOP) Pada Delphi - Bag 2

Pada artikel sebelumnya sudah saya jelaskan secara ringkas tentang apa itu OOP, objek, kelas dan sebuah contoh sederhana tentang deklarasi kelas. Pada artikel ini saya akan membahas lebih dalam tentang objek.


Bekerja Dengan Objek

Sebelum kita melanjutkan ke bagian cara deklarasi kelas, kita akan sedikit membahas bagaimana caranya menggunakan kelas dan objek. Kita akan menggunakan TstringList (dawaan delphi) sebagai contoh dalam pembahasan ini.
Var
StringList1 : TStringList; // TStringList > kelas –
// StringList1 objek

Di mana kita harus tuliskan deklarasi di atas? Ini tergantung pada dimana kita akan menggunakan objek ini (scope) berapa lama kita akan menggunakannya (lifetime-nya). Jika kita hanya akan mengakes pada satu method kita, maka deklarasikan pada method tersebut. Misalnya :
Procedure Test;
Var
StringList1 : StringList;
Begin

End;

Pada contoh di atas, variable StringList1 kita deklarasikan pada procedure test. Setelah kita selesai menjalankan procedure test, maka kita sudha tidak bisa mengakses variable StringList1 lagi. Jika kita ingin objek kita ingin objek Stringlist1 ini mempunya skope yang lebih luas dan life time yang lebih lama, kita harus deklarasikan objek ini di luar procedure test. Jika kita deklarasikan objek ini di bagian implementation unit, diluar procedue test, maka objek ini bisa diakses dari semua bagian unit di mana objek ini di deklarasikan. Tapi jika objek ini kita deklarasikan di bagian interface, maka objek ini akan bisa diakses dari semua bagian unit di mana objek ini dideklarasikan dan bisa juga diakses dari unit lainnnya yang mencantumkan unit ini pada bagia uses-nya.


Tanpa memperhatikan dimana kita deklarasikan objek Stringlist1, program kita mempunya kewajaiban untuk mengalokasikan dan membebaskan (jika sudah tidak dipakai) memori. Hal ini yang menjadi perbedaan pokok jika kita bekerja menggunakan variable bertipe objek dan variable bertipe biasa (non objek), misalnya :
Var
i : Integer;

Begin
i := 10;
end

Hanya dengan mendeklarasikannya berarti kita sudah menglokasikan memori untuk variable tersebut. Beda jika yang kita deklarasikan merupakan variable objek. Setelah variable tersebut kita deklarasikan, kita tidak bisa langsung memakainya. Kita harus alokasikan memori dulu untuk variable tersebut, misalnya :
Var
Student1 : TStudent;
Begin
// alokasikan memori sebelum student1 digunakan.
end


Untuk menglakikasikan memori, kita harus memanggil sebuah procedure khusus yang biasa disebut constructor. Procedure Constructor sebuah kelas bisa beragam namanya, bahkan sebuah kelas bisa mempunyai lebih dari satu constructor. Kebanyakan dan biasanya, procedure constructor diberi nama Create. Kita nanti , pada artikel-artikel beikutnya, akan membahas lebih mendalam bagaimana caranya membuat constructor. Cara memanggil contructor yaitu dengan cara menuliskan nama kelasnya sebelum nama constructor tersebut, misalnya :

TStudent1.Create;
TStringlist.Create;

Constructor sebenarnya sebuah fungsi yang mengembalikan sebuah pointer yang mengarah ke memori yang dialokasikan untuk objek tersebut. Contoh yang lebih jelas bisa dilihat di bawah ini :
Var
Student1 : TStudent;
Begin
// Alokasikan memori    

Kesalahan yang sering terjadi bagi yang baru belajar OOP adalah dia lupa memanggil constructornya sebelum digunakan objek yang dia deklarasikan.
Setelah kita alokasikan memori untuk objek tersebut ( dengan memanggil constructor) , kita bisa mengakses data dari objek tersebut dengan menggunakan operator titik (dot) , seperti :
Student1 := TStudent.Create;
Student1.Nama := ‘Bagus’;
Student1.NIS := ‘613990005’;


Jika kita mencoba mengakses data dari objek tersebut tanpa memanggil constructornya, maka akan terjadi error (runtime error)
Oya, dalam sebuah program, kita bisa mendeklarasikan dan menggunakan banyak objek , misalnya :
var
Student1 : TStudent;
Student2 : TStudent;
Begin
// Alokasikan memori
Student1 := TStudent.Create;
Student2 := TStudent.Create;
Dan masing-masing object mempunyai data sendiri-sendiri. Dalam contoh ini (tepatnya yang dideklarasikan di artikel sebelumnya) Student1 mempunyai empat data yaitu Nama,NIS, Alamat dan Telpon, demikian juga Student2.
Student1 := TStudent.Create;
Student2 := TStudent.Create;

Student1.FNama := ‘Bagus Prasojo’;
Student2.FNama := ‘Andi’;
Oya, setiap kita mengalokasikan memori untuk sebuah objek, maka memori itu akan tetap terpakai selama objek tersebut belum di hancurkan (destroy). Oleh karena itu, setiap kita mengalokasikan memori maka kewajiban kita untuk membebaskan memori tersebut setelah objek yang kita buat sudah tidak diperlukan lagi. Jika kita lupa , maka akan terjdi yang namanya memory leak. Apa itu memory leak? Saya membahasnya lebih detail pada artikel ini dan ini, silahkan dibaca. Cara membebaskan memory begitu mudah, tinggal panggil procedure free, misalnya :
Student1.Free;
Student2.Free;
Perhatikan, pola cara membebaskan memori dengan mengalokasikan memori berbeda. Jika kita mengalokasikan memori dengan memanggil funsi create diawali nama kelas, tapi ketika kita membebaskan memori kita panggil procedure free diawali dengan nama objek. Beda ya memanggil procedure diawali dengan nama kelas dan nama objek? Yupe, beda, di artikel-artikel selanjutnya akan kita bahas tentang hal ini.
Di bawah ini contoh penulisan sebuah procedure secara lengkap dimulai dari deklarasi, alokasi memori, dan diakhiri dengan pembebasan memori..

Procedure Test;
Var
StringList1 : StringList; // deklarasi

Begin
// Panggil constructor untuk alokasikan memori
StringList1 := TStringList1.Create;

// ubah dan akses data

// bebaskan memori
StringList1.Free;
End;


Pada contoh di atas, kita mengalokasikan memori dan membebaskan memori pada satu procedure yang sama. Hal ini tidak bermasalah selama objek yang kita alokasikan memori untuknya hanya bisa diakses dari procedure tersebut. Jika objek tersebut bisa diakses dari seluruh bagian unit, maka kita harus hati-hati dalam menentukan kapan kita harus memanggil procedure free (untuk membebaskan memori).

Inti dari apa yang kita bahas di atas tadi adalah, ketika kita mengalokasikan memori untuk sebuah objek, maka kita beranggung jawab untuk membebaskan memori tersebut. Jika kita lupa , maka kemungkinan terjadinya memory leak sangat besar. Namun hal ini sebenarnya tidak sesederhana itu. Pada artikel selanjutnya kita akan bahas lebih mendalam. Bersambung

1 comments - Add Yours

Joko Purnomo said...

Ditunggu kelanjutanya mas...
bagus banget artikelnya ...
kalo ada pdf nya. tentang Delphi OOP versi indonesia dishare ya mas. hehehe

Post a Comment