Tuesday, June 26, 2007

Decorator Pattern

Pada penerapan OOP di Actionscript 3.0, konsep inheritance mempunyai dua kelemahan utama :

  • Kita tidak bisa mengubah ciri bawaan dari suatu object class sewaktu runtime. Contohnya sebuah class DesimalKorektor. Kita tidak akan bisa mengubah sebuah DesimalKorektor menjadi DesimalKorektorDuaDigit sewaktu runtime bila kita memakai konsep inherintace secara klasik.

  • Semakin kita banyak menggunakan permutasi, akan semakin susah memakai beberapa class di package kita. Lebih jelasnya begini ; jika anda ingin meng-extend-kan sebuah class DesimalKorektor supaya lebih scalable, anda mungkin akan membuat subclass ScalableDesimalKorektor dari DesimalKorektor. Untuk membuat DesimalKorektor yang bisa di-undo, anda mungkin akan membuat subclass UndoableDesimalKorektor. Tetapi, bagaimana caranya bila kita ingin mengkombinasikan fitur-fitur dari beberapa subclass tadi menjadi satu subclass (sewaktu runtime)? Dengan inheritance anda harus mendeklarasikan subclass tadi untuk menambahkan fitur baru. Setiap fitur baru akan meningkatkan jumlah class yang diperlukan, sehingga akan diperlukan usaha lebih dalam management-nya.

Pada beberapa “aliran” developer, ada yang melakukan beberapa metode untuk menanggulangi kelemahan dari inheritance ini. Diantaranya dengan menggunakan “Decorator Pattern”. Untuk menambahkan fitur baru pada suatu subclass, Decorator Pattern lebih menerapkan konsep komposisi dibandingkan pewarisan dari inheritance. Sehingga akan menjadi mungkin untuk menambahkan ciri baru dan mengubah perilaku (behavior) dari class tersebut sewaktu runtime.
Prinsip utama dari Decorator Pattern adalah setiap object decorator dengan type tertentu dapat menambahkan atau merubah behavior dari object yang di “decor”. Sang class Decorator dan class yang di “d├ęcor” harus meng-implement interface yang sama.

Decorator Pattern terdiri dari :
  • Decorator / decorated (interface)

  • Concrete decorated (class)

  • Absctract decorator (class)

  • Concrete decorator (class-class)


Di posting berikutnya akan kita bahas masing-masing elemen diatas.

Saturday, June 16, 2007

Bookmark June 16 2007

Biasanya, frame rate benar-benar merepotkan bila di Flex. Ada banyak alasan untuk berpendapat seperti itu. Terutama bila dalam membuat sebuah SWF yang mempunyai banyak frame. Flash sudah tentu lebih baik dalam menghasilkan SWF yang tahu bagaimana cara menangani preload dari timeline dengan frame yang banyak, demikian juga dalam menangani playback-nya. Karena Flash lebih baik dalam membuat SWF yang mempunyai content berupa animasi.

Sebaliknya urusan animasi di Flex tidak akan semudah itu, pertama dalam proses pembuatannya tidak dikenal konsep timeline, kemudian dalam playback-nya, akan di-eksekusi “lebih lambat”.
Karena, kita terdogma menerapkan sebuah “state” aplikasi/animasi di Flash berdasarkan frame (frame state navigation) dengan gotoAndStop() atau gotoAndPlay(), atau dengan mengatur visible/ alpha transparansi dari MovieClip.

Tidak demikian dengan Flex, karena Flex mengatur “state” dengan menggunakan DisplayList (Flash Player 9 DisplayList).
DisplayList memungkinkan anda mempunyai sebuah Sprite/MovieClip yang exist, tapi belum di-render di stage. Jadi bila pada animasi yang mempunyai banyak frame di timeline-nya, maka SWF hasil dari Flash akan melakukan preload asset-asset yang akan dimainkan terlebih dahulu. Sedangkan SWF hasil dari Flex tidak menerapkan proses preload seperti itu, sehingga animasi akan dijalankan lebih lambat.

Urusan “state” dalam SWF penting dalam interaksi dengan user, baik untuk navigasi maupun “application state” dan animasi. Di Flash kita terbiasa mengatur sebuah MovieClip dengan visible property ke false, yang artinya MovieClip sudah berada ditempatnya di stage, hanya saja belum terlihat, dan kemudian membuat visible menjadi true pada saat yang diperlukan. Sedangkan pada Flex terdapat mekanisme yang lebih mendasar dalam mengatur state. Pada banyak UI Component di framework Flex mengatur “state” dengan “add” dan “remove children” dari DisplayList. Umumnya sesaat setelah asset di jalankan (di-animasi-kan) akan langsung di “removed” dari DisplayList, dan akan menjadi prioritas utama oleh Garbage Collector untuk disingkirkan dari RAM. Sehingga ketika animasi dijalankan lagi, akan lebih lambat karena asset tadi akan harus di-load lagi ke memory.

Sedangkan di Flash, proses tadi berlangsung simple, karena secara “alami” kita selalu membuat frame awal sebagai preload, untuk memberitahukan Flash Player me-load semua asset – asset animasi sebelum playback. Dan proses “removing asset” yang sudah dimainkan dari RAM oleh Garbage Collector (Flash Player 8) biasanya akan dilakukan secara berkala setiap 60 detik atau ketika penggunaan RAM meningkat 20% atau lebih.

