Memahami Method Overloading Dan Default Parameter


Function dan procedure merupakan bagian penting di Delphi. Sejak Delphi 4, Delphi mengijinkan kita bekerja dengan functions dan procedure yang mendukung  default parameters , and mwmungkinkan dua atau lebih function atau procedure dengan nama yang sama persis (dengan parameter beda) namun berfungsi berbeda.

Nanti kita akan lihat bagimana Overloading dan default parameters akan membantu kita membuat kode yang lebih baik

Overloading
Secara sederhana, dengan overloading kita bisa membuat method dengan nama yang sama (berbeda di parameter) namun berfungsi berbeda.

Sebagai contoh, lihat kode berikut :


{Overloaded routines must be declared
with the overload directive}

function SumAsStr(a, b :integer): string; overload;
begin
  Result := IntToStr(a + b) ;
end;

function SumAsStr(a,b : extended;Digits:integer): string; overload;
begin
  Result := FloatToStrF(a + b, ffFixed, 18, Digits) ;
end; 

Deklarasi di atas akan menghasilkan dua fungsi, keduanya bernama SumAsStr. Kedua fungsi tersebut mempunyai jumlah parameter berbeda dan tipe data juga berbeda. Ketika kita memanggil rutin overloading, compiler akan memberikan saran rutin mana yang akan kita panggil.

Sebagai contoh, SumAsStr(6, 3) akan memanggil fungsi SumAsStr pertama, karena argumen/parameternya bernilai integer.

Delphi akan membantu kita untuk memanggil fungsi dengan implementasi yang benar dengan fitur auto complete nya.

Dengan kata lain, jika kita mencoba memanggil fungsi  SumAsStr dengan cara :

SomeString := SumAsStr(6.0,3.0) 
kita akan mendapatkan error  : "there is no overloaded version of 'SumAsStr' that can be called with these arguments", karena fungsi SumAsStr tidak menerima dua parameter bertipe double, yang ada adalah fungsi SumAsStr dengan dua parameter integer, dan fungsi SumAsStr dengan dua parameter double dan sebuah parameter integer.

Catat : hanya ada satu aturan ketika kita akan menulis rutin overloading yaitu : sebuah rutin overloading harus berbeda pada minimal satu tipe parameter. Nilai kembalian (return type), tidak bisa dipakai untuk membedakan dua rutin.

Two units - one routine
 
Misalkan kita mempunyai sebuah rutin di unit A, dan unit B uses unit A, tapi pada unit B juga ada fungsi dengan nama yang sama. Deklarasi fungsi pada unit B ti does tidak perlu diperlakukan sebagai fungsi overloading. Lalu bagaimana caranya memanggil fungsi (dengan nama yang sama) yang ada di unit A ? Untuk memanggil fungsi di unit A kita harus menyertakan nama unit sebelum nama fungsi. Perhatikan kode di bawah ini :

unit B;
...
uses A;
...
procedure RoutineName;
begin
  Result := A.RoutineName;
end; 

Default / Optional Parameters
 
Untuk menyederhanakan penulisan fungsi, kita bisa menggunakan default parameter. Parameter ini sifatnya opsional, bisa diisi bisa juga tidak.Untuk menggunakan default parameter , akhiri penulisan deklarasi parameter dengan simbol "=" (sama dengan) diikuti dengan nilai defaultnya.

Sebagai contoh, diberikan deklarasi sebuah function sbb : 


function SumAsStr (a,b : extended; Digits : integer = 2) : string; 
the following function calls are equivalent.

SumAsStr(6.0, 3.0) 

SumAsStr(6.0, 3.0, 2)

Catatan: parameterdengan nilai default harus ditulis pada akhir deklarasi parameter, dan harus diberi nilai default dari sebuah nilai atau constanta. Nilai yang mengambil dari sebuah parameter tidak bisa dijadikan nilai default.

Overloading with Default Parameters
Pada saat menggunakan fungsi/prosedur overloading dan mengandung parameter default, jangan membuat deklarasi yang ambigu.

Perhatikan deklarasi di bawah ini :
procedure DoIt(A:extended; B:integer = 0) ; overload;

procedure DoIt(A:extended) ; overload; 

Kenapa deklarasi di atas ambigu? Tuliskan jawaban anda dengan memberikan komentar terhadap artikel ini.

Diterjemahkan dari http://delphi.about.com/od/objectpascalide/a/overloading.htm

Selengkapnya...

Apa sebenarnya yang dimaksud sender pada event handler

Event Handlers Dan Sender

