+++ ARJUNA +++: fungsi @ yang sebenarnya
SELAMAT DATANG DI BLOGKU " ARJUNA"

tulisan arjun

Senin, 30 April 2012

fungsi @ yang sebenarnya

Pendahuluan

Dunia IT telah lama mengenal tanda @ sebagai suatu simbol yang memisahkan nama user dan nama host pada alamat email, dan dibaca sebagai 'at'. Padahal awalnya tanda tersebut muncul di bidang komersial dan akuntansi sebagai singkatan dari 'at the rate of' atau 'per satunya' (misalkan: 5 es teh @Rp 1.000 = Rp 5.000). Di bidang IT, selain digunakan pada alamat email, tanda @ juga digunakan untuk banyak hal, antara lain:
Pada IRC, untuk menandai bahwa sebuah nickname (nama user dalam IRC) merupakan seorang operator channel.
Sebagai awalan nama user pada jejaring sosial dan situs microblogging Twitter.
Sebagai operator dan simbol khusus pada berbagai bahasa pemrograman.

Pascal

Para programmer Pascal, terutama yang telah mengenal dan mendalami tipe data pointer, tentu mengenal tanda @ sebagai operator "address of" yang tujuannya untuk mendapatkan alamat memori (dalam bentuk pointer) dari suatu variabel. Operator ini berguna jika programmer ingin mengakses nilai atau isi yang dikandung sebuah variabel langsung ke alamat memori yang diwakili oleh variabel itu. Untuk apa? Alasan utamanya adalah untuk meningkatkan kecepatan.

Sebagai contoh akan saya gunakan implementasi fungsi UpperCase untuk Turbo Pascal. Para programmer Pascal dulu tidak menikmati fasilitas sebanyak yang diterima para programmer Delphi. Jika dalam Delphi sudah tersedia fungsi UpperCase untuk mengkonversi semua huruf dalam string ke huruf kapital semua, dalam Turbo Pascal hanya tersedia fungsi UpCase yang hanya beroperasi pada tipe data Char atau satu karakter tunggal saja. Untuk string, programmer Turbo Pascal harus menuliskan fungsinya sendiri. Berikut ini dua contoh implementasi, yang pertama tanpa @ dan yang kedua memanfaatkan operator @.

{ tanpa operator @ }
function UpperCase(S: string): string;
var
L, i: Integer;
begin
L := Length(S);
for i := 1 to L do S[i] := UpCase(S[i]);
UpperCase := S;
end;



{ dengan operator @ }
function UpperCase(S: string): string;
var
CP: ^Char;
L, i: Integer;
begin
L := Length(S);
CP := @S[1];
for i := 1 to L do begin
CP^ := UpCase(CP^);
Inc(CP);
end;
UpperCase := S;
end;

Saya yakin fungsi yang pertama merupakan bentuk yang lebih banyak dipakai oleh kebanyakan programmer Turbo Pascal dulu. Selain kodenya lebih singkat, memang tidak semua programmer Pascal suka atau paham dengan penggunaan pointer. Walaupun kelihatan lebih panjang, namun setelah saya tes (ngetesnya pake Delphi, hehehe...) fungsi kedua yang memanfaatkan operator @ dan pointer terbukti lebih cepat dari fungsi yang pertama. Tapi jangan dibandingin dengan fungsi UpperCase yang disediakan oleh Delphi. Fungsi UpperCase yang didefinisikan di unit SysUtils itu pasti jauh lebih cepat, soalnya fungsi tsb langsung dikodekan menggunakan kode Assembly.
Nah, yang masih punya Turbo Pascal boleh deh ikut ngetes... apakah hasil tes saya bener...



Perl

Dalam Bahasa Perl, simbol @ digunakan sebagai awalan untuk suatu variabel yang memuat array. Berikut ini contohnya:

@pulau = ("Sumatera", "Jawa", "Kalimantan", "Sulawesi", "Bali", "Papua", "Halmahera", "Lombok");

PHP

PHP menggunakan tanda @ sebagai operator pengendali kesalahan (error control operator). Dengan menambahkan operator ini di depan sebuah ekspresi, setiap pesan kesalahan yang mungkin muncul akibat penggunaan ekspresi tersebut akan dicuekin. Berikut ini contoh kode yang penah saya pakai:

@include("includes/$page.html");
@include("includes/$page.php");

Cuplikan kode di atas bukan bermaksud untuk meng-include-kan secara berurutan dua file sekaligus (HTML dan PHP). Namun di bagian kode itu saya tidak yakin file mana yang tersedia, yang HTML atau yang PHP. Biasanya untuk halaman statis cukup pake HTML saja, sedangkan PHP hanya digunakan untuk halaman-halaman yang dinamis. Pada cuplikan kode tersebut, pertama akan dicoba meng-include-kan file HTML, jika ada maka di-include, jika tidak maka dicuekin. Berikutnya tanpa memperdulikan apakah kode sebelumnya berhasil atau gagal, kode mencoba lagi meng-include-kan file PHP, dan sama dgn tadi jika ada maka di-include, dan jika tidak maka dicuekin. Tapi harus dipastikan dulu bahwa tidak boleh ada file HTML dan PHP yang namanya sama.

