MVC

Kali ini saya jelaskan ten­tang cara mem­buat ?struk­tur? MVC seder­hana untuk menulis kode yang main­tainable dengan memecah kode men­jadi beberapa bagian ber­dasarkan fung­sinya ( separation of con­cerns ). Saya ang­gap Anda sudah cukup meng­etahui dasar OOP dan memp­rak­tek­kan­nya, jadi saya nggak perlu men­jelaskan lagi apa itu class, instance, static, getter/setter, dsb. Saya juga nggak men­jelaskan apa itu cus­tom events dan bagaimana cara mem­buat & meng­gunakan­nya karena sudah per­nah saya jelaskan dalam artikel yang lain. Selain itu, Anda juga harus meng­erti cara men­definisikan & mem­buat cus­tom class untuk objek di library. Design Pat­terns Design pat­terns (DP) adalah sekum­pulan solusi generik untuk masalah-masalah yang umum ditemui oleh para developer dalam mem­buat aplikasi. Pat­tern ber­arti pola, artinya DP bukan ber­upa kode, tetapi ber­upa pan­duan yang implemen­tasinya ter­serah developer yang menggunakannya. Info yang lebih leng­kap bisa Anda baca di wikipedia. Model-View-Controller MVC adalah meta-pattern , artinya MVC bukan merupakan pat­tern yang ber­diri sen­diri tapi merupakan kum­pulan dari beberapa pat­tern & dalam buku Head First Design Pat­terns , MVC dimasukkan dalam kelom­pok compound-pattern. Pada prin­sip­nya, implemen­tasi MVC mem­bagi kode ke dalam 3 bagian yaitu: * Model seba­gai sum­ber data * View seba­gai rep­resen­tasi data dan user inter­face * Con­troller yang ber­fungsi seba­gai ?otak? atau business logic yang memp­roses user input dan meng?update Model dan View ( kalau diperlukan ). Apa keun­tungan MVC ? Sekilas MVC kelihatan­nya merepotkan karena kita harus menulis kode lebih banyak tapi keun­tungan­nya adalah kode kita lebih main­tainable karena kita bisa meng­ubah salah satu bagian tanpa harus meng­ubah bagian yang lain. Seba­gai con­toh, misal­nya kita mem­buat aplikasi A yang memp­roses data ber­for­mat XML namun kemudian kita diharuskan meng­gunakan data ber­for­mat JSON. Dalam kasus seperti ini, kita cukup meng­ubah Model tanpa harus meng­ubah bagian yang lain. MVC juga mem­per­mudah debug­ging karena kita bisa mem­per­kirakan bagian mana yang ber­masalah tanpa harus mem­bong­kar seluruh kode yang sudah kita buat. Jadi secara umum, keun­tungan MVC jauh lebih besar daripada kerepotan yang ditim­bul­kan­nya. Di sam­ping itu, kalo Anda nggak mau repot menulis berbaris-baris kode, mung­kin men­jadi program­mer bukan profesi yang cocok buat Anda & sebaik­nya Anda cari peker­jaan lain. ;-) MODEL ->> Model adalah bagian dimana data ber­ada. Untuk data yang ber­sifat global, kita bisa meng­im­plemen­tasikan Singleton pat­tern. Singleton class hanya bisa diin­stan­siasi satu kali selama aplikasi ber­jalan. Umum­nya, referensi ke instance dari Singleton diak­ses dengan memang­gil static method getInstance(). Kalo kita bekerja ber­sama developer lain, kita bisa men­cegah mereka menginstansiasi/membuat objek Singleton dengan meng­gunakan inner class yaitu class yang didefinisikan diluar pac­kage tetapi masih di dalam file yang sama. Model saya gunakan untuk menyimpan data ber­upa posisi kotak kuning. Pada saat data ber­ubah, Model akan men-dispatch Event.CHANGE yang didengarkan oleh MainView yang kemudian meng-update posisi kotak kuning. [js] pac­kage simplemvc.model { import flash.events.Event; import flash.events.EventDispatcher; import flash.geom.Point; /** * ? * @author Ang­gie Bratadinata */ public class Model extends EventDispatcher { public var heroHeight:Number = 0; public var heroWidth:Number = 0; //???????????????????? HERO VELOCITY public var vx:Number = 10; public var vy:Number = 10; //???????????????????? HERO POSITION private var _heroPos:Point = new Point(); public fun­ction get heroPos():Point { return _heroPos; } public fun­ction set heroPos(value:Point):void { if (value.x >= heroBounds.xMin && value.x <= heroBounds.xMax && value.y >= heroBounds.yMin && value.y <= heroBounds.yMax ) { _heroPos = value; dispatchEvent(new Event(Event.CHANGE)); } } public fun­ction moveDown():void { heroPos = new Point(heroPos.x, heroPos.y + vy); } public fun­ction moveUp():void { heroPos = new Point(heroPos.x, heroPos.y ? vy); } public fun­ction moveLeft():void { heroPos = new Point(heroPos.x ? vx, heroPos.y); } public fun­ction moveRight():void { heroPos = new Point(heroPos.x + vx, heroPos.y ); } //???????????????????? HERO BOUNDS private var _heroBounds:Object = {}; public fun­ction get heroBounds():Object { return _heroBounds; } public fun­ction set heroBounds(value:Object):void { //trace(value); _heroBounds.xMin = value.x; _heroBounds.xMax = value.x + value.width ? heroWidth; _heroBounds.yMin = value.y; _heroBounds.yMax = value.y + value.height ? heroHeight; } //???????????????????? INIT private static var _instance:Model; public fun­ction Model(enf:SingletonEnforcer) {} public static fun­ction getInstance():Model { if (_instance == null) _instance = new Model(new SingletonEn­for­cer()); return _instance; } } } //INNER CLASS class SingletonEnforcer { }; [/js] VIEW & VIEW EVENT ->> Pac­kage view ber­isi class yang ber­hubungan dengan library sym­bol yaitu MainView dan ArrowButton. MainView ber­tugas menyiarkan ViewEvent jika salah satu tom­bol navigasi diklik. Event ini ditang­kap oleh Controller yang kemudian meng-update Model. Selain itu MainView juga menam­pilkan posisi kotak kuning. Kenapa saya mem­buat ViewEvent dan nggak mem­buat Controller yang lang­sung men­dengarkan MouseEvent.CLICK yang disiarkan oleh tom­bol kon­trol ? Karena saya ingin meminimalkan coupling antara MainView dan Controller sehingga jika saya perlu meng­ubah View, selama event yang disiar­kan­nya tetap ber­tipe ViewEvent, saya nggak perlu meng­ubah Controller. [js] pac­kage simplemvc.view { import flash.display.MovieClip; import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Point; import flash.text.TextField; import simplemvc.events.ViewEvent; import simplemvc.model.Model; /** * ? * @author Ang­gie Bratadinata */ public class Main­View extends MovieClip { //timeline objects public var hero:MovieClip; public var board:MovieClip; public var leftBtn:ArrowButton; public var rightBtn:ArrowButton; public var upBtn:ArrowButton; public var downBtn:ArrowButton; public var positionTxt:TextField; private var _model:Model = Model.getInstance(); //???????????????????? INIT public fun­ction MainView() { initButtonListener(); _model.addEventListener(Event.CHANGE, modelListener); } private fun­ction initButtonListener():void { var i:int = 0; while (i < numChildren) { if (this.getChildAt(i) is ArrowBut­ton) { this.getChildAt(i).addEventListener(MouseEvent.CLICK, but­tonLis­tener); } i++; } } private fun­ction buttonListener(e:MouseEvent):void { switch(e.currentTarget) { case lef­tBtn: dispatchEvent(new ViewEvent(ViewEvent.MOVE_LEFT)); break; case rightBtn: dispatchEvent(new ViewEvent(ViewEvent.MOVE_RIGHT)); break; case upBtn: dispatchEvent(new ViewEvent(ViewEvent.MOVE_UP)); break; case downBtn: dispatchEvent(new ViewEvent(ViewEvent.MOVE_DOWN)); break; } } private fun­ction modelListener(e:Event):void { hero.x = _model.heroPos.x; hero.y = _model.heroPos.y; positionTxt.text = _model.heroPos.toString(); } } } [/js] [js] pac­kage simplemvc.events { import flash.events.Event; /** * ? * @author Ang­gie Bratadinata */ public class ViewEvent extends Event { public static const MOVE_LEFT:String = ?moveLeft?; public static const MOVE_RIGHT:String = ?moveRight?; public static const MOVE_UP:String = ?moveUp?; public static const MOVE_DOWN:String = ?moveDown?; public fun­ction ViewEvent(type:String) { super(type, true); } over­ride public fun­ction clone():Event { return new ViewEvent(type); } over­ride public fun­ction toString():String { return formatToString(?ViewEvent?, ?type?, ?bubbles?, ?can­celable?, ?even­tPhase?); } } } [/js] CONTROLLER ->> Controller men­dengarkan ViewEvent yang disiarkan oleh MainView dan meng-update Model ber­dasarkan event tersebut. [js] pac­kage simplemvc.controller { import flash.events.Event; import flash.geom.Point; import simplemvc.model.Model; import simplemvc.view.*; import simplemvc.events.*; /** * ? * @author Ang­gie Bratadinata */ public class Controller { private var _model:Model = Model.getInstance(); private var _view:MainView; //???????????????????? INIT public fun­ction Controller(view:MainView) { _view = view; _model.heroHeight = _view.hero.height; _model.heroWidth = _view.hero.width; _model.heroBounds = _view.board.getBounds(_view); _view.addEventListener(ViewEvent.MOVE_DOWN, viewLis­tener); _view.addEventListener(ViewEvent.MOVE_UP, viewLis­tener); _view.addEventListener(ViewEvent.MOVE_LEFT, viewLis­tener); _view.addEventListener(ViewEvent.MOVE_RIGHT, viewListener); } public fun­ction startUp():void { _model.heroPos = new Point(0, 0); } private fun­ction viewListener(e:ViewEvent):void { switch(e.type) { case ViewEvent.MOVE_DOWN: _model.moveDown(); break; case ViewEvent.MOVE_LEFT: _model.moveLeft(); break; case ViewEvent.MOVE_RIGHT: _model.moveRight(); break; case ViewEvent.MOVE_UP: _model.moveUp(); break; } } } } [/js] Document/Main Class [js] package { import flash.display.MovieClip; import simplemvc.controller.Controller; import simplemvc.view.MainView; /** * ? * @author Ang­gie Bratadinata */ public class Main extends MovieClip { public var mainView:MainView; public var controller:Controller; public fun­ction Main() { con­troller = new Controller(mainView); controller.startUp(); } } } [/js] Seperti Anda lihat, menulis kode dengan struk­tur MVC nggak ter­lalu sulit, hanya sedikit ngerepotin. :-)

 

Visual Basic

Microsoft Visual Basic .NET adalah sebuah alat untuk mengembangkan dan membangun aplikasi yang bergerak di atas sistem .NET Framework, dengan menggunakan bahasa BASIC. Dengan menggunakan alat ini, para programmer dapat membangun aplikasi Windows Forms, Aplikasi web berbasis ASP.NET, dan juga aplikasi command-line. Alat ini dapat diperoleh secara terpisah dari beberapa produk lainnya (seperti Microsoft Visual C++, Visual C#, atau Visual J#), atau juga dapat diperoleh secara terpadu dalam Microsoft Visual Studio .NET. Bahasa Visual Basic .NET sendiri menganut paradigma bahasa pemrograman berorientasi objek yang dapat dilihat sebagai evolusi dari Microsoft Visual Basic versi sebelumnya yang diimplementasikan di atas .NET Framework. Peluncurannya mengundang kontroversi, mengingat banyak sekali perubahan yang dilakukan oleh Microsoft, dan versi baru ini tidak kompatibel dengan versi terdahulu. Daftar isi [sembunyikan] * 1 Versi o 1.1 Visual Basic .NET 2002 (VB 7.0) o 1.2 Visual Basic .NET 2003 (VB 7.1) o 1.3 Visual Basic 2005 (VB 8.0) o 1.4 Visual Basic 9.0 (Visual Basic 2008) * 2 Hubungan dengan Visual Basic klasik * 3 Contoh Pemrograman Versi Terdapat tiga buah versi Visual Basic yang dirilis hingga bulan Agustus 2007, yakni: Visual Basic .NET 2002 (VB 7.0) Versi pertama dari Visual Basic .NET adalah Visual Basic .NET 2002 yang dirilis pertama kali pada bulan Februari 2002. Visual Basic .NET 2002 merupakan sebuah bahasa pemrograman visual yang berbasis bahasa BASIC (sama seperti halnya Visual Basic 6.0, tetapi lebih disempurnakan dan lebih berorientasi objek), dan didesain untuk berjalan di atas Microsoft .NET Framework versi 1.0. Versi 7.0 ini dirilis bersamaan dengan Visual C# dan ASP.NET. Bahasa C#, yang dianggap sebagai jawaban terhadap Java, mendapatkan perhatian yang lebih banyak dibandingkan dengan VB.NET yang kurang begitu banyak diulas. Hasilnya, sedikit orang di luar komunitas Visual Basic yang memperhatikan VB.NET. Versi pertama ini kurang mendapat sambutan yang bagus dari para programmer, dan pada saat itu, program berbasis Visual Basic 6.0 sedang marak-maraknya dibuat. Para programmer yang mencoba Visual Basic .NET untuk pertama kali akan merasakan bahwa Visual Basic .NET sangatlah berbeda dibandingkan dengan Visual Basic sebelumnya. Contoh yang paling mudah adalah runtime engine yang lebih besar 10 kali lipat dibandingkan Visual Basic 6.0, dan juga meningkatkan beban di memori. Visual Basic .NET 2003 (VB 7.1) Selanjutnya, pada bulan Maret 2003, Microsoft pun merilis lagi versi yang lebih baru dari Visual Basic .NET, Visual Basic .NET 2003. Versi ini berisi beberapa perbaikan dibandingkan dengan versi sebelumnya, dan aplikasi yang dibuatnya dapat berjalan di atas .NET Framework versi 1.1. Fitur yang ditambahkan adalah dukungan terhadap .NET Compact Framework dan mesin wizard upgrade VB6 ke VB.NET yang telah ditingkatkan. Peningkatan yang lainnya adalah peningkatan pada performa dan keandalan dari Integrated Development Environment (IDE) Visual Basic itu sendiri, dan juga runtime engine. Visual Basic .NET 2003 tersedia dalam beberapa jenis cita rasa: Professional, Enterprise Architect dan Academic Edition. Khusus untuk Visual Basic .NET 2003 Academic Edition, versi tersebut didistribusikan secara gratis untuk beberapa sekolah di dalam setiap negara; versi Professional dan Enterprise Architect merupakan produk komersial. Visual Basic 2005 (VB 8.0) Setelah itu, Microsoft pun berkonsentrasi dalam mengembangkan Microsoft .NET Framework 2.0, dan tentunya alat bantu untuk membangun program di atasnya. Hingga pada tahun 2005, mereka pun merilis versi terbaru dari Visual Basic .NET, yang kali ini disebut dengan Visual Basic 2005 (dengan membuang kata ".NET"), bersama-sama dengan beberapa aplikasi pengembangan lainnya. Untuk rilis 2005 ini, Microsoft menambahkan beberapa fitur baru, di antaranya adalah: * Edit and Continue Fitur ini sebelumnya terdapat di dalam Visual Basic, akan tetapi dihapus di dalam Visual Basic .NET. Dengan keberadaan fitur ini, para programmer dapat memodifikasi kode pada saat program dieksekusi dan melanjutkan proses eksekusi dengan kode yang telah dimodifikasi tersebut. * Evaluasi ekspresi pada saat waktu desain * Munculnya Pseudo-Namespace "My", yang menyediakan: o Akses yang mudah terhadap beberapa area tertentu dari dalam .NET Framework yang tanpanya membutuhkan kode yang sangat signifikan. o Kelas-kelas yang dibuat secara dinamis (khususnya My.Forms). * Peningkatan yang dilakukan terhadap konverter kode sumber dari Visual Basic ke Visual Basic .NET. * Penggunaan kata kunci (keyword) Using, yang menyederhanakan penggunaan objek-objek yang membutuhkan pola Dispose untuk membebaskan sumber daya yang sudah tidak terpakai. * Just My Code, yang menyembunyikan kode reusable yang ditulis oleh alat bantu Integrated Development Environment (IDE) Visual Studio .NET. * Pengikatan sumber data (Data Source binding), yang mampu mempermudah pengembangan aplikasi basis data berbasis klien/server. Fungsi-fungsi yang tersebut di atas (khususnya My) ditujukan untuk memfokuskan Visual Basic .NET sebagai sebuah platform pengembangan aplikasi secara cepat dan "menjauhkannya" dari bahasa C#. Bahasa Visual Basic 2005 memperkenalkan fitur-fitur baru, yakni: * Bawaan .NET Framework 2.0: o Generics o Partial class, sebuah metode yang dapat digunakan untuk mendefinisikan beberapa bagian dari sebuah kelas di dalam sebuah berkas, lalu menambahkan definisinya di lain waktu; sangat berguna khususnya ketika mengintegrasikan kode pengguna dengan kode yang dibuat secara otomatis. o Nullable Type * Komentar XML yang dapat diproses dengan menggunakan beberapa alat bantu seperti NDoc untuk membuat dokumentasi secara otomatis. * Operator overloading * Dukungan terhadap tipe data bilangan bulat tak bertanda (unsigned integer) yang umumnya digunakan di dalam bahasa lainnya. Visual Basic 9.0 (Visual Basic 2008) Versi ini merupakan versi terbaru yang dirilis oleh Microsoft pada tanggal 19 November 2007, bersamaan dengan dirilisnya Microsoft Visual C# 2008, Microsoft Visual C++ 2008, dan Microsoft .NET Framework 3.5. Dalam versi ini, Microsoft menambahkan banyak fitur baru, termasuk di antaranya adalah: * Operator If sekarang merupakan operator ternary (membutuhkan tiga operand), dengan sintaksis If (boolean, nilai, nilai). Ini dimaksudkan untuk mengganti fungsi IIF. * Dukungan anonymous types * Dukungan terhadap Language Integrated Query (LINQ) * Dukungan terhadap ekspresi Lambda * Dukungan terhadap literal XML * Dukungan terhadap inferensi tipe data. * dukungan terhadap 'LINQ' \\ Hubungan dengan Visual Basic klasik Apakah Visual Basic .NET dianggap sebagai sebuah versi Visual Basic atau benar-benar bahasa yang berbeda merupakan sebuah topik perdebatan yang hangat. Hal ini dikarenakan sintaksis bahasa Visual Basic .NET tidak mengalami perubahan yang sangat drastis, dan hanya menambahkan beberapa dukungan fitur baru seperti penanganan eksepsi secara terstruktur dan ekspresi yang bisa di-short-circuit-kan. Dua perubahan tipe data pun terjadi saat berpindah ke Visual Basic .NET. Dibandingkan dengan Visual Basic 6.0, tipe data Integer yang dimiliki oleh Visual Basic .NET memiliki panjang dua kali lebih panjang, dari 16 bit menjadi 32 bit. Selain itu, tipe data Long juga sama-sama berubah menjadi dua kali lipat lebih panjang, dari 32 bit menjadi 64 bit. Bilangan bulat 16-bit dalam Visual Basic .NET dinamakan dengan Short. Lagi pula, desainer GUI Windows Forms yang terdapat di dalam Visual Studio .NET atau Visual Basic .NET memiliki gaya yang sangat mirip dengan editor form Visual Basic klasik. Jika sintaksis tidak banyak yang berubah, lain halnya dengan semantik, yang berubah secara signifikan. Visual Basic .NET merupakan sebuah bahasa pemrograman yang mendukung fitur "Bahasa Pemrograman Berorientasi Objek" secara penuh, karena memang didukung oleh arsitektur Microsoft .NET Framework, yang mengandung kombinasi dari Common Language Runtime dan Base Class Library. Visual Basic klasik, hanya merupakan sebuah bahasa pemrogaman berbasis objek, yang berjalan di atas arsitektur Component Object Model (COM). Perubahan ini telah mengubah banyak asumsi tentang hal yang benar yang harus dilakukan dengan mempertimbangkan performa dan kemudahan untuk dipelihara. Beberapa fungsi dan pustaka perangkat lunak, yang ada di dalam Visual Basic klasik, kini tidak terdapat di dalam Visual Basic .NET; mungkin masih banyak yang masih terdapat di dalam Visual Basic .NET, tapi tidak seefisien apa yang ditawarkan oleh .NET Framework. Bahkan jika program Visual Basic klasik bisa dikompilasi dengan benar, sebagian besar program Visual Basic klasik harus melalui beberapa proses refactoring untuk mengadopsi fitur bahasa baru secara keseluruhan. Dokumentasi untuk ini pun tersedia di situs Microsoft[1]. Contoh Pemrograman Contoh program sederhana dalam bahasa Visual Basic .NET yang dipakai untuk menghitung jumlah pembayaran dari m_item buah barang dengan harga m_price per item ditambah 5% pajak penjualan: [2]. Dim m_item, m_price, tax, total As double m_item = double.Parse(textBox1.Text) m_price = double.Parse(textBox2.Text) tax = 0.05 total = m_item * m_price * (1 + tax) label5.Text = total.ToString() MessageBox.Show("Well Done.") Berikut ini adalah contoh lain dari program Visual Basic yang menggunakan objek CheckBox dan ComboBox untuk menghitung jumlah kredit mata kuliah yang diambil oleh seorang mahasiswa (masing-masing mata kuliah = 3 kredit): Dim total As Integer total = 0 ' awal dari jumlah kredit total If (CheckBox1.Checked = True) Then 'boleh memilih semua checkbox total += 3 End If If (CheckBox2.Checked = True) Then total = total + 3 End If If (CheckBox3.Checked = True) Then total = total + 3 End If If (ComboBox1.SelectedIndex = 0) Then 'hanya bisa memilih satu total = total + 3 ElseIf (ComboBox1.SelectedIndex = 1) Then total = total + 3 ElseIf (ComboBox1.SelectedIndex = 2) Then total = total + 3 End If Label3.Text = CStr(total) ' hasil kredit total yang diambil