Langsung ke konten utama

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

Komentar

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

    BalasHapus

Posting 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...