Penggunaan operator @ buat coba-coba seperti di atas menghasilkan kode yang jauh lebih singkat daripada saya harus ngecek mana yang halaman statis dan mana yang dinamis, atau harus mengecek keberadaan file (menggunakan fungsi file_exists atau is_file). Misalnya, dengan pengecekan statis dan tidaknya suatu halaman mungkin kodenya jadi seperti berikut:

if (in_array($page, $static_pages)) {
include("includes/$page.html");
}
else {
include("includes/$page.php");
}

atau jika menggunakan pengecekan keberadaan file, berikut ini contoh kodenya:

if (is_file("includes/$page.html")) {

include("includes/$page.html");
}
else if (is_file("includes/$page.php")) {
include("includes/$page.php");
}

Bisa Anda lihat, kodenya menjadi jauh lebih panjang daripada kode yang menggunakan @. Apalagi jika menggunakan include di dalam blok statement maka tanda kurung kurawal tidak boleh dihilangkan, walaupun kelihatan hanya ada satu statement saja.

Operator @ hanya bekerja pada ekspresi. Aturan sederhananya: jika Anda dapat mengambil nilai dari suatu bagian kode, maka bagian tersebut dapat Anda awali dengan @. Sebagai contoh, Anda dapat menambahkannya di awal variabel, pemanggilan fungsi dan include, konstanta, operasi, dan semacamnya. Anda tidak dapat menambahkannya di awal definisi fungsi dan class, atau struktur kondisional semacam if dan foreach, dan yang semacamnya.

Saat ini operator @ bahkan akan me-non-aktifkan pelaporan kesalahan untuk kesalahan yang kritis (critical error) yang dapat menghentikan eksekusi script. Salah satu contohnya, jika Anda menggunakan @ untuk meredam kesalahan dari suatu pemanggilan fungsi lalu entah fungsinya memang tidak ada atau Anda salah mengetikkan namanya, eksekusi script akan berhenti di situ tanpa keterangan sama sekali.

Jika fitur track_errors diaktifkan, maka setiap pesan kesalahan yang ditimbulkan oleh suatu ekspresi akan disimpan dalam variabel $php_errormsg. Nilai variabel ini akan ditimpa setiap muncul error, jadi jika Anda mau menggunakannya maka Anda harus mengeceknya lebih awal. Contohnya adalah sbb:

$konten = @file("texts/$code.txt") or
die("Gagal membuka file: pesan kesalahannya adalah '$php_errormsg'");


Java
Berikut ini terjemahan yang saya ambilkan dari Wikipedia:

Sejak Java versi 5.0, simbol @ digunakan sebagai penanda anotasi (annotation), sejenis metadata yang dapat ditambahkan pada kode sumber Java. Class, method, variabel, parameter dan package dapat dibubuhi keterangan menggunakan anotasi. Saat kode Java dikompilasi, anotasi akan diproses oleh plug-in kompilator yang dinamakan prosessor anotasi. Prosessor dapat menghasilkan pesan berupa informasi atau membuat file sumber atau resource Java tambahan, yang pada gilirannya akan dikompilasi dan diproses, bahkan juga dapat memodifikasi kode yang dianotasi itu sendiri. Kompilator Java secara kondisional akan menyimpan metadata anotasi dalam file class jika anotasi tersebut memiliki suatu RetentionPolicy berupa CLASS atau RUNTIME. Nantinya, JVM atau program lainnya dapat melihat ke metadata untuk menentukan bagaimana cara berinteraksi dengan elemen program atau mengubah perilakunya.

Java memiliki sekelompok anotasi yang built-in, yaitu:

Anotasi yang diaplikasikan pada kode Java:

@Override - Mengecek apakah suatu fungsi (method) merupakan suatu override. Anotasi ini akan menyebabkan suatu compile warning jika fungsi yang dianotasi tidak ditemukan di salah satu class induknya.
@Deprecated - Menandai suatu fungsi sebagai kadaluarsa atau obsolete. Anotasi ini akan menyebabkan compile warning jika fungsi yang dianotasi tersebut digunakan atau dipanggil.
@SuppressWarnings - Menginstruksikan kepada kompilator untuk meredam setiap compile-time warning yang disebutkan pada parameter anotasi.

Anotasi yang diaplikasikan pada anotasi lainnya:

@Retention - Menerangkan bagaimana anotasi yang ditandai akan disimpan, apakah hanya di kode, dikompilasi ke dalam class, atau tersedia saat runtime melalui reflection.
@Documented - Menandai anotasi lainnya untuk penyertaan dalam dokumentasi.
@Target - Menandai anotasi lainnya untuk membatasi jenis elemen Java yang mana yang akan dianotasi.
@Inherited - Menandai anotasi lainnya untuk mewarisi fitur-fitur yang ada pada anotasi induk.

Berikut ini contoh penggunaan anotasi @Override. Anotasi ini menginstruksikan kompilator untuk mengecek apakah class induk memiliki fungsi yang sesuai.

public class Satwa {
public void speak() { }
public String getType() {
return "Satwa";
}
}



public class Kucing extends Satwa {
@Override
public void speak() {
// Ini contoh override yang berhasil.
System.out.println("Meong.");
}
@Override

public String gettype() {
// Gagal dan menghasilkan compile warning gara-gara salah ketik nama.
return "Kucing";
}
}


Pada kasus ini, sebuah warning akan muncul karena method Kucing.gettype() pada kenyataannya tidak meng-override Satwa.getType() sepeti yang diinginkan, namun mendeklarasikan sebuah method baru, gara-gara kesalahan pengetikan nama. Ingat bahwa Java bersifat case-sensitive.



Python

Pada Python 2.4 ke atas, simbol @ digunakan untuk menandai sebuah decorator. Saya sedang mempelajari tentang decorator ini, jadi tidak banyak yang bisa saya tuliskan. Berikut terjemahan yang saya ambil dari Wikipedia:

Sebuah decorator merupakan suatu objek yang dapat dipanggil (callable) dalam Python yang digunakan untuk memodifikasi suatu definisi fungsi, metode atau class. Suatu decorator melewatkan (mengoperkan) objek asli yang didefinisikan dan mengembalikan (menghasilkan) suatu objek yang termodifikasi, yang kemudian terikat pada nama yang didefinisikan. Decorator pada Python sebagian terinspirasi oleh anotasi pada Java, dan memiliki sintaks yang mirip.

Berikut ini contoh kode untuk decorator:

@massive_call
def hello():

print("hello")
def massive_call(myfunc):
def inner_func(*args, **kwargs):
for i in range(100):
myfunc(*args, **kwargs)
return inner_func
hello()

Pada kode di atas, decorator massive_call seharusnya akan membuat pemanggilan fungsi hello() di atas menampilkan teks "hello" sebanyak 100 kali. Saya belum ngetes kode di atas, yang punya instalasi Python silahkan aja mengetesnya.

Ruby

Dalam Ruby, simbol @ digunakan sebagai awalan untuk nama instance variable, sedangkan simbol @@ digunakan sebagai awalan nama class variable. Dalam object oriented programming, instance variable adalah istilah untuk menyebut variabel yang didefinisikan di dalam class yang setiap objek atau instance class tersebut memiliki salinannya sendiri-sendiri. Bisa dikatakan setiap objek yang ber-class sama memiliki nama-nama instance variable yang sama namun nilainya bisa berbeda-beda. Sedangkan class variable adalah kebalikannya, dimana hanya ada satu nilai saja yang di-share oleh semua instance dari class yang sama. Istilah lain untuk class variable adalah static member variable.

Berikut ini contoh kodenya:

class Song
@@plays = 0
def initialize(name, artist, duration)
@name = name
@artist = artist
@duration = duration
@plays = 0
end

def play
@plays += 1
@@plays += 1
"This song (#@name by #@artist): #@plays plays. Total #@@plays plays."
end
end

s1 = Song.new("Song 1", "Artist 1", 234)
s2 = Song.new("Song 2", "Artist 2", 345)
s1.play # output: This song (Song 1 by Artist 1): 1 plays. Total 1 plays.
s2.play # output: This song (Song 2 by Artist 2): 1 plays. Total 2 plays.
s1.play # output: This song (Song 1 by Artist 1): 2 plays. Total 3 plays.
s1.play # output: This song (Song 1 by Artist 1): 3 plays. Total 4 plays.
s2.play # output: This song (Song 2 by Artist 2): 2 plays. Total 5 plays.

Dapat dilihat bahwa dalam class Song di atas terdapat dua variabel yang namanya sama, yaitu plays. Bedanya, yang satu adalah instance variable (@plays) dan yang lainnya adalah class variable (@@plays). Dari dua instance yang dibuat (s1 dan s2) kita dapat melihat bahwa keduanya memiliki variabel @plays sendiri yang berbeda satu sama lain, namun mereka sama-sama menggunakan variabel @@plays yang sama.


Sekian dulu untuk tulisan ini...
· · · Sabtu pukul 7:44

  • 3 orang menyukai ini.

2 komentar: