C# Stored Procedures vs Linq

Dalam dot net programming, banyak cara bagi developer untuk melakukan hubungan dengan database dan mengaksesnya. Secara umum ada 2 cara yang umum digunakan yaitu menggunakan DataSet+SqlDataAdapter atau Linq.

Secara garis besar, kita dapat menggambarkan keuntungan Linq dibanding data adapter:
  • object oriented, sehingga tipe data yang diakses sudah terkonversi menjadi data type dot net. Hal ini membuat penggunaan tipe data yang lebih aman
  • Linq memiliki query optimizer sendiri sehingga query dasar yang digunakan developer sudah diimprove secara otomatis
  • relasi table dapat dilakukan secara obect-oriented sehingga lebih mudah digunakan saat development
Namun di samping itu Linq memiliki kelemahan yang cukup signifikan. Berikut adalah keunggulan stored procedure dibanding dengan Linq:
  • struktur objek Linq sangat bergantung pada struktur database, sehingga perubahan sekecil apapun akan memerlukan penangan dari sisi applikasi atau applikasi berpotensi break. Sementara mengubah stored procedures tidak memerlukan perubahaan dari sisi applikasi.
  • sulit untuk menelusuri query-query yang digunakan (terutama yang kompleks). Tujuan dari penelusuran tersebut seperti saat debugging atau indexing
  • stored procedures dapat digunakan untuk query yang simple hingga yang query kompleks seperti summarize atau pagination

C# Winforms vs WPF

Banyak sekali modul-modul applikasi yang dapat dibangun dan dipergunakan dengan menggunakan .Net C# Winforms. Winforms sendiri juga sudah merupakan framework yang bagus, sudah full-oop, event-driven dan stable. Namun mengapa Windows memutuskan untuk mengeluarkan framework yang lain, yaitu WPF, sebagai framework desktop lain di samping winforms? Berikut adalah perbedaan antara WPF dan Winforms.
  • Winforms sangat mendukung architecture pattern MVC (model-view-controller), sementara WPF lebih mendukung menggunakan architecture pattern MVVM (model-view-viewmodel)
  • Dalam arsitekturnya, Winforms adalah event-driven sementara WPF lebih mendukung binding
  • Component (control) dalam WPF lebih customizable dibanding Winforms
  • Struktur penulisan WPF adalah hampir sama dengan Silverlight, modul mirip flash yang dapat di-run dari browser
  • Winforms menggunakan Windows API dalam men-render UI sementara WPF menggunakan directX sehingga lebih lightweight (less resource)
  • Konstruksi UI winforms seluruhnya menggunakan codebehind, sementara WPF menggunakan XAML (walaupun dapat juga dilakukan dari codebehind)
  • Pada WPF terdapat control "Style", yang dapat di-reuseable sehingga user tidak perlu membuat usercontrol sendiri untuk me-style kan controlnya. 
Kesimpulannya, WPF lebih mendukung data binding, style-customizable dan lightweight UI render. Namun apabila user baru mempelajari programming, lebih disarankan untuk dimulai dengan Winforms, karena lebih mudah dipelajari daripada WPF.

C# Public Property vs Public Attribute

Well, setelah cukup lama bermain dengan C#, ada beberapa hal yang terkesan 'lucu' dalam pembelajaran. Hal tersebut adalah property vs attribute.
Dalam mendeklarasi class di C#, ada beberapa cara untuk merepresentasikan attribut, di antaranya adalah:
  • Public attribute, yaitu dengan mendeklarasi attribute dengan access modifier public, sehingga mudah dapat digunakan oleh class lain
  • Property, yaitu mendeklarasi public attribute dengan accessor get; dan/atau set;
  • Function getter setter, cara ini digunakan umum oleh java
Sekilas, public attribute dan property tidak banyak berbeda, terkecuali get/set accessor yang dapat di-inject oleh potongan syntax. Namun ternyata setelah banyak menggunakan dua hal ini, ada perbedaan yang cukup jelas, yaitu public attribute tidak akan tampil untuk data yang di-binding, baik itu WPF binding, winform binding ataupun Asp.Net binding. Karenanya, biasakan untuk menggunakan property dan bukan public attribute.

Try / Catch, The Double-edged Sword

Try/catch, untuk mayoritas programmer (terutama java) pasti tidak asing lagi dengan syntax tersebut. Syntax tersebut memiliki kemampuan yang hebat dan sangat membantu dalam melakukan pengembangan.

Namun, penggunaan try/catch yang tidak hati-hati dan sembarangan dapat membuat celah dalam sistem. Salah satu celah yang paling umum adalah tidak adanya error message (isi catch kosong). Celah tersebut membuat debugging menjadi susah karena exception tidak menghasilkan error box.

Jadi, apa saja yang harus diperhatikan dalam penggunaan try/catch? Berikut adalah beberapa hal yang sepengalaman saya harus diperhatikan:

