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:
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:
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.
makasih artikelnya :)
BalasHapussama-sama...semoga bermanfaat
BalasHapus