Perhatikan potongan kode event handler event OnClick event pada sebuah button (bernama "Button1"):

procedure TForm1.Button1Click(Sender: TObject) ;
begin
...
end; 

Method Button1Click  mempunyai parameter yang bertipe  TObject yang disebut Sender. Setiap event handler, pada Delphi, minimal akan memiliki  sebuah parameter bernama Sender. Ketika button di-click , event handler (Button1Click) untuk event OnClick dipanggil.


Parameter "Sender" mengacu pada sebuah komponen yang dipakai untuk memanggil method tersebut.Jika anda meng-click Button1, maka akan menyebabkan method Button1Click dipanggil, sebuah referensi atau pointer yang mengacu pada Button1 akan dikirim ke  Button1Click pada bagian parameter yang disebut Sender.

Perhatikan Kode Berikut

Parameter Sender , jika digunakan dengan benar, maka akan memberikan fleksibilatas yang luar biasa pada kode kita. Dengan parameter sender ini kita bisa mengetahui komponen apa yang memicu terksekusinya suatu event. Hal ini memudahkan kita untuk menggunakan  event handler yang sama untuk dua komponen yang berbeda.

Sebagai contoh, misal kita menginginkan sebuah button dan menuitem melakukan satu task yang sama. Akan aneh jika kita harus menuliskan kode yang sama persis untuk button dan menuitem tersebut.

Agar button dan menuitem tersebut bisa menggunakan  event handler yang sama, ikut langkah-langkah di bawah ini :

- Tulis  event handler untuk komponen pertama (mis  button )
- Pilih komponen kedua (mis MenuItem1)
- Beralih ke tab  Event pada Object Inspector (F11).
- Klik panah ke bawah untuk mengambil event yang pernah ditulis. (Delphi akan memberikan daftar event yang kompatible untuk kedua komponen terpilih)
- Pilih event dari  drop-down list. (mis Button1Click)

Apa yang kita lakukan di atas adalah membuat sebuah method event-handler yang menangani event OnClick dari komponen  button dan menu item sekaligus. Sekarang, yang harus kita lakukan di event handler yang dipakai beberapa komponen (button dan menuitem) adalah membedakan komponen mana yang memicu tereksekusinya method ini. Sebagai contoh, kita mempunyai kode seperti bawah ini :

procedure TForm1.Button1Click(Sender: TObject) ;
begin
  {code for both a button and a menu item}
  ...
  {some specific code:}
  if Sender = Button1 then
    ShowMessage('Button1 clicked!')
  else if Sender = MenuItem1 then
    ShowMessage('MenuItem1 clicked!')
  else
    ShowMessage('??? clicked!') ;
end; 
Perhatikan, pada bagian else in the if-then-else yang kedua menangani situasi dimana sendernya <> button1 maupun menuitem1. Hal ini akan kelihatan hasilnya dengan kode berikut :

procedure TForm1.Button2Click(Sender: TObject) ;
begin
  Button1Click(Button2) ;
  {this will result in: '??? clicked!'}
end; 
IS and AS

Karena  Sender bertipe TObject, semua  object bisa dijadikan Sender. Nilai Sender selalu sebuah komponen yang merespon event. Kita bisa melakukan pengecekan unntuk mencari tipe dari sender dengan menggunakan reserved word "is".  Perhatikan contoh di bawah ini !
if Sender is TButton then
  DoSomething
else
  DoSomethingElse; 
Untuk mengetahui penggunaan "is" dan "as" , tambahkan sebuah Edit box pada form (berinama Edit1) dan tulis kode berikut ini pada  event handler OnExit :
procedure TForm1.Edit1Exit(Sender: TObject) ;
begin
  Button1Click(Edit1) ;
end; 
Sekarang ubah  ShowMessage('??? clicked!') ; pada event handler Button1 OnClick  menjadi:
{... else}
begin
  if Sender is TButton then
    ShowMessage('Some other button triggered this event!')
  else if Sender is TEdit then
    with Sender as TEdit do
    begin
      Text := 'Edit1Exit has happened';
      Width := Width * 2;
      Height := Height * 2;
    end {begin with}
  end;
end;

Ok, sekarang kita lihat hasilnya: Jika kita klik pada  Button1 makan pesan 'Button1 clicked!' akan muncul, kita klik MenuItem1 maka 'MenuItem1 clicked!' akan mencul. Jika  kita klik pada  Buton2 maka pesan 'Some other button triggered this event!' akan muncul, namun jika kita klik  Edit1 kemudia klik komponen lan (agar event OnExit terpicu), apa yang akan terjadi?
Kesimpulan

Seperti yang kita lihat tadi, parameter Sender bisa sangat bermanfaat jika digunakan dengan benar
Diterjemahkan dengan sangat bebas dari : http://delphi.about.com/od/objectpascalide/a/sender.htm
Selengkapnya...

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 kelas "Singleton" , constructor dengan akses private, dan sebuah method static dengan akses public yang mengembalikan nilai yang mengacu pada atribut static.

Pattern Singleton mendefinisikan sebuah operasi yang bernama getInstance. Getinstance ini bertugas mengembalikan instan yang unik yang diakses oleh klien. GetInstance() adalah sebuah method yang bertanggung jawab untuk menciptakan sebuah instant dari kelas itu sendiri jika instan tersebut belum diciptakan. Jika sudah, method getinstant tinggal mengembalikan instan tersebut.

Sedangkan implementasi pada Delphi sedikit berbeda. Hal ini karena beberapa hal :
1. Pada Delphi versi lama, static field tidak didukung
2. AFAIK, Delphi tidak mengijinkan private constructor.

Untuk mengakali kekurangan tersebut, implementasi Singleton pada Delphi bisa dilakukan seperti di bawah ini :

unit Singletn;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs;

type

  TOSingleton = class(TObject)
  public
    constructor Create;
    destructor Destroy; override;
  end;

var

  Global_OSingleton: TOSingleton;

constructor TOSingleton.Create;
begin
  if Global_OSingleton <> nil then
    {NB could show a message or raise a different exception here}
    Abort
  else
    Global_OSingleton := Self;
end;

destructor TOSingleton.Destroy;
begin
  if Global_OSingleton = Self then
    Global_OSingleton := nil;
  
  inherited Destroy;
end;

procedure FreeGlobalObjects; far;
begin  
  if Global_OSingleton <> nil then
    Global_OSingleton.Free;
end;

Coba anda perhatikan baris kode pada contructor. Disitu tertulis, jika variable
Global_OSingleton <> nil
maka method Abort akan dieksekusi, atau bisa juga diganti dengan melemparkan eksepsi. Jika

Global_OSingleton  = nil
maka akan dicreate sebuah instan dari kelas TOSingleton.

Penerapan Contoh

Sesuai dengan definisi, pattern singleton digunakan ketika dibutuhkan hanya ada satu instan dari suatu kelas, dan ketika instan tersebut harus bisa diakses dari manapun. Berikut ini contoh real dimana pattern singleton diterapkan :

Contoh 1 – Kelas Log

Pattern singleton digunakan untuk kelas log. Kelas ini biasanya diimplementasikan sebagai sebuah singleton, dan menyediakan akses secara global dari manapun tanpa harus mengistansiasi kelas tersebut tiap kali melakukan operasi log.

Contoh 2 –Kelas Konfigurasi

Pattern singleton digunakan untuk kelas yang mengatur kofigurasi sebuah aplikasi. Dengan mengimplementasi kelas konfigurasi sebagai singleton, bukan hanya menyediakan akses global , tapi juga menjadikan instan dari kelas konfigurasi tersebut sebagai cache objek. Ketika kelas konfigurasi dinstansiasi, singleton akan menyimpan data konfigurasi tersebut sesuai struktur kelas tersebut. Jika data konfigurasi diambil dari database atau file, singleton memungkinkan kita bisa mengakses data tersebut tanpa melakukan pengambilan ulang dari database atau file tiap kali kita membutuhkan.

Contoh3 - Dipakai Untuk Mengakses sumberdaya yang dipakai bersama

Singleton bisa digunakan pada aplikasi yang membutuhkan akses ke port serial. Misal, ada banyak kelas dalam aplikasi, berada pada lingkungan multithreading , yang harus mengerjakan sesuatu pada port serial.Pada kasus ini singleton dengan method harus digunakan untuk mengatur semua operasi pada port serial tersebut.

Demikianlah sekilas tentang pattern singleton. Semoga bermanfaat dan tetap semangat !



Selengkapnya...

Mari Bergabung Milis IT

Programmer dituntut untuk selalu mengikuti perkembangan Teknologi Infomasi (TI). Pada masa sekarang ini, perubahan TI bukan hanya terjadi pada setiap minggu atau bulan. Setiap hari selalu ada perubahan, bahkan bisa jadi setiap jam selalu ada perubahan TI. Salah satu cara agar selalu bisa mengikuti mengikuti perkembangan adalah dengan bergabung dengan mailing list (milis) TI. Saya, sejak bayi orok (baca : sejak awal mengenal pemrograman) selalu berkutat dengan pascal/delphi. Tidak aneh jika saya bergabung dengan milis delphido (delphi indonesia).




