Object Oriented Programming in C# (Part2)

Pada Turtorial kedua ini akan dibahas beberapa topik yaitu:

  • Destroy Object
  • Overloading Method
  • Enkapsulasi Data dengan Property
  • Passing Value Type By Reference

Destroy Object

Karena C# menyediakan garbage collector, anda tidak perlu secara eksplisit men-destroy objek. Jika anda bekerja dengan unmanage resource (kode yang tidak di handle oleh CLR) maka anda tetap harus mendestroy objek secara manual. Adapun cara pendeklarasian destruktor pada C# sebagai berikut:

   1: ~MyClass( )
   2: {
   3:   // perintah disini
   4: }

Sintaks diatas akan diterjemahkan oleh compiler sebagai berikut

   1: protected override void Finalize()
   2:     {
   3:        try
   4:        {
   5:            // do work here
   6:        }
   7:        finally
   8:        {
   9:             base.Finalize();
  10:        }
  11:     }

Jika anda menggunakan managed code pada C# maka anda tidak diperbolehkan untuk mendestroy object secara langsung karena pada managed code, destroy object sudah diatur oleh komponen garbage collector pada CLR. Untuk men-destroy objek secepat mungkin setelah tidak diperlukan lagi anda dapat menggunakan interface Idisposable

   1: using System;
   2:     class Testing : Idisposable //menggunakan interface IDisposable
   3:     {
   4:        bool is_disposed = false;
   5:        protected virtual void Dispose( bool disposing )
   6:        {
   7:           if ( !is_disposed ) // hanya mendispose objek sekali!
   8:           {
   9:              if ( disposing )
  10:              {
  11:                 Console.WriteLine( "Not in destructor,
  12:                 OK to reference other objects" );
  13:              }
  14:              Console.WriteLine( "Disposing..." );
  15:           }
  16:           this.is_disposed = true;
  17:        }
  18:
  19:        public void Dispose( )
  20:        {
  21:           Dispose( true );
  22:           // memanggil Garbage Collector
  23:           GC.SuppressFinalize( this );
  24:        }
  25:
  26:        ~Testing( )
  27:        {
  28:           Dispose( false );
  29:           Console.WriteLine( "In destructor." );
  30:        }
  31:     }

Overloading Method

Pada C# anda dapat mendeklarasikan method atau konstruktor dengan nama yang sama pada sebuah class, tetapi parameter method tersebut harus berbeda bisa jumlah atau tipe datanya. Pada contoh dibawah ini akan ditunjukan bagaimana cara menggunakan overloading konstruktor

   1: public class Time
   2:     {
   3:         // private member variables
   4:         private int Year;
   5:         private int Month;
   6:         private int Date;
   7:         private int Hour;
   8:         private int Minute;
   9:         private int Second;
  10:
  11:         // public accessor methods
  12:         public void DisplayCurrentTime()
  13:         {
  14:             System.Console.WriteLine("{0}/{1}/{2} {3}:{4}:{5}",
  15:             Month, Date, Year, Hour, Minute, Second);
  16:         }
  17:
  18:         // constructors
  19:         public Time(System.DateTime dt)
  20:         {
  21:             Year = dt.Year;
  22:             Month = dt.Month;
  23:             Date = dt.Day;
  24:             Hour = dt.Hour;
  25:             Minute = dt.Minute;
  26:             Second = dt.Second;
  27:         }
  28:
  29:         public Time(string strTime) // overloading konstruktor
  30:         {
  31:             Console.WriteLine(strTime);
  32:         }
  33:
  34:         public Time(int Year, int Month, int Date,
  35:         int Hour, int Minute, int Second) // overloading konstruktor
  36:         {
  37:             this.Year = Year;
  38:             this.Month = Month;
  39:             this.Date = Date;
  40:             this.Hour = Hour;
  41:             this.Minute = Minute;
  42:             this.Second = Second;
  43:         }
  44:     }
  45:
  46:     class Tester
  47:     {
  48:         public void Run()
  49:         {
  50:             System.DateTime currentTime = System.DateTime.Now;
  51:             Time time1 = new Time(currentTime);
  52:             time1.DisplayCurrentTime();
  53:             Time time2 = new Time(2000, 11, 18, 11, 03, 30);
  54:             time2.DisplayCurrentTime();
  55:         }
  56:
  57:         static void Main()
  58:         {
  59:             Tester t = new Tester();
  60:             t.Run();
  61:         }
  62:     }

Selain konstruktor overloading juga bisa diterapkan pada method dalam suatu class yang sama, contoh penulisannya:

   1: void MyMethod(int p1);
   2: void MyMethod(int p1, int p2);    // beda banyak parameter
   3: void MyMethod(int p1, string s1); // beda tipe data

Enkapsulasi data dengan Property

Pada pemrograman berorientasi objek variabel dalam class biasanya diberi access modifier private, ini berarti hanya method dalam class tersebut yang dapat mengakses variabelnya. Yang menjadi pertanyaan bagaimana cara anda mengakses variabel bertipe private tersebut ?.

Anda bisa membuat public method set dan get untuk memberi dan mengambil nilai variabel tersebut, misal:

   1: // private member variables
   2:         private int Year;
   3:
   4:         public int getYear() //get method
   5:         {
   6:             return this.Year;
   7:         }
   8:
   9:         public void setYear(int Year) //set method
  10:         {
  11:             this.Year = Year;
  12:         }

Selain menggunakan cara tersebut diatas pada C# disediakan object property untuk memberi nilai dan mengambil nilai dari private variabel dalam suatu class. Penggunaan object property lebih memudahkan anda dalam penulisan kode dibandingkan harus membuat dua method set dan get untuk mengakses satu variabel private. Contoh penggunaan property dapat dilihat pada contoh kode dibawah ini.

   1: public class Time
   2:    {
   3:
   4:       // private member variables
   5:       private int year;
   6:       private int month;
   7:       private int date;
   8:       private int hour;
   9:       private int minute;
  10:       private int second;
  11:
  12:       // membuat property
  13:       public int Hour
  14:       {
  15:          get // mengambil nilai variable Hour
  16:          {
  17:             return hour;
  18:          }
  19:
  20:          set // memberi nilai variable Hour
  21:          {
  22:             hour = value;
  23:          }
  24:       }
  25:
  26:       // public  methods
  27:       public void DisplayCurrentTime( )
  28:       {
  29:          System.Console.WriteLine(
  30:          "Time: {0}/{1}/{2} {3}:{4}:{5}",
  31:          month, date, year, hour, minute, second );
  32:       }
  33:
  34:
  35:       // constructors
  36:       public Time( System.DateTime dt )
  37:       {
  38:          year = dt.Year;
  39:          month = dt.Month;
  40:          date = dt.Day;
  41:          hour = dt.Hour;
  42:          minute = dt.Minute;
  43:          second = dt.Second;
  44:       }
  45:
  46:
  47:    }
  48:     class Tester
  49:     {
  50:         public void Run()
  51:         {
  52:             System.DateTime currentTime = System.DateTime.Now;
  53:             Time t = new Time(currentTime);
  54:             t.DisplayCurrentTime();
  55:
  56:             // mengambil nilai variable Hour, get dijalankan
  57:             int theHour = t.Hour;
  58:
  59:             // menampilkan isi variable Hour
  60:             System.Console.WriteLine("Retrieved the hour: {0}",
  61:             theHour);
  62:
  63:             // increment
  64:             theHour++;
  65:
  66:             // memberi nilai variabel Hour dengan nilai baru
  67:             // set dijalankan
  68:             t.Hour = theHour;
  69:
  70:             // menampilkan isi variabel Hour setelah di-increament
  71:             System.Console.WriteLine("Updated the hour: {0}", t.Hour);
  72:         }
  73:
  74:
  75:         static void Main()
  76:         {
  77:             Tester t = new Tester();
  78:             t.Run();
  79:         }
  80:     }

Passing Value Type By Reference

Secara default di C# pengiriman nilai ke method menggunakan pass by value atau hanya mengirimkan nilai saja ke method seperti contoh dibawah ini

   1: public class Time
   2:     {
   3:         // private member variables
   4:         private int Year;
   5:         private int Month;
   6:         private int Date;
   7:         private int Hour;
   8:         private int Minute;
   9:         private int Second;
  10:
  11:
  12:         // public accessor methods
  13:         public void DisplayCurrentTime()
  14:         {
  15:             System.Console.WriteLine("{0}/{1}/{2} {3}:{4}:{5}",
  16:             Month, Date, Year, Hour, Minute, Second);
  17:         }
  18:
  19:         public void GetTime(int theHour, int theMinute, int theSecond)
  20:         {
  21:             theHour = Hour;
  22:             theMinute = Minute;
  23:             theSecond = Second;
  24:         }
  25:
  26:         // constructor
  27:         public Time(System.DateTime dt)
  28:         {
  29:
  30:             Year = dt.Year;
  31:             Month = dt.Month;
  32:             Date = dt.Day;
  33:             Hour = dt.Hour;
  34:             Minute = dt.Minute;
  35:             Second = dt.Second;
  36:         }
  37:
  38:
  39:     }
  40:
  41:     class Tester
  42:     {
  43:         public void Run()
  44:         {
  45:             System.DateTime currentTime = System.DateTime.Now;
  46:             Time t = new Time(currentTime);
  47:             t.DisplayCurrentTime();
  48:
  49:             int theHour = 0;
  50:             int theMinute = 0;
  51:             int theSecond = 0;
  52:             t.GetTime(theHour, theMinute, theSecond);
  53:             System.Console.WriteLine("Current time: {0}:{1}:{2}",
  54:             theHour, theMinute, theSecond);
  55:
  56:         }
  57:
  58:         static void Main()
  59:         {
  60:             Tester t = new Tester();
  61:             t.Run();
  62:         }
  63:     }

Jika kode diatas dijalankan hasilnya adalah

   1: 7/1/2008 12:22:19
   2: Current time: 0:0:0

Anda dapat melihat bahwa method t.GetTime(theHour, theMinute, theSecond); mencetak output 0:0:0 ini menandakan bahwa nilai yang dikirimkan ke method tersebut tidak dikembalikan ke variabel pemanggil methodnya (theHour, theMinute, theSecond). Jika anda ingin mengembalikan nilai ke variabel pemanggilnya maka anda harus menggunakan keyword ref. Penggunaan pass by ref pada method dapat dilihat pada contoh dibawah ini

   1: public class Time
   2:     {
   3:         // private member variables
   4:         private int Year;
   5:         private int Month;
   6:         private int Date;
   7:         private int Hour;
   8:         private int Minute;
   9:         private int Second;
  10:
  11:
  12:         // public accessor methods
  13:         public void DisplayCurrentTime()
  14:         {
  15:             System.Console.WriteLine("{0}/{1}/{2} {3}:{4}:{5}",
  16:             Month, Date, Year, Hour, Minute, Second);
  17:         }
  18:
  19:         // menggunakan references pada parameter
  20:         public void GetTime(
  21:            ref int theHour,
  22:            ref int theMinute,
  23:            ref int theSecond)
  24:         {
  25:             theHour = Hour;
  26:             theMinute = Minute;
  27:             theSecond = Second;
  28:         }
  29:         // constructor
  30:         public Time(System.DateTime dt)
  31:         {
  32:
  33:             Year = dt.Year;
  34:             Month = dt.Month;
  35:             Date = dt.Day;
  36:             Hour = dt.Hour;
  37:             Minute = dt.Minute;
  38:             Second = dt.Second;
  39:         }
  40:
  41:
  42:     }
  43:
  44:     class Tester
  45:     {
  46:         public void Run()
  47:         {
  48:             System.DateTime currentTime = System.DateTime.Now;
  49:             Time t = new Time(currentTime);
  50:             t.DisplayCurrentTime();
  51:
  52:             int theHour = 0;
  53:             int theMinute = 0;
  54:             int theSecond = 0;
  55:
  56:             // pass integer by reference
  57:             t.GetTime(ref theHour, ref theMinute, ref theSecond);
  58:
  59:             System.Console.WriteLine("Current time: {0}:{1}:{2}",
  60:             theHour, theMinute, theSecond);
  61:
  62:         }
  63:
  64:         static void Main()
  65:         {
  66:             Tester t = new Tester();
  67:             t.Run();
  68:         }
  69:     }

Jika program diatas dijalankan maka hasilnya

   1: 7/1/2008 12:25:41
   2: Current time: 12:25:41

bersambung ke Object Oriented Programming in C# (Part3)

pustaka: “Learning C# 2005”, Jesse Liberty, Brian MacDonald, O’Reilly 2006

Mengenal WPF (Windows Presentation Foundation)

Apa itu WPF?

WPF (Windows Presentation Foundation) adalah teknologi baru yang dirilis oleh Microsoft bersamaan dengan .NET Framework 3.0 (versi sekarang adalah 3.5). Selain WPF .NET 3.0 juga menyertakan beberapa teknologi baru yaitu WF (Workflow Foundation) untuk pemodelan dan WCF (Windows Communication Foundation) yang merupakan pengembangan dari Web Services.

WPF merupakan next generation graphic platform yang memungkinkan anda membuat advance UI (User Interface) yang memadukan document, media, 2D dan 3D, dan animation yang memiliki kemiripan dengan pemrograman web. WPF dapat digunakan pada platform windows seperti Win XP, Vista, dan Windows Server 2003 / 2008.

Sebelum ada teknologi WPF untuk mengembangkan aplikasi windows anda harus menggunakan beberapa teknologi yang berbeda, misalnya untuk menambahkan form user control seperti button kedalam aplikasi anda harus menggunakan komponen Windows Form, untuk menambahkan 2D Graphic anda harus menggunakan library GDI+, untuk 3D Graphic anda harus menggunakan library DirectX atau OpenGL.

WPF didesain untuk menyediakan solusi yang utuh untuk pengembangan aplikasi, WPF menyediakan integrasi dari teknologi yang berbeda, dengan WPF anda dapat menggabungkan komponen vector graphic, complex animation, dan media kedalam aplikasi. Fitur yang baru dalam WPF (.NET 3.5) adalah fitur 3D Graphic yang sudah built-in berbasis pada teknologi DirectX.

Apa saja yang harus diinstall?

Untuk menggunakan teknologi ini anda memerlukan beberapa software yang harus diinstall yaitu:

· Visual Studio 2008 / Visual C# Express 2008 (bagi pengguna C#) / Visual Basic 2008 Express (bagi pengguna vb). Visual Studio 2008 menggunakan .NET Framework 3.5 yang sudah support WPF yang terbaru saat ini. Vesi express edition dapat anda download di http://www.microsoft.com/express/download

· Microsoft Expression Blend 2.5 June 2008 Preview, anda juga dapat mendownload preview edition secara gratis.

XAML (Extensible Application Markup Language)

WPF menggunakan XAML untuk merepresentasikan UI dan user interaction. XAML dibangun dari XML dan penulisanya mirip dengan XHTML yang sering anda gunakan dalam membuat aplikasi berbasis web. XAML juga mendukung prinsip code-behind seperti pada aplikasi ASP.NET. Dengan menggunakan XAML, designer dan programmer dapat bekerja bersama dalam mengembangkan aplikasi, pertama designer membuat design UI kemudian programmer melanjutkan dengan menambah kodenya dalam bahasa yang disupport oleh .NET seperti C# / VB.NET.

Program sederhana menggunakan WPF

Setelah mengenal sekilas apa itu teknologi WPF, pada sesi ini anda akan mencoba membuat aplikasi sederhana menggunakan WPF. Anda dapat membuat aplikasi WPF langsung dari Visual Studio 2008, namun untuk membuat kreasi graphic yang lebih menarik anda dapat menggunakan Microsoft Expression Blend untuk membuat tampilan graphicnya baru kemudian diteruskan dengan menambahkan kode C# / VB.NET menggunakan Visual Studio 2008.

Langkah pertama buka Microsoft Blend Expression, klik File – New Project – Pilih WPF Application – beri nama projectnya “Kalkulator”, pilih bahasa pemrograman sesuai selera anda (C# atau VB).

Design tampilannya sesuai dengan selera anda, karena saya bukan seorang graphic designer maka saya kurang bisa membuat tampilan yang menarik, contoh ini hanya menunjukan kepada anda bahwa anda bisa mendesign tampilan dengan lebih leluasa dengan menggunakan Expression Blend sama sepert anda menggunakan Macromedia Flash atau Adobe Photoshop.

clip_image002

Tampilan yang anda design akan secara otomatis dikonversi kedalam format XAML, jika anda ingin melihat kode XAML klik di tab XAML disebelah kanan, maka akan tampak kode sebagai berikut (kode yang saya tulis pada listing dibawah ini hanya sebagian).

   1: <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   2:     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   3:     x:Class="Kalkulator.Window1" x:Name="Window" Title="Window1" Width="362" Height="416">
   4: <Grid x:Name="LayoutRoot">
   5: <Image Margin="105.577,17,97.68,0" Source="actuallogo.png" Stretch="Fill" Height="60.66" VerticalAlignment="Top"/>
   6: <Image Margin="21,17,0,0" Source="erick.jpg" Stretch="Fill" Height="77.621" VerticalAlignment="Top" Width="79.333" HorizontalAlignment="Left"/>
   7: <Label Margin="21,111,57.107,0" VerticalAlignment="Top" Height="34" Content="SAMPLE KALKULATOR " FontSize="24" FontWeight="Bold">
   8: <Label.Foreground>
   9: <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
  10:         <GradientStop Color="#FF2662CA" Offset="0"/>
  11:         <GradientStop Color="#FFF81717" Offset="1"/>
  12:     </LinearGradientBrush>
  13: </Label.Foreground>
  14: </Label>
  15:     </Grid>
  16: </Window>

Jika anda perhatikan kode XAML yang digenerate oleh Expression Blend hampir mirip dengan XHTML yang biasa anda gunakan dalam membangun websites.

Setelah selesai mendesign tampilan di Expression Blend sekarang saatnya untuk menambahkan code-behind pada Visual Studio 2008. Buka aplikasi yang barusan anda buat dengan menggunakan Visual Studio, pilih New – Open Project – Kalkulator – kemudian isi property Name dari masing-masing property yang ada.

image

Kemudian tambahkan kode pada saat tombol diklik (event onClick). Tambahkan kode sebagai berikut:

clip_image004

   1: private void btnHitung_Click(object sender, RoutedEventArgs e)
   2:        {
   3:            int intBil1 = 0, intBil2 = 0, intHasil = 0;
   4:            intBil1 = Convert.ToInt32(txtBil1.Text);
   5:            intBil2 = Convert.ToInt32(txtBil2.Text);
   6:
   7:            if (rdTambah.IsChecked == true)
   8:            {
   9:                intHasil = intBil1 + intBil2;
  10:                MessageBox.Show("Hasil Penjumlahannya :" + intHasil.ToString());
  11:            }
  12:            else
  13:            {
  14:                intHasil = intBil1 + intBil2;
  15:                MessageBox.Show("Hasil Pengurangan : " + intHasil.ToString());
  16:            }
  17:        }

Untuk mencoba menjalankan aplikasinya tekan Ctrl+F5.

clip_image006

Contoh aplikasi diatas hanya merupakan contoh aplikasi yang sangat sederhana yang bisa dibangun menggunakan WPF. Aplikasi WPF juga dapat digunakan untuk mengembangkan aplikasi 3D graphic dan game.

Apa yang baru dari C# 3.0/C# 2008?

C# 3.0 sudah direlease bersamaan dengan .NET 3.5, adapun fitur tambahan dalam C# 3.0 adalah:

  • WF (Windows Workflow)
  • WCF (Windows Communication Foundation)
  • WPF (Windows Presentation Foundation)
  • LINQ (Language Integrated Query)

Untuk mendukung fitur-fitur diatas bahasa C# 3.0 ditambah beberapa fungsionalitas baru yaitu:

  • Local Variable Type Inference
  • Object Initializers
  • Collection Initializers
  • Anonymous Types
  • Auto-Implemented Properties
  • Extension Methods
  • Lambdas
  • Query Expressions
  • Expression Trees
  • Partial Methods

Object Oriented Programming in C# (Part1)

Pengantar Object Oriented

Aplikasi berbasis windows dan web adalah program yang sangat kompleks yang menyajikan tampilan menarik kepada user dan menawarkan user interface yang kompleks dengan tombol, dropdown, popup menu, toolbox, dan masih banyak komponen yang lain. Dibelakang user interface tersebut masih ada hubungan bussiness prosess yang kompleks seperti misal hubungan antara Product, Customer, dan Order yang melibatkan banyak logika dan pengolahan data.

Untuk menangani berbagai kompleksitas yang terjadi maka programmer mengembangkan teknik yang diberi nama “Objcet Oriented Programming”, dengan tujuan yang sederhana yaitu mengatur kompleksitas dengan memodelkan aspek esensial yang ada. Jika model yang dikembangkan semakin mendekati problem yang akan dipecahkan maka semakin mudah pula persoalan tersebut dapat dimengerti sehingga program lebih mudah ditulis dan di-maintain.

Problem yang akan dipecahkan dan semua informasi yang berhubungan dengan problem tersebut sering disebut sebagai problem domain. Misal jika anda ingin membuat program untuk keperluan Inventory dan Sales di suatu perusahaan maka problem domainnya adalah semua informasi tentang perusahaan tersebut yang berhubungan dengan pengaturan stok inventory, cara penjualan, pemasukan penjualan dan data lainnya. Manaager penjualan dan Manager bagian gudang akan menjadi problem domain expert yang dapat membantu anda dalam menyelesaikan masalah.

Design dari Object Oriented harus berisi objek-objek yang ada pada problem domain tersebut. Sebagai contoh jika problem domainnya adalah mesin ATM maka objek didalamnya seharusnya adalah customer, rekening, dll.

Pada level pertama untuk mendesain anda harus berpikir interaksi antar objek-objek tersebut, dilihat dari status, kapabilitas, dan tanggung jawabnya.

  • Status : programmer harus mengacu pada kondisi status objek tersebut. Sebagai contoh anda mempunyai objek untuk merepresentasikan customer maka status dari customernya adalah customer address, phone number, email, sejarah pembelian customer, dsb.
  • Kapabilitas / Hak : customer dapat memiliki kapabilitas tapi programmer harus memilih yang berhubungan dengan problem domainnya diantaranya untuk membuat rekening, menarik tabungan, menyimpan tabungan, transfer dsb.
  • Tanggung Jawab: bersama dengan kapabilitas /hak ada pula tanggung jawab. Customer mempunyai tanggung jawab untuk mengisi informasi alamat tempat tinggalnya.

Class vs Object

Apa sich bedanya?. Jika anda ingin membangun rumah Class adalah blueprint / gambar (berisi spesifikasi lengkap dari rumah yang akan dibuat, ukuran, jumlah, dll).
Sedangkan object adalah bentuk fisik / rumah yang dibangun berdasarkan blueprint / class yang sudah ada, biasa disebut instan class.

image

Mendefinisikan Class

Class di C# dapat terdiri dari kumpulan variable (field), property dan method. Cara untuk menggunakan class adalah dengan membuat instan class-nya. Untuk menjalankan class maka harus ada satu method main pada class tersebut. contoh pendeklarasian class di C# sebagai berikut:

   1: public class Time
   2:     {
   3:         // private variables
   4:         private int year;
   5:         private int month;
   6:         private int date;
   7:         private int hour;
   8:         private int minute;
   9:         private int second;
  10:  
  11:         // public methods
  12:         public void DisplayCurrentTime()
  13:         {
  14:             Console.WriteLine("Menampilkan Waktu..");
  15:         }
  16:     }
  17:  
  18:     class Program
  19:     {
  20:         static void Main(string[] args)
  21:         {
  22:             Time timeObject = new Time(); //membuat instan class
  23:             timeObject.DisplayCurrentTime();
  24:         }
  25:     }

 

Access Modifiers

Access Modifiers digunakan untuk menentukan hak akses dari class dan method, adapun access modifier yang ada pada C# sebagai berikut:

image

Continue reading