Yang perlu dipertimbangkan lagi adalah sewaktu embedding sound dan image di Flex. Karena di Flex tidak dikenal konsep Library, sehingga anda perlu menggunakan tag embed di code Flex anda untuk meng-asosiasi-kan image dan suara external ke sebuah variable, dan menggunakan variable itu untuk “link” ke asset. Asset-asset external ini di embed ke SWF sehingga anda tidak perlu khawatir tentang preloading misalnya dengan loadMovie atau Sound.loadSound.
Flex membungkus asset ini dengan class-class khusus yang dinamakan Class “Asset”, hampir mirip dengan kondisi ketika anda meng-import sound ke Flash Library dan meng-export-nya dengan linkage.
Bila kita meng-embed sebuah symbol MovieClip dari SWF eksternal, maka Flex akan membungkusnya sebagai class mx.core.MovieClipAsset, dan ketika kita meng-embed sebuah image, Flex akan membungkusnya sebagai class mx.core.BitmapAsset.
Artinya.., akan sulit mengakses class ini di SWF Flash 9. Kecuali dengan menempatkan MovieClipAsset dan BitmapAsset beserta sebagian framework Flex yang terkait di Flash 9 classes directory.

Monday, June 11, 2007

Flasher adalah developer paling sibuk

Boleh suka atau nggak setuju!!
Dibanding developer atau programmer bahasa lain, flasher merupakan developer yang paling kurang tidur karena perkembangan teknologi flash sangat cepat.
Dari September 98 Flash 3, Juni 99 Flash 4, Agustus 2000 Flash 5, Maret 2002 Flash 6, September 2003 Flash 7, Agustus 2005 Flash 8, 2006 Flex, April 2007 Flash CS3 (9).
Tidak sampai setahun selalu muncul versi barunya.
Bandingkan dengan Java (dari seri 1.4 ke seri 1.5 perlu berapa tahun?), juga PHP (dari php 4 ke php 5 perlu berapa tahun), .NET ?, VB ?, Perl?

Hampir tidak bisa menghela nafas sebentar pun sewaktu baru selesai memahami salah satu bagian paling abstrak di Flex 2.0.1 yaitu "Flash ApplicationDomain" sekarang sudah muncul Flex 3 yang datang dengan kemampuan cache Flex Framework. Berbarengan juga dengan Adobe AIR beta (a.k.a Apollo), Adobe Flash Player Update 3 juga, coba cek di lab!

Software proprietary lain yang bikin developernya banyak begadang kebanyakan dari jenis multimedia ya? Seperti 3DSMax? Atau ada yang lain? Sedangkan kalo dari jenis Language Background paling cuma Actionscript ya?

Kemana pun arah perkembangan tool favorit anda, selama masih suka pasti selalu bergairah mengikutinya, gak pernah mengeluh..

Yes!! We're Flash Tech Addict!!

Friday, June 08, 2007

Public Variable, Get/Set, Binding..

Kapan sebaiknya kita memilih menggunakan antara get/set atau public variable di class kita?
Dalam beberapa situasi, penggunaan get/set mempunyai keuntungan tersendiri.
Sebaliknya pada situasi lain public variable akan lebih efektif dibandingkan get/set

Sedangkan dalam penggunaannya, bentuk pemanggilan keduanya mempunyai kesamaan.


//Contoh penggunaan public variable dan get/set
myClass.myPublicVariable = true;
//atau
trace(myClass.myPublicVariable);



Pendeklarasian public variable :

/** 
* Contoh deklarasi public var di myClass
*/


[Bindable]
public var
myPublicVariable:Boolean = true;



Pada kondisi bila tidak ada tindak lanjut tambahan (additional actions) ketika variable berubah value, maka penulisan public variable lebih baik dibandingkan get/set.

Pada contoh diatas bila myPublicVariable diubah value-nya maka binding akan di-update, dan segala object component yang ter-bound dengan binding variable tadi juga ter-update. Sehingga tidak perlu menggunakan get/set disini.

Pendeklarasian get/set function :

/** 
* Contoh deklarasi public get/set di myClass
*/

[Bindable(event="publicVarUpdated")]
public function set
myPublicVariable(val:Boolean):void{
_myVar = val;
_counterSet++;
otherFunction();
dispatchEvent(new FlexEvent("publicVarUpdated"));
}


public function get myPublicVariable():Boolean{
_counterGet++;
otherFunction2();
return _myVar;
}

private var _myVar:Boolean;
private var _counterSet:int;
private var _counterGet:int



Pada contoh diatas baris [Bindable(event="publicVarUpdated")] menunjukkan bahwa setiap component / object lain yang ter-bound ke property myPublicVariable akan langsung meng-update value-nya ketika event dengan type "publicVarUpdated" di-dispatch. Anda perhatikan di function setter-nya terdapat baris untuk dispatchEvent ketika myPublicVariable di-set, yang akan langsung memberitahukan ke semua component/ object yang ter-bound ke property myPublicVariable ini untuk segera meng-update value sesuai nilai terbaru.

Keuntungan utama dari get/set adalah mereka memungkinkan serangkaian perintah tambahan dieksekusi dalam satu pemanggilan function get/set. Anda dapat membuat class/component anda untuk langsung memanggil fungsi tertentu ketika get/set dipanggil, seperti contoh diatas.

Dalam framework Adobe Flex component, get/set banyak dipakai terutama untuk dispatch custom event, mengganti style component, layout, measure dan lain-lain.