Monday, October 7, 2013

NodeJS Part II: Javascript, EventEmitter dan Modules


Ryan Dahl, dialah yang pertama kali mengembangkan Node. Ryan Dahl adalah seorang developer C dan Ruby on Rails, dia banyak mengerjakan proyek menggunakan kedua bahasa itu. Awal penelitian Node juga menggunakan C, tapi kemudian dia kesulitan menyelesaikannya. Tapi pertanyaannya sekarang adalah, kenapa kemudian Ryan Dahl memilih Javascript untuk Node? Secara umum, Javascript adalah bahasa yang membuang semuanya ke dalam variabel global, memiliki reputasi buruk untuk handling data-data binary, dan lagi masih belum ada pemrograman GUI di Javascript. Tapi walaupun begitu, Dahl menganggap Javascript adalah bahasa pemrograman yang cocok untuk Node.
Pada part kedua dari artikel Node ini, saya akan membahas tentang first-class function Javascript yaitu alasan utama kenapa Node ditulis dengan Javascript, selanjutnya pemrograman dasar  Node dengan event emitter pattern dan terakhir dasar yang harus kita ketahui untuk pembuatan module Node. Tetapi sebelum itu, ada baiknya Anda membaca juga Artikel Javascript sebelumnya yang berjudul Menjadikan Javascript lebih Modular dan NodeJS Part I: Asynchronous I/O dan Event-Driven yang juga pernah saya tulis sebelumya pada Bisakomputer.

Function first-class object javascript

Javascript adalah bahasa object-oriented, semuanya yang dimasukkan adalah object. Function Javascript adalah sebuah objek juga, Anda dapat memasukkan properties ke dalamnya, dan menambahkan sebuah method. Sebuah objek javascript dapat inherit juga ke objek lain. Contoh kode yang bagus untuk menjelaskan ini adalah sebagai berikut:
Object.prototype.inObj = 1;
function A(){
this.inA = 2;
}

A.prototype.inAProto = 3;
B.prototype = new A; 
B.prototype.constructor = B;
function B(){
this.inB = 4;
}

B.prototype.inBProto = 5;

x = new B;
console.log(x.inObj + ', ' + x.inA + ', ' + x.inAProto + ', ' + x.inB + ', ' + x.inBProto);
Kode diatas adalah dasar pembuatan objek, berikut juga inheritance antar objek yang ada dalam javascript. Ada dua objek dalam kode diatas, A dan B. Objek B inherit ke objek A, sehingga masing-masing properties A dapat diakses dari objek B. Output console dari kode diatas adalah 1, 2, 3, 4, 5.
Dari beberapa referensi yang pernah saya baca, Javascript adalah sebuah bahasa pemrograman yang memiliki sifat first-class object. Maksud dari first-class object ini adalah objek, entity, atau value dalam Javascript dapat dikonstruksi saat program run-time. Anda dapat membuat sebuah fungsi, mengganti nilai sebuah variabel, mengganti callback event meskipun program sedang dalam keadaan running. Selain itu, javascript disebut sebagai bahasa first-class object juga karena objek dalam Javascript dapat melakukan beberapa hal berikut ini:
  • Dapat disimpan dalam sebuah variabel.
  • Dapat dilewatkan sebagai parameter ke dalam sebuah function/subroutine.
  • Dapat dipakai sebagai return dari sebuah function/subroutine.
  • Dapat dibentuk saat run-time program.
Dari beberapa hal yang kita dapati diatas, tentunya ini merupakan bahasa pemrograman yang cocok untuk pemrograman server dengan non-blocking I/O dan konsep event-driven.

Event Emitter Module

Satu module penting yang harus kita pahami, menurut saya, dari banyak module yang dimiliki node adalah module events. Event-driven yang dimiliki node memungkinkan sebuah objek memiliki satu atau beberapa events. Suatu contoh objek fs.readStream memiliki atau emit beberapa events seperti 'open', 'data', 'end', dan lainnnya. Ini artinya instance dapat memberikan sebuah callback function pada masing-masing event emit objek fs.readStream tersebut.
var filename = "README";
var readStream = fs.createReadStream(filename);