Selain milis delphindo, saya juga bergabung dengan milis IT lainnya. Pada sebagian besar milis yang saya ikuti, saya banyak menjadi pasive member. Lalu apa untung nya kalau hanya menjadi pasive member? Tetap ada untungnya. Dengan bergabung dengan milis tadi, setidaknya kita bisa tahu topik apa yang lagi hangat di milis tersebut. Selalin itu, kita juga bisa mengetahui teknologi , framework, atau bahkan kita bisa mendapatkan pekerjaan dari milist tersebut : ). Berikut ini milis yang saya ikuti :

Nama
Keterangan
Liferay User Group Indonesia liferay User Group Indonesia, Jakarta
Manajemen Proyek IT Diskusi tentang berbagai aspek manajemen proyek IT seperti estimasi biaya, manajemen resource, resiko, planning, tracking, dsb. Sharing tentang metodologi, tips dan trik, contoh dokumen, dll.
Pentaho User Group Indonesia Pentaho User Group ini merupakan tempat diskusi mengenai pemanfaatan dan pengembangan Pentaho - kumpulan aplikasi Business Intelligence (BI) Open Source. Info lebih lanjut mengenai Pentaho dapat dilihat di : - http://pentaho.phi-integration.com
Scrum Indonesia Discussion group to talk about Scrum and Agile in Bahasa Indonesia but not limited to other process that complement with Scrum like XP and Lean.
[id-android-Dev] Indonesian Android Developers Milis Indonesian Android Developers bagian dari milis ID-Android http://groups.google.com/group/id-android/ dan http://android.or.id mari bergabung/join bersama Forum ID-Android http://forum.android.or.id
codeigniter-id Milis CodeIgniter Indonesia
id-python Milis Python Indonesia
jug-indonesia Selain membahas Java, milis ini juga membahas framework-framework dan tools populer di dunia Java seperti JBoss Seam, Spring, Hibernate, dsb. JUG memiliki pertemuan bulanan yang dinamakan JaMU (Java Meet Up) dimana di pertemuan ini para member bertemu di darat serta membahas topik-topik yang sedang hangat di Java dengan Pembicara yang pakar pada topik tersebut. Untuk mengetahui jadwal dan lokasi tempat pertemuan JUG, bergabunglah bersama kami sekarang dan jadi bagian dari
phpug Kelompok Pengguna PHP Indonesia (PHPUG) dibuat untuk bertukar ilmu dan pengalaman antar para pemakai PHP di Indonesia.
sqlserver-indo
Diskusi dan tukar informasi seputar database Microsoft SQL Server. Topik-topik meliputi:



Design / perancangan database

Instalasi-Konfigurasi

Administrasi Database

Pemrograman dengan SQL Server

Database Security

Data Warehouse/ OLAP

Replication
Selain bergabung dengan milis, kita juga bisa update pengatahuan TI kita dengan bergabung dengan berbagai forum IT. Kita juga bisa bergabung dengan situs tanya jawab TI yang paling populer yaitu


http://www.stackoverflow.com

Selengkapnya...

Belajar Delphi Melalui Video

Video kadang lebih bermakna dibanding tutorial berbentuk tulisan. Dari sebuah video terkandung begitu banyak hal. Demikian juga dengan belajar delphi. Kita dengan mudah bisa mendapatkan video tutorial delphi. Di bawah ini adalah daftar video tutorial delphi yang bisa didownload secara gratis

More Articles...

Selengkapnya...

Menghitung Jumlah Karakter Tertentu Pada Suatu String

Temans, pada tips dan trik berikut ini saya akan menuliskan cara untuk menghitung jumlah karakter terntentu pada suatu string. Ada dua pendekatan yang saya lakukan. Yang pertama dengan looping sepanjang string dan kita cek satu persatu. Adapun cara kedua, adalah dengan me-replace dengan karakter kosong kemudian kita selisihkan panjang sebelum dan sesudah proses pe-replace-an. Selisih itu ada jumlah karakter yang kita cari. Lebih jelasnya perhatikan baris kode berikut ini :

1. Looping
class function TAppUtils.HitungKarakterLooping(AStringHitung : Char;
    AStringSource : String): Integer;
var
  i: Integer;
begin
   Result := 0;

   for i := 1 to Length(AStringSource) do
    if AStringSource[i] = AStringHitung then
      Result := Result + 1;
end;
2. Replace
class function TAppUtils.HitungKarakterReplace(AStringHitung : Char;
    AStringSource : String): Integer;
begin
  Result := Length(AStringSource) - Length(StringReplace(AStringSource, AStringHitung, '', [rfReplaceAll, rfIgnoreCase])) + 1;
end; 

Dari dua function di atas, mana yg lebih cepet? Terus terang saya belum pernah membandingkan. Jika anda ingin mengetahui berapa lama suatu function dieksekusi bisa membaca artikel Menghitung Lama Procedure/Function Dieksekusi
Selengkapnya...

Kumpulan Artikel OOP Dengan Delphi

Temans, penguasaan OOP pada masa ini adalah suatu keharusan. Sudah banyak artikel yang membahas apa keuntungan meggunakan OOP. Sebagai upaya untuk menyediakan sarana belajar OOP, khususnya untuk Delphi, berikut ini saya kumpulkan beberapa link yang merujuk pada artikel OOP di delphi.about.com.


Artikel-artikel di bawah ini dikelompokkan menjadi beberapa bagian , yaitu :

1. Introduction to OO basics
Bagian 1
- Object orientation basics
- Delphi Unit structure and project structure
- Delphi’s RAD generation: visual objects and events

Bagian 2
- Delphi’s RAD generation: visual objects and events
- Event handlers
- Creating an object (RAD and coding)

Bagian 3
- Interaction between objects: simple message passing, association and composition
- The UML: class, object and sequence diagrams
- Inheritance, association and composition relationships
- Homework

2. Introduction to class inheritance
Bagian 4
- Class inheritance.
- Subclassing for reuse: extension, specialisation, generalisation.
- Overriding inherited methods.
- Encapsulation.
- Visual Form Inheritance (VFI).

Bagian 5
- Delphi’s VCL class hierarchy.
- Navigation (linkage) between objects.
- Navigation on a UML class diagram.
- Visibility for message passing.

3. Programmer defined classes and objects
Bagian 6
- Keeping user interface and application objects separate: separation of concerns,
- Mimicking RAD user interface objects in programmer defined application classes,
- Steps in using a programmer defined object:
1 define the class,
2 allocate a name (reference),
3 instantiate the object,
4 assign it to the name.

Bagian 7
- Inheritance: deriving a new class from an existing one.
- Packaging a class in a unit.
- Overloaded methods & protected visibility.
- The Code Explorer and Project Browser.
- Layout of objects in memory.

4. Accessing an object and its data
Bagian 8
- The object name as a reference
- Creating and freeing an object: Constructors and destructors
- The need for memory management: memory leakage and dangling references

Bagian 9
- Data access methods: Get… and Set…
- Properties for data access: Mapped and direct, read and write specifications.
- The concept of ‘Patterns’ in object orientation
- The Immutable Pattern

Bagian 10
- The concept of ‘Patterns’ in object orientation
- The Immutable Pattern
- Creating a list of object references
- Homework Problems
- Part download: PDF, Code, Homework Solutions

5. The Sender parameter and substitution
Bagian 11
- Substitution
- The Sender parameter
- Typecasting
- Class and instance operators
- RTTI: run time type information

6. Introducing type inheritance
Bagian 12
- Substitution with programmer classes
- Early (static, compile time) binding
- Late (dynamic, run time) binding
- Virtual and override methods

Bagian 13
- Polymorphism = substitution + dynamic binding

Bagian 14
- Abstract methods
- The concept of a type
- The Polymorphism Pattern
- Part 6 Source Download

7. Using and abusing inheritance
Bagian 15
- Clarify differences between subclassing and subtyping.
- Use each appropriately.

Bagian 16
- Inheritance anti-patterns

8. Indirection
Bagian 17
- Indirection through chaining and through delegation.
- Comparing chaining and delegation in terms of encapsulation and coupling.

Bagian 18
- Chaining and delegation in RAD classes.
- Patterns for the Law of Demeter and for Delegation.

9. Association & Composition
Bagian 19
- Reviewing the different conditions for inheritance, for association and for composition.
- Implementing association and composition.

Bagian 20
- Association, composition and immutability

Bagian 21
- Example 9.3 Deep copies and the Assign method

10. Two Patterns Using Composition
Bagian 22
- Delegation: Association and Composition

Bagian 23
- The Adapter pattern for polymorphism

11. Some Patterns for varying behaviour
Bagian 24

12. Bidirectional links, Callbacks and Linking Classes
Bagian 25

13. Factory Patterns
Bagian 26

14. A Decorator
Bagian 27


Selengkapnya...