Pemrograman Berorientasi Objek dalam PERL
Kami telah mempelajari referensi dalam Perl dan Perl anonymous arrays and hashes. Konsep Berorientasi Objek di Perl sangat banyak didasarkan pada referensi dan array anonim dan hashes. Mari kita mulai mempelajari konsep dasar Perl Berorientasi Objek.
Dasar Objek
Ada tiga istilah utama, dijelaskan dari sudut pandang bagaimana Perl menangani objek. Istilah-istilah tersebut adalah objek, kelas, dan metode.
Sebuah objectdalam Perl hanyalah sebuah referensi ke tipe data yang mengetahui kelasnya. Objek disimpan sebagai referensi dalam variabel skalar. Karena skalar hanya berisi referensi ke objek, skalar yang sama dapat menampung objek yang berbeda di kelas yang berbeda.
SEBUAH class dalam Perl adalah paket yang berisi metode terkait yang diperlukan untuk membuat dan memanipulasi objek.
SEBUAH methoddalam Perl adalah subrutin, didefinisikan dengan paket. Argumen pertama untuk metode ini adalah referensi objek atau nama paket, bergantung pada apakah metode tersebut memengaruhi objek saat ini atau kelasnya.
Perl menyediakan bless() function, yang digunakan untuk mengembalikan referensi yang akhirnya menjadi objek.
Mendefinisikan Kelas
Sangat mudah untuk mendefinisikan kelas di Perl. Sebuah kelas terkait dengan Paket Perl dalam bentuk yang paling sederhana. Untuk membuat kelas di Perl, pertama kita membangun sebuah paket.
Paket adalah unit mandiri dari variabel dan subrutin yang ditentukan pengguna, yang dapat digunakan kembali berulang kali.
Paket Perl menyediakan namespace terpisah dalam program Perl yang menjaga subrutin dan variabel independen dari konflik dengan yang ada di paket lain.
Untuk mendeklarasikan kelas bernama Person di Perl kita lakukan -
package Person;
Cakupan definisi paket meluas ke akhir file, atau sampai kata kunci paket lain ditemukan.
Membuat dan Menggunakan Objek
Untuk membuat sebuah instance dari sebuah kelas (sebuah objek) kita membutuhkan sebuah konstruktor objek. Konstruktor ini adalah metode yang ditentukan di dalam paket. Kebanyakan pemrogram memilih untuk menamai metode konstruktor objek ini baru, tetapi di Perl Anda dapat menggunakan nama apa pun.
Anda dapat menggunakan semua jenis variabel Perl sebagai objek di Perl. Kebanyakan programmer Perl memilih referensi ke array atau hashes.
Mari kita buat konstruktor untuk kelas Person kita menggunakan referensi hash Perl. Saat membuat objek, Anda perlu menyediakan konstruktor, yang merupakan subrutin di dalam paket yang mengembalikan referensi objek. Referensi objek dibuat dengan memberkati referensi ke kelas paket. Misalnya -
package Person;
sub new {
my $class = shift;
my $self = {
_firstName => shift,
_lastName => shift,
_ssn => shift,
};
# Print all the values just for clarification.
print "First Name is $self->{_firstName}\n";
print "Last Name is $self->{_lastName}\n";
print "SSN is $self->{_ssn}\n";
bless $self, $class;
return $self;
}
Sekarang Mari kita lihat cara membuat Object.
$object = new Person( "Mohammad", "Saleem", 23234345);
Anda dapat menggunakan hash sederhana di konsturctor Anda jika Anda tidak ingin menetapkan nilai apa pun ke variabel kelas apa pun. Misalnya -
package Person;
sub new {
my $class = shift;
my $self = {};
bless $self, $class;
return $self;
}
Mendefinisikan Metode
Bahasa berorientasi objek lainnya memiliki konsep keamanan data untuk mencegah programmer mengubah data objek secara langsung dan mereka menyediakan metode pengakses untuk memodifikasi data objek. Perl tidak memiliki variabel privat tetapi kita masih dapat menggunakan konsep metode helper untuk memanipulasi data objek.
Mari kita tentukan metode pembantu untuk mendapatkan nama depan seseorang -
sub getFirstName {
return $self->{_firstName};
}
Fungsi pembantu lain untuk mengatur nama depan orang -
sub setFirstName {
my ( $self, $firstName ) = @_;
$self->{_firstName} = $firstName if defined($firstName);
return $self->{_firstName};
}
Sekarang mari kita lihat contoh lengkapnya: Keep Person package dan helper functions ke dalam file Person.pm.
#!/usr/bin/perl
package Person;
sub new {
my $class = shift;
my $self = {
_firstName => shift,
_lastName => shift,
_ssn => shift,
};
# Print all the values just for clarification.
print "First Name is $self->{_firstName}\n";
print "Last Name is $self->{_lastName}\n";
print "SSN is $self->{_ssn}\n";
bless $self, $class;
return $self;
}
sub setFirstName {
my ( $self, $firstName ) = @_;
$self->{_firstName} = $firstName if defined($firstName);
return $self->{_firstName};
}
sub getFirstName {
my( $self ) = @_;
return $self->{_firstName};
}
1;
Sekarang mari kita gunakan objek Person di file employee.pl sebagai berikut -
#!/usr/bin/perl
use Person;
$object = new Person( "Mohammad", "Saleem", 23234345);
# Get first name which is set using constructor.
$firstName = $object->getFirstName();
print "Before Setting First Name is : $firstName\n";
# Now Set first name using helper function.
$object->setFirstName( "Mohd." );
# Now get first name set by helper function.
$firstName = $object->getFirstName();
print "Before Setting First Name is : $firstName\n";
Ketika kami menjalankan program di atas, ini menghasilkan hasil sebagai berikut -
First Name is Mohammad
Last Name is Saleem
SSN is 23234345
Before Setting First Name is : Mohammad
Before Setting First Name is : Mohd.
Warisan
Pemrograman berorientasi objek memiliki konsep yang sangat bagus dan berguna yang disebut pewarisan. Pewarisan berarti bahwa properti dan metode kelas induk akan tersedia untuk kelas anak. Jadi, Anda tidak perlu menulis kode yang sama berulang kali, Anda bisa mewarisi kelas induk.
Misalnya, kita dapat memiliki kelas Karyawan, yang diwarisi dari Orang. Ini disebut sebagai hubungan "isa" karena karyawan adalah seseorang. Perl memiliki variabel khusus, @ISA, untuk membantu dalam hal ini. @ISA mengatur pewarisan (metode).
Berikut adalah poin penting yang harus dipertimbangkan saat menggunakan warisan -
Perl mencari kelas dari objek yang ditentukan untuk metode atau atribut yang diberikan, yaitu variabel.
Perl mencari kelas yang ditentukan dalam array @ISA kelas objek.
Jika tidak ada metode yang ditemukan pada langkah 1 atau 2, Perl menggunakan subrutin AUTOLOAD, jika ditemukan di pohon @ISA.
Jika metode yang cocok masih tidak dapat ditemukan, Perl mencari metode dalam kelas UNIVERSAL (paket) yang datang sebagai bagian dari pustaka Perl standar.
Jika metode ini masih belum ditemukan, Perl menyerah dan memunculkan pengecualian runtime.
Jadi untuk membuat kelas Karyawan baru yang akan mewarisi metode dan atribut dari kelas Person kita, kita cukup membuat kode sebagai berikut: Simpan kode ini ke Employee.pm.
#!/usr/bin/perl
package Employee;
use Person;
use strict;
our @ISA = qw(Person); # inherits from Person
Sekarang Kelas Karyawan memiliki semua metode dan atribut yang diwarisi dari kelas Person dan Anda dapat menggunakannya sebagai berikut: Gunakan file main.pl untuk mengujinya -
#!/usr/bin/perl
use Employee;
$object = new Employee( "Mohammad", "Saleem", 23234345);
# Get first name which is set using constructor.
$firstName = $object->getFirstName();
print "Before Setting First Name is : $firstName\n";
# Now Set first name using helper function.
$object->setFirstName( "Mohd." );
# Now get first name set by helper function.
$firstName = $object->getFirstName();
print "After Setting First Name is : $firstName\n";
Ketika kami menjalankan program di atas, ini menghasilkan hasil sebagai berikut -
First Name is Mohammad
Last Name is Saleem
SSN is 23234345
Before Setting First Name is : Mohammad
Before Setting First Name is : Mohd.
Metode Mengganti
Kelas anak Karyawan mewarisi semua metode dari Orang kelas induk. Tetapi jika Anda ingin mengganti metode tersebut di kelas anak Anda, maka Anda dapat melakukannya dengan memberikan implementasi Anda sendiri. Anda dapat menambahkan fungsi tambahan di kelas anak atau Anda dapat menambahkan atau mengubah fungsionalitas metode yang ada di kelas induknya. Ini dapat dilakukan sebagai berikut: memodifikasi file Employee.pm.
#!/usr/bin/perl
package Employee;
use Person;
use strict;
our @ISA = qw(Person); # inherits from Person
# Override constructor
sub new {
my ($class) = @_;
# Call the constructor of the parent class, Person.
my $self = $class->SUPER::new( $_[1], $_[2], $_[3] );
# Add few more attributes
$self->{_id} = undef;
$self->{_title} = undef;
bless $self, $class;
return $self;
}
# Override helper function
sub getFirstName {
my( $self ) = @_;
# This is child class function.
print "This is child class helper function\n";
return $self->{_firstName};
}
# Add more methods
sub setLastName{
my ( $self, $lastName ) = @_;
$self->{_lastName} = $lastName if defined($lastName);
return $self->{_lastName};
}
sub getLastName {
my( $self ) = @_;
return $self->{_lastName};
}
1;
Sekarang mari kita coba lagi menggunakan objek Employee di file main.pl kita dan menjalankannya.
#!/usr/bin/perl
use Employee;
$object = new Employee( "Mohammad", "Saleem", 23234345);
# Get first name which is set using constructor.
$firstName = $object->getFirstName();
print "Before Setting First Name is : $firstName\n";
# Now Set first name using helper function.
$object->setFirstName( "Mohd." );
# Now get first name set by helper function.
$firstName = $object->getFirstName();
print "After Setting First Name is : $firstName\n";
Ketika kami menjalankan program di atas, ini menghasilkan hasil sebagai berikut -
First Name is Mohammad
Last Name is Saleem
SSN is 23234345
This is child class helper function
Before Setting First Name is : Mohammad
This is child class helper function
After Setting First Name is : Mohd.
Pemuatan Otomatis Default
Perl menawarkan fitur yang tidak akan Anda temukan dalam bahasa pemrograman lain: subrutin default. Artinya, jika Anda mendefinisikan sebuah fungsi yang dipanggilAUTOLOAD(),maka setiap panggilan ke subrutin yang tidak ditentukan akan memanggil fungsi AUTOLOAD () secara otomatis. Nama dari subrutin yang hilang dapat diakses dalam subrutin ini sebagai $ AUTOLOAD.
Fungsionalitas pemuatan otomatis default sangat berguna untuk penanganan kesalahan. Berikut adalah contoh untuk mengimplementasikan AUTOLOAD, Anda dapat mengimplementasikan fungsi ini dengan cara Anda sendiri.
sub AUTOLOAD {
my $self = shift;
my $type = ref ($self) || croak "$self is not an object";
my $field = $AUTOLOAD;
$field =~ s/.*://;
unless (exists $self->{$field}) {
croak "$field does not exist in object/class $type";
}
if (@_) {
return $self->($name) = shift;
} else {
return $self->($name);
}
}
Penghancur dan Pengumpulan Sampah
Jika Anda telah memprogram menggunakan pemrograman berorientasi objek sebelumnya, maka Anda akan menyadari kebutuhan untuk membuat file destructoruntuk membebaskan memori yang dialokasikan ke objek setelah Anda selesai menggunakannya. Perl melakukan ini secara otomatis untuk Anda segera setelah objek keluar dari ruang lingkup.
Jika Anda ingin menerapkan destruktor Anda, yang harus menangani file penutup atau melakukan beberapa pemrosesan tambahan, maka Anda perlu menentukan metode khusus yang disebut DESTROY. Metode ini akan dipanggil pada objek tepat sebelum Perl membebaskan memori yang dialokasikan padanya. Dalam hal lainnya, metode HANCURKAN sama seperti metode lainnya, dan Anda dapat menerapkan logika apa pun yang Anda inginkan di dalam metode ini.
Metode destruktor hanyalah fungsi anggota (subrutin) bernama DESTROY, yang akan dipanggil secara otomatis dalam kasus berikut -
- Ketika variabel referensi objek keluar dari ruang lingkup.
- Ketika variabel referensi objek tidak terdefinisi.
- Saat skrip berakhir
- Saat penerjemah perl berhenti
Sebagai Contoh, Anda cukup meletakkan metode berikut HANCURKAN di kelas Anda -
package MyClass;
...
sub DESTROY {
print "MyClass::DESTROY called\n";
}
Contoh Perl Berorientasi Objek
Berikut adalah contoh bagus lainnya, yang akan membantu Anda memahami Konsep Berorientasi Objek dari Perl. Letakkan kode sumber ini ke dalam file perl apa saja dan jalankan.
#!/usr/bin/perl
# Following is the implementation of simple Class.
package MyClass;
sub new {
print "MyClass::new called\n";
my $type = shift; # The package/type name
my $self = {}; # Reference to empty hash
return bless $self, $type;
}
sub DESTROY {
print "MyClass::DESTROY called\n";
}
sub MyMethod {
print "MyClass::MyMethod called!\n";
}
# Following is the implemnetation of Inheritance.
package MySubClass;
@ISA = qw( MyClass );
sub new {
print "MySubClass::new called\n";
my $type = shift; # The package/type name
my $self = MyClass->new; # Reference to empty hash
return bless $self, $type;
}
sub DESTROY {
print "MySubClass::DESTROY called\n";
}
sub MyMethod {
my $self = shift;
$self->SUPER::MyMethod();
print " MySubClass::MyMethod called!\n";
}
# Here is the main program using above classes.
package main;
print "Invoke MyClass method\n";
$myObject = MyClass->new();
$myObject->MyMethod();
print "Invoke MySubClass method\n";
$myObject2 = MySubClass->new();
$myObject2->MyMethod();
print "Create a scoped object\n";
{
my $myObject2 = MyClass->new();
}
# Destructor is called automatically here
print "Create and undef an object\n";
$myObject3 = MyClass->new();
undef $myObject3;
print "Fall off the end of the script...\n";
# Remaining destructors are called automatically here
Ketika kami menjalankan program di atas, ini menghasilkan hasil sebagai berikut -
Invoke MyClass method
MyClass::new called
MyClass::MyMethod called!
Invoke MySubClass method
MySubClass::new called
MyClass::new called
MyClass::MyMethod called!
MySubClass::MyMethod called!
Create a scoped object
MyClass::new called
MyClass::DESTROY called
Create and undef an object
MyClass::new called
MyClass::DESTROY called
Fall off the end of the script...
MyClass::DESTROY called
MySubClass::DESTROY called