readStream.on('open', function () {
console.log('File opened');
});

readStream.on('data' function(data){ 
console.log(data);
});

readStream.on('end', function(){
console.log('File ended.');
});

readStream.on('error', function(err) {
console.log(err);
});
Untuk menginginkan sebuah objek yang dapat emit events, Anda memerlukan module events. Dalam module ini hanya ada satu buah objek yaitu EventEmitter. Untuk melakukannya objek hanya butuh inherit ke EventEmitter dan kemudian emit beberapa event dalam objek tersebut. Contoh yang dapat menjelaskan ini adalah sebagai berikut:
var EventEmitter = require('events').EventEmitter,
util = require('util');

var adder = function(a, b){
this.a=a;
this.b=b;
};

util.inherits(adder, EventEmitter);

adder.prototype.add = function(){
this.emit('display', this.a+this.b);
};
Baris pertama dari kode diatas adalah memanggil sekaligus instance class EventEmitter. Sebuah objek Adder harus inherit ke EventEmitter, ini ditunjukkan pada baris 8. Kemudian objek Adder emit sebuah event 'display' pada add method ditunjukkan pada baris 10. Dari kode diatas menunjukkan, instance dari Adder bisa membuat sebuah fungsi untuk display hasil penjumlahan kedua parameter yang dimasukkan.
var InstanceAdder = new adder(5,3);

InstanceAdder.on('display', function(result){
  console.log('Output Adder: ' + result);
});

InstanceAdder.add();
Instance adder pada program ini, menampilkan hasil penjumlahan pada console (baris 3). Ketika program ini runningconsole akan mengeluarkan: Output Adder: 8.
Untuk referensi lengkap mengenai EventEmitter ini, dokumentasinya dapat baca pada link ini.

Dasar pembuatan modules node

Node memiliki sistem module yang sederhana. Ini akan mudah Anda ikuti. File dan module dalam node itu adalah satu kesatuan. Kita buat kode-kode objek pada sebuah file, dan kemudian file itu kita panggil pada program node sebagai sebuah module. Untuk urusan ini, kita bisa memanfaatkan objek module.export untuk merepresentasikan objek module. Contoh adalah kode objek adder yang sudah kita buat dan kita modifikasi sedikit hingga tampak seperti ini:
var EventEmitter = require('events').EventEmitter,
util = require('util');

var adder = function(){};

util.inherits(adder, EventEmitter);

adder.prototype.add = function(a, b){
  this.emit('display', a+b);
};

module.exports=new adder();
Kemudian kita simpan pada sebuah file dengan nama adder.js. Untuk pemanggilan module, kita bisa memanfaatkan fungsi require yang diikuti path dari module tersebut.
var InstanceAdder = require('./adder2');

InstanceAdder.on('display', function(result){
  console.log('Output Adder: ' + result);
});

InstanceAdder.add();
Ada beberapa trik yang dapat kita ikuti untuk module node ini, Anda dapat melihat referensi lengkap pada link dokumentasi node di sini.

Penutup

Dengan memahami topik yang ada pada bagian pertama dan kedua ini, saya rasa kita tidak akan merasa kesulitan untuk mempelajari node ini lebih lanjut. Saat ini ada 6 ribu lebih module node yang dapat kita manfaatkan di NPM. Dengan mempelajari beberapa module yang sudah ada itu, kita dapat menciptakan sebuah aplikasi atau mungkin sebuah tool server yang keren.
Terakhir, jika memang artikel ini dapat membantu Anda dalam memahami teknologi node, saya berharap Anda dapat meninggalkan sebuah komentar disini. Dengan komentar yang Anda tinggalkan, itu akan membantu saya dalam menyelesaikan bagian terakhir dari artikel tentang node ini. Semoga bermanfaat :)

*Artikel ini pernah publis di bisakomputer,com tertanggal 6 Agustus 2012

No comments:

Post a Comment