1. Penanganan Exception dalam catch.
Object Exception memiliki property Message yang membawa pesan error yang terjadi. Salah satu penanganan exception yang paling mudah adalah menggunakan MessageBox (desktop app) atau Response.Write (asp). Penanganan lebih 'advanced' dapat berupa refresh data, kalkulasi autonomous, dan lainnya sesuai dengan tujuan.

2. Object Exception memiliki turunan
Object Exception memiliki turunan sesuai dengan error yang ada. Misalnya seperti FormatException pada .Net yang dihasilkan dari penggunaan format yang berbeda (misalnya ada karakter ketika parsing ke int, umumnya terjadi ketika parse). Ada juga NullReferenceException dimana program berusaha mendapatkan dan memproses variable yang bernilai null. Penanganan yang berbeda untuk tiap-tiap jenis Exception yang berbeda dapat membantu mempercepat development.

3. Pastikan tidak ada proses bersangkutan yang berjalan setelah ada Exception. Ingat, proses tetap berjalan setelah try/catch.
Misalkan anda memiliki int angka yang didapat dari parsing tbox1.Text. Anda men-'trap' proses parsing tersebut ke dalam try/catch. Kemudian angka tersebut akan digunakan untuk memasukkan data ke dalam database. Proses input data tersebut akan tetap berjalan walaupun ada Exception tanpa penanganan.

Proses yang salah:

int angka=0;
try{
  angka = int.Parse(tbox1.Text);
}
catch(Exception e){
  //show message here
}
//insert process, nilai angka adalah 0


Salah satu cara untuk menghindarinya:

int angka=0;
try{
  angka = int.Parse(tbox1.Text);
  //insert process
}
catch(Exception e){
  //show message here
}

CUtility.Forms.CTextBoxCurrency

Digunakan untuk menggantikan TextBox asal .Net yang digunakan untuk menangani input currency. Merupakan extended dari CTextBoxNominal.

cTextBoxCurrency.CurrencyPre
Menentukan string yang akan digunakan sebagai mata uang, ditampilkan sebelum text.

cTextBoxCurrency.CurrencyPost
Menentukan string yang akan digunakan sebagai mata uang, ditampilkan setelah text.

CTextBoxCurrency cTextBoxCurrency = new CTextBoxCurrency();
cTextBoxCurrency.CurrencyPre = "Rp. "; // hasilnya Rp. 0
cTextBoxCurrency.CurrencyPre = "";
cTextBoxCurrency.CurrencyPost = " US$"; // hasilnya 0 US$


Keyword: (C# custom textbox, C# textbox currency, C# textbox uang)

CUtility.Forms.CTextBox

Digunakan untuk menggantikan TextBox asal .Net dengan kustomisasi lebih banyak dan mudah.

cTextBox.InputMode
Menentukan karakter apa saja yang dapat diinput oleh user. Terdiri dari alpha, numeric, specialchar dan space. Dapat dikombinasikan dengan keyword '|' .
CTextBox cTextBox = new CTextBox();
cTextBox.InputMode = InputMode.Alpha | InputMode.Numeric | InputMode.Space;


cTextBox.AllowedSpecialChar
Menentukan karakter apa saja di luar [a-zA-Z][0-9] dan spasi yang dapat diinput.
CTextBox cTextBox = new CTextBox();
cTextBox.InputMode = InputMode.SpecialChar;
cTextBox.AllowedSpecialChar = "[],.\\/\":;" ; 

CUtility.Forms.CTextBoxNominal

Digunakan untuk pengganti TextBox bawaan .Net. Dikhususkan untuk menampung data nominal (angka).

cTextBoxNominal.AllowDecimal
Menentukan apakah boleh memasukkan nilai decimal (dengan karakter titik)

cTextBox.Nominal.AllowMinus
Menentukan apakah boleh memasukkan inputan minus (dengan karakter -)

cTextBoxNominal.TextToInt
Mengambil isi textbox yang telah diparse ke int. Jangan pergunakan ini untuk AllowDecimal = true. Fungsinya sama dengan int.Parse(cTextBoxNominal.Text).

cTextBoxNominal.TextToFloat
Mengambil isi textbox yang telah diparse ke float. Fungsinya sama dengan float.Parse(cTextBoxNominal.Text).

cTextBoxNominal.TextToDouble
Mengambil isi textbox yang telah diparse ke double. Fungsinya sama dengan double.Parse(cTextBoxNominal.Text).

Contoh:

CTextBoxNominal cTextBoxNominal = new CTextBoxNominal;
cTextBoxNominal.AllowDecimal = false;
cTextBoxNominal.AllowMinus = true;
int angka = cTextBoxNominal.TextToInt;

cTextBoxNominal.AllowDecimal = true;
float angka = cTextBoxNominal.TextToFloat;
double angka = cTextBoxNOminal.TextToDouble;