Membuat Aplikasi Bisnis Menggunakan Visual Studio Lightswitch 2013 Published by Risal at Smashwords Copyright 2014 Risal ISBN PENDING
License Notes Thank you for downloading this ebook. You are welcome to share it with your friends. This book may be reproduced, copied and distributed for non-commercial purposes, provided the book remains in its complete original form.Thank you for your support. This book is only availabe in Indonesian.
Nota Lisensi Terimakasih telah mengunduh ebook ini. Anda diperkenankan untuk membagikannya kepada teman-teman Anda. Buku ini boleh diproduksi ulang, disalin, dan disebarluaskan untuk keperluan non-komersial, selama buku tetap pada kondisi lengkap sama seperti aslinya. Terimakasih untuk dukungan Anda. Buku ini hanya tersedia dalam bahasa Indonesia.
Daftar Isi Bahasa Pemrograman C# Halo C# Tipe Data Pernyataan if-else Pernyataan switch-case Pernyataan for Pernyataan do-while Pernyataan try-catch-finally Pemrograman Berorientasi Objek Kelas dan Objek Property Method Constructor Overloading
Inheritance LINQ Visual Studio Lightswitch Aplikasi Lightswitch Pertamaku Aplikasi Bisnis dan Manajemen Data Antarmuka Data dan Query Tabel Relasi Inisialisasi Property Validasi Computed Property Query Screen Screen Templates Screen Navigation Custom Layout Custom Control Authentication dan Authorization Konfigurasi Access Control Verifikasi Hak Akses Pengujian Hak Akses
Bahasa Pemrograman C# Bahasa pemrograman C# adalah bahasa multi-paradigma yang meliputi paradigma pemrograman berorientasi objek, paradigma fungsional, paradigma prosedural, dan paradigma pemrograman berorientasi komponen. Bahasa pemrograman ini dibuat oleh Microsoft sebagai bahasa utama dalam pengembangan aplikasi menggunakan .NET Framework. Bahasa C# diajukan ke standarisasi internasional ECMA (ECMA-334) dan ISO (ISO/IEC 23270:2006). C# dirancang sebagai bahasa pemrograman berorientasi objek yang sederhana dan modern. Pada saat buku ini ditulis, C# sudah mencapai versi 5.0.
Halo C# Ketika belajar sebuah bahasa pemrograman, kode program yang pertama kali dibuat biasanya berjudul Hello World. Maka ada baiknya bilamana dimulai dengan membuat kode program tersebut. Bukalah Microsoft Visual Studio 2013, pilih menu File | New | Project (atau dapat juga menekan shortcut Ctrl+Shift+N). Pilihlah Visual C# sebagai pilihan bahasa dan Console Application untuk jenis aplikasi. Beri nama proyek tersebut (Name) HelloCSharp.
Tulis kode program berikut pada dokumen Program.cs. Bahasa C# memiliki aturan yang sama dengan keluarga bahasa C lainnya. Kesalahan yang paling sering terjadi adalah penggunaan huruf besar/kecil dan kekurangan tanda titik koma (;). using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HaloCSharp { class Program { static void Main(string[] args) {
string nama; Console.Write("Nama Anda? "); nama = Console.ReadLine(); Console.WriteLine(nama + " baru saja belajar C#."); Console.ReadKey(); }
}
}
Pilihlah menu Debug | Start Debuging (F5) atau Debug | Start Without Debuging (Ctrl+F5) untuk menjalankan kode program. Berikut adalah hasil output dari kode program tersebut.
Bilamana diperhatikan dengan seksama maka kode program utama ada pada method (fungsi) Main. Berikut adalah penjelasan singkat mengenai kode program tersebut. string nama;
Digunakan untuk mendefinisikan sebuah variabel bertipe string dengan nama (nama). Console.Write("Nama Anda? ");
Method ini digunakan untuk menampilkan teks atau isi variabel ke layar konsol. nama = Console.ReadLine();
Method ini memiliki fungsi untuk mengambil input teks dari layar konsol. Hasil input tersebut disimpan dalam variabel nama yang sudah disiapkan sebelumnya. Console.WriteLine(nama + " baru saja belajar C#.");
Method ini memiliki fungsi yang serupa dengan Console.Write, perbedaannya hanya pada Console.WriteLine teks/variabel yang ditampilkan diikuti dengan pergantian baris. Console.ReadKey();
Method ini berfungsi untuk mengambil satu buah input keyboard. Method ini biasa digunakan oleh aplikasi konsol untuk memberhentikan sementara jalan dari kode program.
Tipe Data Bahasa pemrograman C# memiliki beberapa tipe data dasar yang dapat digunakan untuk membentuk tipe data bentukan lainnya. Semua tipe data (kecuali tipe data string dan object) yang tertera berikut dikenal dengan tipe data sederhana. Berikut ini adalah beberapa tipe data yang sering digunakan. Tipe data byte, memiliki cakupan nilai antara 0 s.d. 255. Tipe data byte dan sbyte merupa tipe data bilangan bulat terkecil. Tipe data sbyte, memiliki cakupan nilai antara -128 s.d. 127. Tipe data int, memiliki cakupan nilai antara -2,147,483,648 s.d. 2,147,483,647. Tipe data ini adalah tipe data bilangan bulat yang paling sering untuk digunakan. Tipe data uint, memiliki cakupan nilai antara 0 s.d. 4,294,967,295. Tipe data long, memiliki cakupan nilai yang sangat besar yaitu mulai dari – 9,223,372,036,854,775,808 s.d. 9,223,372,036,854,775,807. Tipe data long dan ulong merupakan tipe data bilangan bulat terbesar. Tipe data ulong, memiliki cakupan nilai antara 0 s.d. 18,446,744,073,709,551,615. Tipe data short, memiliki cakupan nilai antara -32,768 s.d. 32,767. Tipe data ushort, memiliki cakupan nilai antara 0 s.d. 65,535. Tipe data float, memiliki cakupan nilai antara -3.4 × 1038 s.d. +3.4 × 1038 dan tingkat presisi 7 digit. Tipe data ini adalah tipe data terkecil yang dapat digunakan untuk menyimpan bilangan berkoma (floating point). Tipe data double, memiliki cakupan nilai antara ±5.0 × 10−324 s.d. ±1.7 × 10308 dan tingkat presisi 15-16 digit. Tipe data ini adalah tipe data yang paling sering digunakan untuk perhitungan matematik (karena memiliki tingkat presisi yang tinggi). Tipe data bool, memiliki dua kemungkinan nilai true atau false. Tipe data ini digunakan untuk menyimpan hasil operasi boolean. Tipe data char, memiliki cakupan nilai antara U+0000 s.d. U+FFFF. Tipe data ini digunakan untuk menyimpan satu karakter unicode. Tipe data string, merupakan kumpulan dari karakter unicode, tipe data ini digunakan untuk menyimpan teks. Tipe data object, merupakan tipe data dasar dari semua tipe data yang ada pada .NET Framework. Ketika sebuah nilai dikonversi ke tipe data object maka dikenal dengan proses boxing. Sedangkan ketika melakukan konversi dari tipe data object ke tipe data awal dikenal dengan proses unboxing.
Pernyataan if-else
Pernyataan if digunakan untuk menjalankan (kumpulan) kode program secara selektif. Kumpulan kode program pada blok if akan dijalankan apabila kondisi terpenuhi (ekspresi boolean menghasilkan nilai true). Sedangkan blok else (bilamana ada) akan dijalankan apabila kondisi pada blok if tidak dipenuhi. Buatlah sebuah proyek baru File | New | Project (Ctrl+Shift+N), kemudian pilih Console Application sebagai jenis proyek, dan beri nama ContohIfElse. Pastikan bahasa yang digunakan adalah Visual C#. Tulis kode program berikut. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ContohIfElse { class Program { static void Main(string[] args) { Console.Write("Nilai = "); string nilaiStr = Console.ReadLine(); int nilai = int.Parse(nilaiStr); if (nilai > 0) { if (nilai % 2 == 0) Console.WriteLine("Genap Positif."); else Console.WriteLine("Ganjil Positif."); } else if (nilai < 0) Console.WriteLine("Negatif."); else Console.WriteLine("Nol"); Console.ReadKey(); }
}
}
Jalankan kode program tersebut, lalu masukan nilai -1, 0, 1, dan 2. Bilamana kode dituliskan dengan benar maka menghasilkan keluaran Negatif, Nol, Ganjil Positif, dan Genap Positif.
Berikut adalah pejelasan dari kode program ContohIfElse. Console.Write("Nilai = "); string nilaiStr = Console.ReadLine();
Kode program di atas akan menampilkan teks “Nilai = ” ke layar, lalu diikuti dengan meminta input dari pengguna. Input dari pengguna disimpan pada variabel nilaiStr. int nilai = int.Parse(nilaiStr);
Method Parse() digunakan untuk melakukan “parsing” teks ke tipe data int. Hampir sebagian besar fasilitas input yang ada pada bahasa pemrograman C# menghasilkan sebuah nilai bertipe string. Parsing adalah satu-satunya cara untuk mendapatkan nilai tipe data lainnya. if (nilai > 0) { if (nilai % 2 == 0) Console.WriteLine("Genap Positif."); else Console.WriteLine("Ganjil Positif."); } else if (nilai < 0) Console.WriteLine("Negatif."); else Console.WriteLine("Nol");
Potongan kode program di atas merupakan contoh penggunaan pernyataan if-else. Dalam kasus kali ini pernyataan if digunakan untuk menguji apakah variabel nilai lebih besar dari 0 (nol), bilamana benar maka pengujian diteruskan ke pernyataan if yang ada di dalam. Pernyataan if yang ada di dalam digunakan untuk menguji apakah sebuah nilai dapat habis dibagi 2. Bilamana habis maka menampilkan teks “Genap Positif.”, selain itu menampilkan “Ganjil Positif”. Blok kode program if lainnya dijalankan bilamana nilai negatif atau nol.
Pernyataan switch-case
Berbeda dengan pernyataan if yang menjalankan kode program bilamana kondisi terpenuhi, pernyataan switch-case membandingkan isi variabel dengan kumpulan konstanta yang telah terdefinisi. Bilamana isi variabel sama dengan konstanta yang ada pada salah satu case, maka blok kode program yang ada pada case tersebut yang dijalankan. Pada contoh kode program berikut pengguna diminta untuk memasukan sebuah nilai mutu (A-E) dan besar kredit. Kumpulan nilai mutu dan kredit yang dimasukan diolah untuk menghitung nilai IPK. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ContohSwitchCase { class Program { static void Main(string[] args) { int value, sum, total; sum = 0; total = 0; while(true) { Console.Write("Nilai (A-E|X - stop): "); string valStr = Console.ReadLine(); if (string.Compare(valStr, "x", true) == 0) break; Console.Write("SKS: "); string sksStr = Console.ReadLine(); int sks; int.TryParse(sksStr, out sks); switch(valStr.ToLower()) { case "a": value = 4; break; case "b": value = 3; break; case "c": value = 2; break; case "d": value = 1; break; default: value = 0; break; }
}
sum += (sks * value); total += sks;
if(total > 0) {
}
double ipk = (double)sum / total; Console.WriteLine("IPK: " + ipk);
Console.ReadLine(); }
}
}
Contoh output dari kode program di atas dapat dilihat pada Gambar 4. Pada contoh kasus ini pengguna memasukan nilai (a, 4), (c, 2), (d, 3), (e, 2), dan (x). Hasil output dari aplikasi (IPK) adalah 2.0909….
Berikut ini adalah penjelasan dari kode program ContohSwitchCase. Penjelasan hanya diberikan pada kode program yang belum pernah dibahas sebelumnya. int sks; int.TryParse(sksStr, out sks);
Method TryParse() memiliki fungsi yang sama dengan method Parse(). Perbedaannya pada method TryParse() bilamana gagal tidak akan menghasilkan exception, sedangkan pada method Parse() akan menghasilkan exception. Exception dibahas pada sub-bab Pernyataan try-catch-finally. Pada method TryParse() bilamana method tersebut gagal melakukan parsing maka hasil dari output adalah nilai default dari tipe data yang dimaksud, untuk kasus tipe data numerik nilai default adalah 0 (nol). switch(valStr.ToLower()) { case "a": value = 4; break; case "b": value = 3; break; case "c": value = 2; break; case "d": value = 1; break; default: value = 0; break;
}
Method ToLower() digunakan untuk mengubah string menjadi huruf kecil. Hal ini perlu dilakukan untuk menyederhanakan pernyataan switch-case, bilamana tidak dilakukan maka pengujian case harus dituliskan huruf kapital dan huruf kecil. Perlu diingat bahwa setiap blok case harus diakhiri dengan keyword break. Blok default mirip dengan blok else pada pernyataan if-else, blok kode ini akan dijalankan bilamana tidak ada blok case yang dijalankan. sum += (sks * value); total += sks;
Pernyataan total += sks ekivalen dengan pernyataan total = total + sks. Selain operator penugasan di atas, masih banyak operator penugasan lainnya, untuk lebih jelasnya dapat dilihat pada tautan berikut (http://msdn.microsoft.com/enus/library/aa691314(v=vs.71).aspx).
Pernyataan for Pernyataan for digunakan untuk mengulang sekumpulan kode program. Pernyataan ini digunakan bilamana jumlah pengulangan sudah diketahui sebelum pengulangan dilakukan. Bilamana jumlah pengulangan tidak diketahui sebelumnya ada baiknya menggunakan pernyataan while atau do-while yang dibahas pada sub-bab Pernyataan do-while. Untuk melihat pernyataan for beraksi buatlah sebuah project konsol dengan nama ContohFor (pastikan bahasa yang digunakan adalah Visual C#). Ketikan kode program berikut. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ContohFor { class Program { static void Main(string[] args) { Console.Write("N = "); string nStr = Console.ReadLine(); int n; int.TryParse(nStr, out n); for(int row = 0; row < n; ++row) { for (int col = 0; col < (row + 1); ++col) Console.Write("*"); Console.WriteLine(); } Console.ReadKey();
} }
}
Console.Write("N = "); string nStr = Console.ReadLine(); int n; int.TryParse(nStr, out n);
Kode program di atas meminta input dari pengguna. Hasil input adalah sebuah nilai bertipe string. Method TryParse() mencoba melakukan “parsing” (konversi), bilamana berhasil maka variabel n akan diperbaharui dengan nilai baru. for(int row = 0; row < n; ++row) { for (int col = 0; col < (row + 1); ++col) Console.Write("*"); Console.WriteLine(); }
Kode program melakukan pengulangan sebanyak n. Kode program dalam pernyataan for pertama melakukan pengulangan sebanyak row, jadi ketika nilai row bernilai 1, maka perintah Console.Write(“*”) akan dijalankan 1 kali, ketika bernilai 2 akan dijalankan 2 kali, dan seterusnya. Kode program ini pada akhirnya menghasilkan pola segitiga.
Pernyataan do-while Pernyataan do-while digunakan untuk mengulang sekumpulan kode program yang jumlah pengulangannya belum diketahui sebelumnya atau yang jumlah pengulangannya tak berhingga (hanya berhenti bilamana aplikasi dimatikan). Selain pernyataan do-while, pernyataan while (tanpa keyword do) juga dapat digunakan untuk mengulang kode program yang jumlah pengulangannya belum diketahui. Pada pernyataan do-while, blok kode program (dalam pernyataan do-while) dijalankan minimal satu kali walau kondisi tidak dipenuhi. Sedangkan pada pernyataan while, bilamana kondisi tidak dipenuhi, blok kode program tidak dijalankan sama sekali. Untuk mempermudah penjelasan di atas dapat mencoba untuk membuat dua buah program konsol berikut. using System; using System.Collections.Generic;
using System.Linq; using System.Text; using System.Threading.Tasks; namespace ContohDoWhile { class Program { static void Main(string[] args) { int sum = 0; int value; do { Console.Write("Nilai (< 0 - stop): "); string valStr = Console.ReadLine(); int.TryParse(valStr, out value); if (value >= 0) sum += value; } while (value >= 0);
} }
Console.WriteLine("Jumlah nilai: " + sum); Console.ReadKey();
}
Kode program di atas digunakan untuk menjumlahkan nilai positif. Kode program berhenti menanyakan input bilamana pengguna memasukan nilai negatif. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ContohWhile { class Program { static void Main(string[] args) { int sum = 0; int value; Console.Write("Nilai (< 0 - stop): "); string valStr = Console.ReadLine(); int.TryParse(valStr, out value); while (value >= 0) { sum += value;
}
Console.Write("Nilai (< 0 - stop): "); valStr = Console.ReadLine(); int.TryParse(valStr, out value);
} }
Console.WriteLine("Jumlah nilai: " + sum); Console.ReadKey();
}
Pada contoh program do-while proses input data dilakukan di dalam blok pengulangan, sedangkan pada contoh program while proses input data dilakukan di dalam blok pengulangan dan sebelum masuk ke dalam blok pengulangan. Hal tersebut perlu dilakukan karena pada pernyataan while kondisi diperiksa di awal (sebelum masuk pengulangan), sedangkan pada pernyataan do-while kondisi diperiksa di akhir (setelah kode program dalam blok pengulangan dilakukan).
Pernyataan try-catch-finally Pada contoh program yang membahas Pernyataan if-else proses parsing menggunakan method Parse(), bilamana dimasukan input yang tidak sesuai maka akan dihasilkan exception. Exception bilamana tidak ditangani maka menyebabkan kode program terhenti prematur. Kode program yang baik selalu menangani exception dan error yang dihasilkan oleh program, menampilkan error tersebut ke pengguna, dan membiarkan pengguna untuk mengambil keputusan. Kode program berikut merupakan perbaikan dari kode program yang ada pada sub-bab Pernyataan if-else. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ContohTryCatch { class Program { static void Main(string[] args) { int nilai = 0; bool success = false; while (!success) { Console.Write("Nilai = "); string nilaiStr = Console.ReadLine(); try { nilai = int.Parse(nilaiStr); success = true; } catch(Exception e) { Console.WriteLine("Parsing tidak berhasil dilakukan."); Console.WriteLine("Pesan kesalahan: " + e.Message); } } if (nilai > 0) {
if (nilai % 2 == 0) Console.WriteLine("Genap Positif."); else Console.WriteLine("Ganjil Positif.");
} else if (nilai < 0) Console.WriteLine("Negatif."); else Console.WriteLine("Nol"); Console.ReadKey(); }
}
}
Jalankan kode program di atas dan masukan input yang salah huruf atau bilangan berkoma. Berbeda dengan program sebelumnya, kali ini bilamana masukan salah maka menampilkan pesan kesalahan dan meminta masukan kembali. Proses ini terus dilakukan selama pengguna belum memasukan input yang benar. Kode program yang bertanggung jawab dalam pengecekan exception adalah blok try-catch.
Bilamana method Parse() berhasil melakukan parsing, maka nilai variabel success diubah menjadi true, pengulangan while berhenti karena kondisi tidak terpenuhi. Sedangkan bilamana method Parse() gagal melakukan parsing, maka kode program langsung melompat ke blok catch (penugasan variabel success dilewati), menampilkan pesan kesalahan, lalu meminta pengguna untuk memasukan nilai kembali. while (!success) { Console.Write("Nilai = "); string nilaiStr = Console.ReadLine(); try { nilai = int.Parse(nilaiStr); success = true; } catch(Exception e) { Console.WriteLine("Parsing tidak berhasil dilakukan."); Console.WriteLine("Pesan kesalahan: " + e.Message); } }
Pernyataan try-catch memiliki variasi lainnya yaitu pernyataan try-catch-finally. Pernyataan try-catch-finally menambah satu buah blok finally yang tujuannya melakukan cleanup. Proses cleanup perlu dilakukan bilamana exception dihasilkan oleh proses yang mengambil sumberdaya dari luar (contoh: basis data dan file I/O). Berikut ini adalah contoh program yang digunakan untuk menulis teks “Hello” ke dalam sebuah file teks bernama “testfinally.txt”. using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ContohTryCatchFinally { class Program { static void Main(string[] args) { StreamWriter fp = null; try { string text = "Hello"; fp = File.CreateText("testfinally.txt"); fp.WriteLine(text);
} }
Console.WriteLine("File berhasil dibuat."); } catch(Exception e) { Console.WriteLine("File tidak berhasil dibuat."); Console.WriteLine("Pesan error: " + e.Message); } finally { if (fp != null) fp.Close(); }
}
Blok kode finally menjamin file ditutup bilamana telah berhasil dibuka sebelumnya. Jadi bilamana kode program berjalan semestinya (tanpa ada exception), maka hanya blok kode try dan blok kode finally dijalankan. Sedangkan bilamana kode program menghasilkan exception ketika ada di dalam blok kode try, maka ketiga blok kode program yaitu blok kode try, blok kode catch, dan blok kode finally dijalankan.
Pemrograman Berorientasi Objek Pemrograman berorientasi objek adalah sebuah paradigma pemrograman yang membagi program menjadi kumpulan objek yang saling berinteraksi satu dengan lainnya. Objek memiliki field (atribut/nilai yang melekat pada objek) dan method (aksi yang dapat dilakukan objek). Pemrograman berorientasi objek adalah salah satu pendekatan perancangan perangkat lunak secara modular. Paradigma ini merupakan pengembangan dari paradigma sebelumnya (pemrograman terstruktur, pemrograman prosedural, dan tipe data abstrak). Pada paradigma sebelumnya data dan prosedur/fungsi dibuat terpisah, sedangkan pada pemrograman berorientasi objek kedua bagian ini digabungkan menjadi satu bagian.
Kelas dan Objek Pada paradigma pemrograman berorientasi objek, kelas adalah pola yang dapat digunakan untuk membuat objek. Kelas berisi definisi dari atribut (dan inisialisasi nilai awal) dan aksi (tingkah laku yang dapat dilakukan oleh objek). Bahasa pemrograman C# memodelkan atribut dalam bentuk field dan property, sedangkan aksi dimodelkan dalam bentuk method (nama lain dari fungsi atau prosedur dalam paradigma pemrograman prosedural).
Buatlah sebuah proyek konsol baru, beri nama proyek tersebut ContohKelasObjek01. Buat sebuah kelas baru (Project | Add Class…) beri mana kelas tersebut Lingkaran. Tulis kode program berikut pada kelas Lingkaran. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ContohKelasObjek01 {
class Lingkaran { public int jariJari = 0;
}
public double HitungLuas() { return (3.1415 * jariJari * jariJari); }
}
Buka kelas Program (Program.cs), tulis kode program berikut untuk menguji kelas Lingkaran yang sudah dibuat. Coba masukan nilai positif dan negatif untuk jari-jari, perhatikan keluaran dari program. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ContohKelasObjek01 { class Program { static void Main(string[] args) { Console.Write("Jari-jari = "); string jariStr = Console.ReadLine(); int jariJari; int.TryParse(jariStr, out jariJari); Lingkaran lingkaran1 = new Lingkaran(); lingkaran1.JariJari = jariJari;
} }
}
Console.Write("Lingkaran dengan jari-jari = " + lingkaran1.JariJari); Console.WriteLine(" memiliki Luas = " + lingkaran1.HitungLuas()); Console.ReadKey();
Kali ini program yang dibuat terdiri dari dua buah kelas. Kelas utama Program digunakan untuk menguji hasil keluaran dari kelas kedua Lingkaran. Berikut adalah penjelasan barisdemi-bari dari kelas Lingkaran. class Lingkaran
Membuat definisi dari kelas Lingkaran. Penamaan kelas, field, property, dan method yang dapat diakses bebas sebaiknya menggunakan Pascal casing sisanya gunakan camel casing. Pascal casing adalah standar penamaan dimana tiap suku kata diawali dengan huruf kapital tanpa spasi, contoh lemari es dituliskan LemariEs. Camel casing adalah standar penamaan dimana suku kata pertama diawali dengan huruf kecil sedangkan suku kata berikutnya diawali dengan huruf kapital, contoh mobil sedan merah dituliskan mobilSedanMerah. public int JariJari = 0;
Membuat sebuah field bernama JariJari dengan tipe data integer, inisialisasi field tersebut dengan nilai 0 (nol). Field adalah sebuah variabel yang dibuat pada ruang lingkup kelas (mirip dengan global variabel hanya saja lingkup kerjanya lebih sempit). Field (dan entitas lainnya dalam kelas) biasanya diawali dengan kata kunci yang menunjukan aksesibilitas dari entitas tersebut. Kata kunci tersebut dikenal dengan istilah peubah akses. Kata kunci public adalah salah satu peubah akses. Peubah akses public digunakan untuk entitas yang dapat diakses umum. Kebalikan dari peubah akses public adalah peubah akses private, peubah akses private digunakan untuk entitas yang hanya ingin diakses oleh kelas yang membuat entitas tersebut. Sedangkan peubah akses protected digunakan bilamana entitas hanya ingin diakses oleh kelas yang membuat entitas atau turunan dari kelas tersebut. public double HitungLuas() { return (3.1415 * JariJari * JariJari); }
Membuat sebuah method HitungLuas(), hasil keluaran dari method ini adalah sebuah nilai bertipe data double. Hasil keluaran bertipe data double karena rumus luas lingkaran yang mengharuskan perkalian dengan konstanta PI (3.1415). Bilamana ingin menggunakan konstanta PI yang lebih tepat, dapat menggunakan konstanta PI dari kelas Math. Sehingga kode program tersebut menjadi sebagai berikut. return (Math.PI * JariJari * JariJari);
Kode program pada kelas Program serupa dengan contoh pada bab sebelumnya. Hanya saja pada kode program kali ini proses perhitungan dilakukan oleh kelas Lingkaran yang telah dibahas sebelumnya. Lingkaran lingkaran1 = new Lingkaran(); lingkaran1.JariJari = jariJari;
Kode program di atas digunakan untuk membuat instans dari kelas Lingkaran (dengan kata lain membuat objek dari kelas Lingkaran). Setelah kelas Lingkaran dibuat instansnya, selanjutnya menginisialisasi field JariJari dengan nilai yang dimasukan oleh pengguna. Console.Write("Lingkaran dengan jari-jari = " + lingkaran1.JariJari); Console.WriteLine(" memiliki Luas = " + lingkaran1.HitungLuas());
Kedua baris berikutnya hanya menampilkan isi dari field, meminta objek lingkaran1 untuk menghitung luas (dengan memanggil method), lalu menampilkan hasilnya ke layar. Bilamana diperhatikan maka kelas menerima masukan nilai sama dengan yang dimasukan oleh pengguna, tidak ada proses validasi data. Dalam kasus ini jari-jari adalah besaran yang nilainya selalu positif, hal ini dapat saja diperbaiki di program utama (Program.cs). Tetapi alangkah lebih baik bilamana kelas Lingkaran yang melakukan validasi nilai, karena nilai jari-jari merupakan tanggung jawab dari kelas Lingkaran. Pada sub-bab berikutnya (Property) dibahas bagaimana cara memperbaiki hal ini.
Property Property merupakan sebuah mekanisme pada bahasa pemrograman C# untuk membaca, menulis, dan melakukan kalkulasi pada field. Keuntungan dari penggunaan property adalah pengembang dapat menggunakannya sama seperti sebuah field, tetapi akses pada nilai dapat dibatasi sama seperti ketika menggunakan method (fungsi/prosedur). Pada bahasa pemrograman lain property ekivalen dengan aksesor (getter) dan mutator (setter). Pada program ContohKelasObjek01 nilai dari jari-jari pada kelas Lingkaran dimungkinkan untuk diberi nilai negatif. Sebaiknya nilai yang masuk ke dalam kelas diatur agar selalu bernilai benar, karena masukan yang tidak diperiksa dapat menyebabkan hasil keluaran yang salah (dalam dunia teknologi informasi hal ini dikenal dengan istilah garbage in garbage out). Berikut adalah salah satu solusi untuk menyelesaikan masalah yang ada pada program ContohKelasObjek01. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace ContohKelasObjek02 { class Lingkaran { private int jariJari = 0; public int JariJari { get { return jariJari; } set { if (value < 0) jariJari = value * -1; else jariJari = value; } }
}
public double HitungLuas() { return (3.1415 * JariJari * JariJari); }
}
Dapat dilihat dari hasil output program ContohKelasObjek02, ketika jari-jari diberi nilai positif maupun negatif tetap memberikan hasil keluaran yang sama. Pada program ContohKelasObjek01 yang bermasalah adalah kelas Lingkaran, maka pada program ContohKelasObjek02 hanya kelas Lingkaran yang diperbaiki. Kelas lainnya (kelas Program) tidak ada perubahan apapun.
private int jariJari = 0;
Pertama kali yang pelu diubah adalah peubah akses field dari public menjadi private, hal ini perlu dilakukan agar kelas lain tidak dapat mengakses field ini. Perlu diperhatikan juga nama field berubah yang awalnya menggunakan Pascal casing menjadi camel casing. public int JariJari { get { return jariJari; } set { if (value < 0) jariJari = value * -1; else jariJari = value; } }
Buatlah property dengan tipe data sama dengan field dan biasanya memiliki nama yang mirip dengan field yang ingin “dilindungi”. Kata kunci get digunakan untuk mengawali blok aksesor. Pada blok aksesor selalu diakiri dengan mengembalikan nilai (kata kunci return). Kata kunci get digunakan untuk mengawali blok mutator. Pada blok mutator nilai dari luar kelas selalu disimpan dalam variabel khusus bernama value. Nilai value ini yang akan diproses sebelum disimpan dalam field yang ada dalam kelas. Dalam kasus kelas Lingkaran, bilamana nilai value negatif, maka nilai tersebut dibuat positif sebelum disimpan ke dalam field.
Method Method atau biasa dikenal dengan fungsi/prosedur dalam paradigma pemrograman prosedural, digunakan untuk memodelkan tingkah laku yang dapat dilakukan oleh kelas/objek tersebut. Dalam kasus kelas Lingkaran yang dibahas sebelumnya maka HitungLuas adalah sebuah method. Method pada sebuah kelas biasanya menggunakan data yang tersedia di dalam kelas (field) dan data tambahan (parameter) yang diberikan oleh pihak pengembang. Dalam beberapa kasus penggunaan method dan property tidak memiliki perbedaan yang berarti (keduanya sama-sama benar dengan sudut pandang tertentu). Walaupun demikian biasanya property memiliki tingkat komputasi yang sederhana, sedangkan pada method memiliki tingkat komputasi yang cukup rumit (membutuhkan parameter lainnya). Perlu diingat bahwa sebuah method biasanya menggunakan kata kerja sebagai nama, sedangkan property dan field menggunakan kata benda. Jadi bilamana proses menghitung luas lingkaran dibuat sebagai property akan memiliki nama Luas. Agar lebih jelas ada baiknya bilamana diberikan sebuah contoh kasus berupa sebuah aplikasi sederhana. Buatlah sebuah aplikasi konsol dengan nama ContohKelasObjek03. Tuliskan kode program berikut pada kelas Lingkaran. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace ContohKelasObjek03 { class Lingkaran { private double jariJari = 0; public double JariJari { get { return jariJari; } set { jariJari = Math.Abs(value); } }
}
public double Luas { get { return (Math.PI * JariJari * JariJari); } set { double jariSqr = Math.Abs(value) / Math.PI; JariJari = Math.Sqrt(jariSqr); } } public double HitungLuas(double jariJari) { JariJari = jariJari; return Luas; }
}
Perbaiki juga kelas Program untuk mengakomodir perubahan dari kelas Lingkaran. Kelas Program kali ini menerima input dua kali, pertama untuk menguji ketika input berupa jari-jari dan kedua ketika input berupa luas. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ContohKelasObjek03 { class Program { static void Main(string[] args) { Console.Write("Jari-jari = "); string jariStr = Console.ReadLine(); double jariJari; double.TryParse(jariStr, out jariJari); Lingkaran lingkaran1 = new Lingkaran(); double luas = lingkaran1.HitungLuas(jariJari); Console.Write("Lingkaran dengan jari-jari = " + lingkaran1.JariJari); Console.WriteLine(" memiliki Luas = " + luas); Console.WriteLine(); Console.Write("Luas = "); string luasStr = Console.ReadLine();
double.TryParse(luasStr, out luas); Lingkaran lingkaran2 = new Lingkaran(); lingkaran2.Luas = luas;
} }
Console.Write("Lingkaran dengan luas = " + lingkaran2.Luas); Console.WriteLine(" memiliki jari-jari = " + lingkaran2.JariJari); Console.ReadKey();
}
Bilamana pengguna memasukan nilai 12 untuk jari-jari dan nilai 43 untuk luas maka keluaran program kurang lebih serupa dengan hasil pada ilustrasi berikut.
Berikut adalah penjelas dari kode program yang telah dituliskan sebelumnya. Pembahasan hanya meliputi kode program yang dianggap perlu dijelaskan lebih lanjut. public double JariJari { get { return jariJari; } set { jariJari = Math.Abs(value); } }
Pada kode program property JariJari kali ini setter menggunakan fungsi matematis yang sudah ada untuk menghitung nilai absolut dari sebuah nilai. Penggunaan fungsi seperti ini dapat meningkatkan penggunaan kode ulang yang pada akhirnya dapat meningkatkan produktifitas dari pengembang (karena hanya perlu membuat kode program yang diperlukan saja). public double Luas { get { return (Math.PI * JariJari * JariJari); } set { double jariSqr = Math.Abs(value) / Math.PI; JariJari = Math.Sqrt(jariSqr); } }
Berbeda pada contoh program pada kasus sub-bab Property, pada kasus kali ini proses menghitung Luas dibuat dalam bentuk property. Dapat dilihat pada bagian getter, kode program serupa dengan method HitungLuas() pada sub-bab Property. Perbedaan hanya pada penggunaan konstanta PI dari class Math.
Setter pada property Luas melakukan proses penghitungan jari-jari bilamana pengguna melakukan assignment pada property luas. Proses nya merupakan invers dari proses menghitung luas, dimana rumus untuk menghitung jari-jari adalah:
h
=
2
ൗ .
public double HitungLuas(double jariJari) { JariJari = jariJari; return Luas; }
Pada kelas Lingkaran kali ini, method HitungLuas() dirancang untuk menerima sebuah parameter jari-jari. Berbeda dengan property, hal ini tidak dimungkinkan, sedangkan pada method pengembang dapat menambahkan satu atau lebih parameter untuk melakukan pemrosesan data. Penyimpanan data (jari-jari) dan penghitungan nilai (luas) menggunakan property JariJari dan Luas yang sudah dirancang sebelumnya. Hal ini untuk meningkatkan penggunaan kode berulang dan memudahkan proses pemeliharaan kode program (karena kode program memiliki satu sumber).
Constructor Method khusus yang dipanggil ketika sebuah objek dibuat. Constructor memiliki nama yang sama dengan kelas dan tidak memiliki tipe kembalian. Constructor digunakan untuk menginisialisasi atribut (field) yang ada di dalam kelas sehingga objek yang dibuat memiliki keadaan nilai benar (valid). Selain menggunakan constructor, inisialisasi field dapat dilakukan dengan memberikan nilai langsung ketika field tersebut didefinisikan. Tetapi bilamana nilai field ingin diinisialisasi dengan nilai dari luar dalam kelas maka hanya dapat dilakukan melalui constructor. Contoh program berikut menunjukan penggunaan constructor pada kelas. Contoh kali ini memodelkan kelas orang (Person) serupa dengan data orang yang ada pada ponsel. Buatlah sebuah kelas Person dengan mengacu kode program berikut. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Text.RegularExpressions; namespace ContohKelasObjek04 { class Person { private string name = string.Empty; private DateTime birthday = DateTime.Today; private bool isMale = true; private string email = string.Empty;
public Person() { } public Person(string name, DateTime birthday, bool isMale, string email) { Name = name; Birthday = birthday; IsMale = isMale; Email = email; } public string Name { get { return name; } set { if (string.IsNullOrEmpty(value)) name = string.Empty; else name = value; } } public DateTime Birthday { get { return birthday; } set { if (value.Date > DateTime.Today) birthday = DateTime.Today; else birthday = value.Date; } } public int Age { get { DateTime today = DateTime.Today; int age = today.Year - Birthday.Year; if (today.AddYears(-age) < birthday) age--; return age; }
}
public bool IsMale { get { return isMale; } set { isMale = value; } } public string Email { get { return email; } set { Regex emailRegex = new Regex(@"([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\." + @"[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))" + @"([a-zA-Z]{2,4}|[0-9]{1,3})"); if (emailRegex.IsMatch(value))
email = value; else email = string.Empty; } }
}
}
Kelas Program berisi kode program untuk menguji kelas Person. Kelas Program dibuat sederhana untuk memperjelas cara kerja dari kelas Person itu sendiri. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ContohKelasObjek04 { class Program { static void Main(string[] args) { // Name = Budi // Birthday = 7 Juni 1980 // Gender = Male (IsMale == True) // Email =
[email protected] Person budi = new Person(); budi.Name = "Budi"; budi.Birthday = new DateTime(1980, 6, 7); budi.IsMale = true; budi.Email = "
[email protected]"; Console.WriteLine("{0}\n{1}\n{2}\n{3}\n{4}\n", budi.Name, budi.Birthday, budi.Age, budi.IsMale, budi.Email); // // // //
Name = Wati Birthday = 23 Des 1982 Gender = Female (IsMale == False) Email =
[email protected]
Person wati = new Person("Wati", new DateTime(1982, 12, 23), false, "
[email protected]"); Console.WriteLine("{0}\n{1}\n{2}\n{3}\n{4}", wati.Name, wati.Birthday, wati.Age, wati.IsMale, wati.Email); } }
Console.ReadKey();
}
Hasil output dari aplikasi ContohKelasObjek04 dapat dilihat pada Gambar 11. Dari hasil output dapat diambil kesimpulan bahwa ketika objek dibuat maka melakukan inisialisasi field diikuti dengan menjalankan constructor (ini dibuktikan pada objek wati). Sedangkan constructor pada objek budi hanya menyebabkan inisialisasi field dijalankan tanpa
melakukan assignment nilai pada constructor (ini dapat dibuktikan dengan menghilangkan bagian assignment property setelah membuat objek).
private string name = string.Empty; private DateTime birthday = DateTime.Today; private bool isMale = true; private string email = string.Empty;
Kode program di atas menginisialisasi dengan nilai tertentu, bilamana field tidak diinisialisasi maka tipe data numerik bernilai 0, tipe data DateTime bernilai 1/1/0001 12:00:00 AM, tipe data boolean bernilai false, sedangkan tipe data string bernilai null. Inisialisasi field tidak diperkenankan menggunakan nilai dari field lainnya (pernyataan private string email = name tidak diperkenankan). Bilamana diinginkan menginisialiasi field menggunakan nilai dari field lainnya gunakanlah constructor. public Person() { } public Person(string name, DateTime birthday, bool isMale, string email) { Name = name; Birthday = birthday; IsMale = isMale; Email = email; }
Kelas Person membuat dua buah constructor, constructor pertama tanpa parameter biasa dikenal dengan default constructor. Sedangkan constructor kedua dengan parameter. Constructor dijalankan setelah inisialisasi field. Jadi ketika membuat objek, maka kelas pertama-tama menginisialisasi field lalu dilanjukan dengan menjalankan kode program pada constructor.
Overloading Overloading atau biasa dikenal dengan istilah method overloading adalah salah satu fitur yang ada pada bahasa pemrograman berorientasi objek (termasuk C#). Method overloading adalah ketika ada method dengan nama sama tetapi memiliki signature yang berbeda (memiliki tipe data parameter atau jumlah parameter berbeda).
Contoh overloading adalah method WriteLine() dan Write() pada kelas Console yang dapat digunakan untuk menampilkan berbagai macam tipe dengan berbagai macam format ke layar. Constructor kelas Person pada sub-bab Constructor yang lalu adalah contoh lainnya. Cara paling mudah untuk mengetahui signature dari sebuah method adalah dengan menghapus return value dan nama parameter dari method. Bilamana belum ditemukan sebelumnya maka pengembang dapat membuat method tersebut sebagai salah satu alternatif overloading. Lebih jelasnya dapat dilihat pada potongan kode program berikut. using System; public interface ITest { // ## Signature Allowed? void Foo(); // 01 Foo() Yes int Foo(int a); // 02 Foo(int) Yes void Foo(int a, int b); // 03 Foo(int, int) Yes int Foo(int a, string b); // 04 Foo(int, string) Yes void Foo(int a); // 05 Foo(int) No (02) int Foo(string a); // 06 Foo(string) Yes int Foo(string a, int b); // 07 Foo(string, int) Yes void Foo(double a); // 08 Foo(double) Yes }
Inheritance Inheritance atau pewarisan adalah salah satu mekanisme dalam pemrograman berorientasi objek untuk menggunakan kode berulang. Pewarisan adalah ketika sebuah kelas dibuat berdasarkan kelas lainnya. Pewarisan (bilamana digambarkan) berbentuk hirarki (contoh: klasifikasi makhluk hidup dan silsilah keluarga). Selain pewarisan, penggunaan kode berulang dapat dilakukan dengan menggunakan metode lain yaitu komposisi. Berbeda dengan pewarisan, komposisi menggunakan kolaborasi antar kelas sebagai mekanisme penggunaan kode berulang. Tergantung bahasa pemrograman yang digunakan pewarisan dapat dibagi menjadi dua pewarisan tunggal (single inheritance) dan pewarisan majemuk (multiple inheritance). Pada pewarisan tunggal, kelas hanya diwarisi oleh satu kelas lainnya. Sedangkan pada pewarisan majemuk, kelas dapat diwarisi oleh lebih dari satu kelas. Bahasa pemrograman C# mengadopsi pewarisan tunggal. Contoh kasus, seorang pengembang diminta untuk membuat sebuah kelas untuk membantu menghitung luas bujursangkar. Kelas tersebut digunakan untuk membuat sebuah aplikasi. Berikut adalah jawaban dari pengembang tersebut. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ContohKelasObjek05 { class Bujursangkar { private double sisi; public Bujursangkar() { } public Bujursangkar(double sisi)
{ }
Sisi = sisi;
public double Sisi { get { return sisi; } set { sisi = Math.Abs(value); } } public double HitungLuas() { double luas = Sisi * Sisi; return luas; } public double HitungLuas(double sisi) { Sisi = sisi; return HitungLuas(); } }
}
Kelas Bujursangkar diuji dengan menggunakan aplikasi konsol. Isi dari kelas Program adalah sebagai berikut. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ContohKelasObjek05 { class Program { static void Main(string[] args) { Console.Write("Sisi = "); string sisiStr = Console.ReadLine(); double sisi; double.TryParse(sisiStr, out sisi);
} }
Bujursangkar bs = new Bujursangkar(sisi); Console.WriteLine("Luas = " + bs.HitungLuas());
}
Pihak klien senang dengan solusi yang diberikan, beberapa bulan kemudian klien meminta pengembangan dari kelas Bujursangkar. Klien meminta agar kelas Bujursangkar tidak diubah, tetapi ingin agar memiliki fitur tambahan baru yaitu menghitung keliling dan ingin agar Sisi diinisialisasi dengan nilai 1 (satu). Kelas Bujursangkar tidak boleh ditambah kode apapun karena sudah digunakan pada aplikasi bisnis yang berjalan. Sedangkan kelas Bujursangkar baru diharapkan dapat menjawab masalah pada aplikasi bisnis yang baru. Pengembang akhirnya membuat kelas BujursangkarV2 yang merupakan pengembangan
lebih lanjut dari kelas Bujursangkar. Kelas BujursangkarV2 menggunakan kode yang telah dibuat pada kelas Bujursangkar. Berikut adalah kode program yang diusulkan. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ContohKelasObjek05 { class BujursangkarV2 : Bujursangkar { public BujursangkarV2() : base(1) { } public BujursangkarV2(double sisi) : base(sisi) { } public double HitungKeliling() { double keliling = 4 * Sisi; return keliling; } public double HitungKeliling(double sisi) { Sisi = sisi; return HitungKeliling(); } }
}
Perlu perhatian khusus hanya ketika membuat kelas dan constructor. Ketika membuat kelas yang sifatnya lebih spesifik dari kelas awal maka yang perlu dilakukan adalah dengan pewarisan (tanda titik dua). class BujursangkarV2 : Bujursangkar
Pada constructor kelas BujursangkarV2 memanggil constructor kelas Bujursangkar dengan parameter, hal ini untuk mengakomodir kebutuhan Sisi diinisialisasi dengan 1 (satu). public BujursangkarV2() : base(1) { }
Kata kunci base digunakan untuk memanggil anggota public dan protected dari kelas induk. Dalam kasus di atas digunakan untuk memanggil constructor. Perlu diingat constructor kelas induk hanya dapat dipanggil dengan cara seperti di atas. Selain kata kunci base, ada juga kata kunci this. Kata kunci this digunakan untuk memanggil anggota dari kelas yang bersangkutan. Kata kunci this digunakan bilamana ada konflik nama antara anggota kelas dengan parameter atau variabel lokal.
LINQ LINQ kependekan dari Language Integrated Query merupakan fitur yang bertujuan untuk memberikan kemampuan query pada bahasa pemrograman C# (dan Visual Basic). LINQ diharapkan dapat menjembatani jurang pemisah antara dunia objek dan dunia data.
Keuntungan menggunakan LINQ adalah selain dapat melakukan query kepada kumpulan objek, LINQ dapat dilakukan juga untuk melakukan query ke basis data, XML, dan sumber data lainnya. Fitur LINQ dapat dioperasikan pada kumpulan data yang implement interface IEnumerable
dan IQueryable. Dalam hal ini hampir sebagian besar struktur data yang sifatnya kumpulan implement interface tersebut. Bentuk umum dari ekspresi LINQ adalah sebagai berikut. var query = from [Item] in [Collections] [where [BooleanExpression]] [orderby [Item] [ascending/descending]] select [Item]; KETERANGAN [Item] variabel yang digunakan untuk query. [Collections] variable yang menyimpan kumpulan data. [BooleanExpression] ekspresi boolean yang sama dengan pada pernyataan if-else. [where] untuk melakukan penyaringan data. [orderby] untuk melakukan pengurutan data [ascending] menaik, [descending] menurun.
Contoh kasus berikut mendemonstrasikan cara kerja dari LINQ. Buatlah sebuah aplikasi konsol baru, berilah nama aplikasi tersebut ContohKelasObjek06. Ketikan kode program berikut. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ContohKelasObjek06 { class Segitiga { public double Alas { get; set; } public double Tinggi { get; set; } public double Luas { get { return 0.5 * Alas * Tinggi; } } } class Program { static void Main(string[] args) { string[] names = { "Budi", "Susan", "Wati", "Tono", "Sudin" }; List<Segitiga> shapes = new List<Segitiga>(); shapes.Add(new Segitiga() { Alas = 2, Tinggi = 3 }); shapes.Add(new Segitiga() { Alas = 3, Tinggi = 3 }); shapes.Add(new Segitiga() { Alas = 4, Tinggi = 2 }); shapes.Add(new Segitiga() { Alas = 1, Tinggi = 3 }); shapes.Add(new Segitiga() { Alas = 3, Tinggi = 3 }); foreach(var item in names) Console.Write(item + " "); Console.WriteLine();
foreach(var item in shapes) Console.Write("[{0}, {1}, {2}] ", item.Alas, item.Tinggi, item.Luas); Console.WriteLine("\n"); Console.WriteLine("Names sorted ascending"); var sortedNames = from item in names orderby item ascending select item; foreach (var item in sortedNames) Console.Write(item + " "); Console.WriteLine("\n"); Console.WriteLine("Filter Shapes that have Luas > 4" + " and sort it by Luas descending"); var sortedShapes = from item in shapes where item.Luas > 4 orderby item.Luas descending select item;
} }
foreach (var item in sortedShapes) Console.Write("[{0}, {1}, {2}] ", item.Alas, item.Tinggi, item.Luas); Console.WriteLine(); Console.ReadKey();
}
Dari ContohKelasObject06 dapat dilihat bahwa LINQ selain mampu melakukan pengurutan data, juga dapat melakukan penyaringan data. Dalam hal ini data dapat berupa tipe data sederhana maupun kompleks (tipe data bentukan).
Visual Studio Lightswitch Visual Studio Lightswitch atau biasa disingkat dengan Lightswitch adalah sebuah framework dan IDE yang dapat digunakan untuk membuat aplikasi bisnis dengan jauh lebih mudah. Lightswitch mengadopsi arsitektur 3-tier dimana sebuah aplikasi dibagi menjadi tiga bagian, presentation tier, logic tier, dan data tier. Presentation tier adalah berupa antarmuka yang dapat dilihat dan diakses oleh pengguna. Logic tier adalah berupa logika yang mengatur jalannya aplikasi, tier ini juga yang mengirimkan data antara presentation tier dan data tier. Logika dapat berupa logika bisnis, kalkulasi, atau evaluasi. Data tier adalah berupa penyimpanan data (basis data atau sistem berkas).
T H G R E V IL S
M T H N IE C L
IO A T N S E R P
T N IE L C
M OBILE DEVICE
DESKTOP
C G O L E IN S U B ODATA
T A D ODATA
SHAREPOINT
EXISTING DATABASE
LOCAL DATABASE
Presentation tier pada Lightswith menggunakan Silverlight dan HTML 5. Sedangkan logic tier menggunakan WCF yang dibungkus menggunakan layanan OData. Data tier dapat menggunakan SQL Server Express dan SQL Server, SharePoint, layanan WCF RIA, atau layanan OData.
Aplikasi Lightswitch Pertamaku Membuat aplikasi Lightswitch sangat mudah, yang perlu dilakukan hanya beberapa langkah sederhana, 1 – definisikan data, 2 – buat antarmuka, dan 3 – atur perijinan aplikasi. Untuk melihat langkah pembuatan aplikasi menggunakan Lightswitch ada baiknya diberikan contoh sebuah kasus sederhana. Pengembang diminta untuk membuat sebuah aplikasi stok barang yang betujuan untuk menyimpan semua data produk. Semua fasilitas CRUD dan pencarian data produk harus tersedia dalam stok barang ini. Pertama buatlah sebuah aplikasi Lightswitch dengan menggunakan menu File | New | Project. Semua kode program dibuat dalam bahasa pemrograman C#, pastikan memilih opsi yang benar. Beri nama project StokBarang.
Tunggu sesaat, biarkan Visual Studio menyiapkan proyek. Bilamana berjalan dengan baik maka Visual Studio menampilkan window tambah dan konfigurasi data.
Aplikasi Bisnis dan Manajemen Data Proyek Lightswitch selalu dimulai dengan data, hal ini dikarenakan pada aplikasi bisnis hal yang paling penting adalah data. Bilamana diperhatikan aplikasi bisnis pasti berkaitan erat dengan manajemen data, dari menampilkan data, menambah data, mengubah data, menghapus data, dan pencarian data. Untuk memulai klik tautan Create new table atau klik kanan pada folder Data Source kemudian klik menu Add Table untuk membuat sebuah tabel baru.
Ubah tabel yang dibuat menjadi Product, perhatikan bahwa secara otomatis Visual Studio mengubah nama berkas menjadi Products. Sebagai panduan pastikan ketika membuat nama tabel gunakan kata benda tunggal untuk memudahkan pembuatan kode. Tambahkan beberapa kolom pada tabel tersebut (Name, Price, dan Quantity), gunakan sebagai referensi. Perhatikan bahwa kolom Name, Price, dan Quantity ketiganya merupakan kolom yang wajib diisi (Required). Bilamana diperhatikan dengan seksama tipe data yang dipilih sangat beragam dan ada beberapa yang tidak biasanya ditemui (contoh email address, web address, dan phone number). Tipe data tadi dikenal dengan istilah tipe data bisnis. Tipe data bisnis digunakan untuk memudahkan pengembang dalam melakukan validasi data. Bilamana tidak ada tipe data yang sesuai maka pengembang dapat membuat tipe data bisnis sendiri atau dapat juga melakukan validasi manual (biasanya menggunakan regular expression yang biasa dikenal regex).
Antarmuka Setelah mendefinisikan data, langkah berikutnya adalah menambahkan sebuah antarmuka untuk mengolah data yang dimaksud. Berbeda dengan membuat aplikasi bisnis menggunakan framework lainnya, ketika membuat aplikasi bisnis menggunakan Lightswitch antarmuka dibuat otomatis (menyesuaikan dengan data yang ada). Sama seperti membuat tabel, membuat antarmuka (atau screen di Lightswitch) dapat dilakukan dengan klik kanan folder screen lalu pilih menu Add Screen. Window berikutnya menampilkan opsi untuk memilih jenis screen yang sesuai dengan data yang ingin dikelola. Kali ini pilihlah List and Details Screen untuk jenis screen, pilih Product sebagai screen data, dan gunakan nama default yang diberikan oleh Lightswitch (ProductsListDetail).
Setelah memilih jenis screen, Visual Studio membuat layout dari menggunakan data yang dipilih (Student). Pengembang dapat melakukan kustomisasi bilamana dikehendaki.
Tanpa mengetikan satu baris kode program, aplikasi sudah dapat digunakan. Pengguna tidak saja dapat melakukan proses CRUD (Create, Retrieve, Update, and Delete), tetapi juga dapat melakukan pencarian data dan export data ke file Microsoft Excel. Tekan (F5) untuk menjalankan aplikasi.
Data dan Query Enterprise software adalah software yang dirancang untuk kebutuhan organisasi. Organisasi yang dimaksud beragam, mulai dari sekolah, perusahaan, dan pemerintah. Menurut Martin Fowler dalam bukunya yang berjudul "Patterns of Enterprise Application Architecture", Enterprise application adalah aplikasi yang bertujuan untuk menampilkan data, memanipulasi data, menyimpan data, dan otomatisasi proses bisnis dengan data tersebut. Dari definisi tersebut maka dapat disingkat bahwa enterprise application adalah aplikasi yang berhubungan erat dengan data. Pada bab ini membahas segala sesuatu yang behubungan dengan data, mulai dari tipe data, tipe data bisnis, validasi, sampai dengan tabel dan query. Untuk memudahkan pembahasan ada baiknya dibuat satu buah contoh kasus, kasus kali ini adalah sistem akademik. Buatlah sebuah aplikasi Lightswitch baru, beri nama aplikasi tersebut SistemAkademik.
Tabel Data adalah bagian paling penting dari aplikasi bisnis. Seperti yang pernah dibahas sebelumnya sumber data dari Lightswitch beragam. Data yang didapat dari berbagai macam sumber dimodelkan dalam bentuk kumpulan tabel. Pada sub-bab ini dibahas mengenai pembuatan tabel dari Lightswitch itu sendiri. Sebelum membahas dan membuat tabel, ada baiknya untuk mengenal beberapa property umum yang ada pada tipe data. Include in Unique Index bilamana ingin kolom ini digunakan sebagai identitas dari satu baris. Is Computed bilamana kolom ini berupa Computed Property (property yang nilainya tidak disimpan). Is Searchable bilamana kolom ini dimasukan dalam proses pencarian data. Name adalah nama dari kolom ini. Description digunakan untuk menyimpan deskripsi dari kolom ini. Display Name adalah nama yang akan ditampilkan pada antarmuka. Is Required digunakan bilamana ingin agar kolom ini wajib diisi. Maximum Length adalah panjang maksimum dari kolom (String). Minimum/Maximum Value adalah nilai minimum dan maksimum dari kolom (Numeric/Date/DateTime).
Pada contoh SistemAkademik ada empat buah tabel. Tabel Students digunakan untuk memodelkan siswa, tabel Subjects digunakan untuk memodelkan mata kuliah, tabel SubjectRooms digunakan untuk memodelkan ruang kelas, sedangkan tabel RoomParticipants digunakan untuk memodelkan peserta dalam kelas itu sendiri. Tabel Student digunakan untuk mencatat data siswa terdiri dari Id, Name, Birthday, Email, Twitter, dan Facebook. Name (String) digunakan untuk menyimpan nama dari siswa memiliki panjang maksimum 255 karakter. Birthday (Date) digunakan untuk menyimpan tanggal lahir dari siswa, tanggal lahir diinisialisasi dengan tanggal yang sama dua puluh tahun yang lalu. Email (Email Address) menggunakan tipe data bisnis yang khusus digunakan untuk menyimpan alamat email. Twitter dan Facebook (Web Address) menggunakan tipe data bisnis untuk menyimpan alamat URL, kedua property ini diinisialisasi dengan alamat URL dari Twitter (http://www.twitter.com) dan Facebook (http://www.facebook.com). Property Name, Birthday, dan Email merupakan property yang wajib diisi.
Tabel Subject digunakan untuk mencatat data mata kuliah terdiri dari Id, SubjectCode, Name, Credit, dan Description. SubjectCode (String) digunakan untuk menyimpan kode mata kuliah memiliki panjang lima karakter yang terdiri dari dua buah huruf dan tiga buah angka, property ini juga dimasukan dalam Unique Index (tidak boleh ada nilai yang berulang). Name (String) digunakan untuk menyimpan nama mata kuliah, panjang maksimum 255 karakter. Credit (Integer) jumlah kredit yang dibebankan pada mata kuliah ini, nilai bervariasi antara 0 sampai dengan 12. Description (String) digunakan untuk menyimpan penjelasan mengenai mata kuliah yang dimaksud, property ini sifatnya tidak wajib diisi dan memiliki panjang tak terbatas (property jumlah karakter maksimum dikosongkan).
Tabels SubjectRoom digunakan untuk mencatat data ruang kelas terdiri dari Id, RoomName, Semester, dan Year. RoomName (String) digunakan untuk menyimpan nama kelas ruangan. Semester (Integer) digunakan untuk menyimpan nilai 0 (First/Ganjil) atau 1 (Second/Genap) diinisialisasi dengan 0 bilamana bulan saat ini antara Agustus sampai dengan Februari. Year (Integer) digunakan untuk menyimpan tahun, diinisialisasi dengan tahun saat ini.
Tabel RoomParticipant digunakan untuk menyimpan peserta mata kuliah terdiri dari Id dan Score. Score (Double) digunakan untuk menyimpan nilai dari peserta, sifatnya opsional (bilamana belum ada nilai tidak perlu untuk dimasukan), dan memiliki rentang nilai antara 0 sampai dengan 100.
Relasi Setelah rampung membuat empat buat tabel, saatnya membuat relasi antar tabel. Salah satu alasan mengapa sebuah basis data terdiri dari banyak tabel adalah mengurangi pengulangan (redudansi) data. Hal ini dapat dilakukan dengan membagi menjadi kumpulan tabel dengan relasi. Relasi antar tabel dapat dibagi menjadi dua jenis, yaitu one-to-one dan one-to-many. Relasi one-to-one bilamana ingin agar tabel hanya memiliki satu referensi ke table lain, begitu juga sebaliknya. Contoh dalam dunia nyata adalah relasi antara suami dan istri. Dalam Lightswitch relasi ini dimodelkan dengan relasi zero/one-to-one (0..1 to 1). Relasi one-to-many bilamana ingin satu tabel memilik banyak referensi ke tabel lainnya. Contoh dalam dunia nyata adalah relasi antara orang tua dengan anak. Dalam Lightswitch relasi ini dapat dimodelkan dengan dua cara, relasi zero/one-to-many (0..1 to *) atau relasi one-to-many (1 to *). Relasi many-to-many bilamana ingin agar satu tabel memiliki banyak referensi ke table lain begitu juga sebaliknya. Contoh dalam dunia nyata adalah relasi antara satu keluarga dengan keluarga lainnya. Dalam Lightswitch hal ini tidak mungkin dilakukan, tetapi dapat diakali dengan menggunakan tabel pembantu dan menggunakan relasi one-to-many antara table pembantu ke kedua tabel lainnya. Kembali ke contoh kasus Sistem Akademik, siswa dapat hadir ke banyak ruangan, ruangan memiliki banyak peserta, dan mata kuliah dapat memiliki banyak ruangan. Berikut ini adalah entity relationship diagram dari Sistem Akademik.
Students PK
Id
Subjects PK
Id
Name
SubjectCode
Birthday
Name
Email
Credit
Twitter
Description
Facebook
SubjectRooms RoomPartisipants PK
PK
Id
Id
RoomName
Score
Semester Year
Membuat relasi antar tabel di Lightswitch IDE sangat sederhana, yang perlu dilakukan hanya menekan tombol Add Relationship… yang ada pada bagian atas window pembuatan tabel. Pada kasus pembuatan SistemAkademik ada tiga buah relasi yang perlu dibuat. Relasi antara tabel Student ke tabel RoomParticipant, relasi antara tabel SubjectRoom ke tabel RoomParticipant dan relasi antara tabel Subject ke tabel SubjectRoom.
Bukalah tabel RoomParticipant, lalu buatlah dua buah relasi (RoomParticipant – Student dan RoomParticipant – SubjectRoom). Buka tabel SubjectRoom, lalu buatlah relasi ke tabel Subject.
Setelah membuat relasi, perhatikan pada tabel yang berelasi dibuatkan sebuah property dengan tipe data khusus. Property ini yang dapat digunakan untuk melakukan navigasi data antar data yang terkait (master dan detail). Property ini juga yang dapat memudahkan pengembang dalam membuat sumarisasi data.
Inisialisasi Property Pada banyak kasus nilai sebuah property diharapkan memiliki nilai tertentu. Contoh pada sistem kasir diharapkan program memberikan nilai 1 pada property kuantitas untuk setiap barang yang dibeli. Hal ini tentu saja bertujuan untuk memudahkan pengguna ketika berinteraksi dengan sistem. Pada pemrograman berorientasi objek, proses inisialisasi property biasanya dilakukan oleh constructor. Method khusus yang dipanggil ketika membuat sebuah instans dari class. Pada Lighswitch, inisialisasi property menggunakan pendekatan berbeda. Inisialisasi nilai dilakukan pada method Created(). Method Created() pada tiap entitas memiliki nama yang unik, semuanya mengikuti format NamaEntitas_Created() (Contoh: Pada tabel Siswa maka akan memiliki nama Siswa_Created()).
Mengacu dari tabel sebelumnya, maka perlu untuk menambahkan kode program pada tabel Student, Subject, dan SubjectRoom. Untuk menambah method Created pada tabel Student, bukalah window tabel Student, lalu tekan tombol u yang ada disebelah tombol Write Code untuk membuka menu, lalu pilih menu Student_Created. Window untuk edit kode program dibuka, ketikan kode program berikut.
partial void Student_Created() { Birthday = DateTime.Today.AddYears(-20); }
Setelah menambahkan kode program pada method Created di tabel Student, tambahkan juga kode program berikut pada tabel Subject dan tabel SubjectRoom. Langkah untuk menambah kode program sama dengan sebelumnya (buka window tabel yang bersangkutan, buka menu Write Code, pilih menu [NamaTabel]_Created pada menu tersebut). partial void Subject_Created() {
Credit = 3; } partial void SubjectRoom_Created() { DateTime today = DateTime.Today; if (today.Month >= 2 && today.Month < 8) Semester = 1; else Semester = 0; Year = today.Year; }
Validasi Visual Studio Lightswitch menyediakan fitur validasi data yang mapan. Validasi sederhana seperti required property, panjang maksimum, nilai minimum, nilai maksimum, dan beberapa tipe data bisnis (contoh: Email Address dan Web Address) memudahkan pengembang dalam melakukan pengujian input dari pengguna. Bilamana ada validasi yang diluar dari skenario normal, maka pengembang dapat menambahkan kode program untuk melakukan validasi lebih lanjut. Kasus SistemAkademik ada beberapa property yang membutuhkan validasi lebih lanjut. Pada tabel Student, property Facebook/Twitter harus diawali dengan laman web dari Facebook/Twitter itu sendiri. Pada tabel Subject, property SubjectCode memiliki format 2 huruf diikuti dengan 3 angka. Validasi seperti ini jauh lebih mudah bilamana menggunakan regular expression. Regular expression adalah sekumpulan karakter yang dapat digunakan sebagai pola pencarian. Pada .NET Framework regular expression dapat diakses menggunakan kelas Regex. Buka tabel Student, pilih kolom Twitter, pada property Twitter tersebut klik tautan Custom Validation. Lakukan juga untuk property Facebook, lalu ketikan kode program berikut. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using Microsoft.LightSwitch; namespace LightSwitchApplication { public partial class Student { private static readonly Regex TwitterRegex = new Regex(@"(?i-msnx:http://www\.twitter\.com/)(?\w+)"); private static readonly Regex FacebookRegex = new Regex(@"(?i-msnx:http://www\.facebook\.com/)(?\w+)"); partial void Twitter_Validate(EntityValidationResultsBuilder results) { if (string.IsNullOrEmpty(Twitter)) return; if (!TwitterRegex.IsMatch(Twitter)) { results.AddPropertyError("Not a valid Twitter address."); }
} partial void Facebook_Validate(EntityValidationResultsBuilder results) { if (string.IsNullOrEmpty(Facebook)) return; if (!FacebookRegex.IsMatch(Facebook)) { results.AddPropertyError("Not a valid Facebook address."); } }
}
}
Buka tabel Subject, tambahkan method Validate pada property SubjectCode. Pilih property SubjectCode, klik tautan Custom Validation pada property dari kolom tersebut. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using Microsoft.LightSwitch; namespace LightSwitchApplication { public partial class Subject { private static readonly Regex SubjectCodeRegex = new Regex(@"[a-zA-Z]{2}[0-9]{3}");
}
partial void SubjectCode_Validate(EntityValidationResultsBuilder results) { if (string.IsNullOrEmpty(SubjectCode) || !SubjectCodeRegex.IsMatch(SubjectCode)) { results.AddPropertyError("Subject code is not in correct format." + "Use two alphabets followed by three digits."); } } partial void Subject_Created() { Credit = 3; }
}
Mengutip kode program di atas, method Validate menggunakan method AddPropertyError untuk menampilkan pesan kesalahan. Method AddPropertyError() digunakan untuk menampilkan pesan kesalahan bilamana ada kesalahan pada property/kolom. Sedangkan bilamana AddEntityError() digunakan untuk menampilkan kesalahan bilamana ada kesalahan pada satu entitas. Property Birthday pada tabel Student juga sebaiknya ditambahkan validasi supaya pengguna tidak dapat memasukan tanggal hari ini atau tanggal di masa yang akan datang. Kode program untuk validasi property ini diserahkan pada pembaca (sedikit latihan membuat kode mandiri).
Regular expression dapat dipelajari lebih lanjut pada laman http://www.regularexpressions.info/. Sedangkan untuk memudahkan dalam membuat regular expression, penulis menggunakan tool Expresso yang dapat diunduh di http://www.ultrapico.com/expresso.htm.
Computed Property Computed property adalah property yang nilainya tidak disimpan ke media penyimpanan. Nilai dari computed property seperti namanya merupakan hasil kalkulasi dari satu atau lebih property lainnya. Biasanya computed property digunakan untuk menampilkan sumarisasi (contoh: rata-rata nilai dan total nilai). Pada kasus SistemAkademik, umur (Age) dari siswa (Student) dan jumlah peserta (TotalParticipant) yang mendaftar di satu ruangan (SubjectRoom) merupakan dua buah contoh computed property yang akan dibuat. Membuat computed property sama seperti membuat property biasa, perbedaannya adalah property Is Computed diaktifkan.
Tambahkan sebuah property Age pada tabel Student, pastikan tipe data Integer, aktifkan property Is Computed. Klik tautan Edit Method untuk menambahkan kode program untuk menghitung umur dari siswa. partial void Age_Compute(ref int result) { DateTime today = DateTime.Today; int age = today.Year - Birthday.Year; if (today.AddYears(-age) < Birthday) age--; }
result = age;
Lakukan hal yang serupa dengan property TotalParticipant pada tabel SubjectRoom. Buka tabel SubjectRoom. Tambahkan property TotalParticipant. Ubah property Total Participant menjadi computed property (aktifkan property Is Computed). Klik tautan Edit Method, tambahkan kode program berikut. partial void TotalParticipant_Compute(ref int result) { if (Participants != null)
result = Participants.Count(); else result = 0; }
Query Query pada Visual Studio Lightswitch digunakan untuk menyaring data, menampilkan sebagian data, dan membuat Screen pencarian yang lebih spesifik. Dengan menggunakan query data yang tidak dibutuhkan dapat disembunyikan, sehingga pengguna dapat berkonsentrasi pada data yang “penting”. Query, seperti tabel dibuat dalam bentuk visual dan bilamana dibutuhkan dapat ditambahkan kode program untuk melakukan query lebih lanjut.
Kembali ke kasus SistemAkademik, beberapa query ditambahkan ke aplikasi ini. Query pertama yang paling sederhana adalah mengurutkan Student secara menurun (descending). Bukalah tabel Student, pilih query untuk membuka editor untuk Query. Tambahkan kriteria untuk Sort untuk mengurutkan Student data secara menurun menurut Id.
Query berikutnya adalah untuk mengurutkan Subject secara menaik (ascending) menurut SubjectCode. Bukalah tabel Subject, pilih query untuk membuka editor Query, lalu tambahkan kriteria Sort.
Query berikutnya adalah untuk mengurutkan SubjectRoom menggunakan property Year (ascending) dan property Semester (descending), kemudian menyaring data tersebut sehingga hanya menampilkan data Tahun dan Semester yang aktif. Untuk query kali ini maka selain menambahkan kriteria sorting lewat editor, maka diperlukan juga menambahkan filter lewat kode program. Kode program dapat ditambahkan dengan klik tautan Edit Additional Query Code pada property.
Ketikan kode program berikut pada method PreprocessQuery(). partial void OngoingSubjectRooms_PreprocessQuery(ref IQueryable<SubjectRoom> query) { int currentYear = DateTime.Today.Year; int currentSemester = 0; if(DateTime.Today.Month >= 2 && DateTime.Today.Month < 8) currentSemester = 1; query = from item in query where item.Year == currentYear && item.Semester == currentSemester select item;
}
Screen Screen adalah antarmuka dari aplikasi Lightswitch. Screen dapat berupa Silverlight window atau sebuah HTML page, hal ini tergantung dari jenis client yang dibuat. Pada pembahasan bab ini screen yang dimaksud adalah Silverlight window. Bilamana pembaca pernah belajar bagaimana cara untuk membuat aplikasi menggunakan Silverlight/WPF pasti sudah dapat membayangkan bahwa untuk membuat sebuah window dapat kumpulan syntax XAML. Untuk memperlajari secara detail syntax XAML itu sendiri membutuhkan buku terpisah. Walaupun screen pada Lightswitch berupa Silverlight window, pembaca tidak perlu membuatnya dari nol. Pembaca hanya perlu memilih jenis screen yang paling sesuai untuk skenario yang dihadapi.
Screen Templates Berbeda ketika membuat aplikasi pada umumnya, Visual Studio Lightswitch telah menyediakan beberapa template yang dapat digunakan untuk membuat antarmuka. Pada tipe client Desktop ada lima jenis template yang dapat dipilih, yaitu Detail Screen, Editable Grid Screen, List and Details Screen, New Data Screen, dan Search Data Screen.
Detail screen digunakan untuk menampilkan detil dari entitas tertentu. Bilamana screen ini tidak dibuat, maka ketika aplikasi membutuhkan untuk menampilkan detil dari entitas akan menggunakan detail screen default. Editable grid screen digunakan bilamana pengguna ingin diberikan opsi untuk melakukan manajemen data dalam bentuk grid. Data ditampilkan dalam bentuk tabel seperti aplikasi
Microsoft Excel. Data hasil export ke Microsoft Excel pada screen ini benar-benar memilki format yang sama dengan yang ditampilkan di layar. List and details screen digunakan bilaman pengguna ingin diberikan opsi untuk melakukan manajemen data yang kompleks (memiliki relasi master-detail). Model screen ini sering dilihat pada aplikasi-aplikasi bisnis umum. New data screen digunakan khusus untuk menambah data baru pada entitas tertentu. Screen ini mirip dengan detail screen, hanya berbeda fungsionalitas saja. Search data screen digunakan khusus untuk pencarian data. Pada search data screen data yang ditampilkan sifatnya read-only, berbeda dengan pada editable grid screen yang memungkinkan pengguna untuk melakukan perubahan data. Selain itu pada screen ini fitur manajemen data tidak tersedia pada screen ini. Untuk mendemonstrasikan seberapa mudahnya membuat antarmuka di Visual Studio Lightswitch maka ada baiknya melanjutkan contoh kasus sebelumnya. Kali ini yang perlu dilakukan adalah klik kanan pada folder screen pilih Add Screen….
Pilih editable grid screen untuk jenis screen template, pilih Student untuk screen data, dan berikan nama (screen name) ManageStudents. Setelah menekan tombol OK, maka Visual Studio Lightswitch akan membuatkan layout sesuai dengan screen data yang dipilih.
Cobalah untuk menjalankan aplikasi yang telah dibuat. Pastikan untuk mencoba semua validasi yang ada pada tabel Student. Buatlah juga screen untuk tabel lainnya. Gunakan tabel sebelumnya sebagai panduan. Khusus untuk screen ManageSubjectRooms, dapat menggunakan bantuan gambar berikut. Pada screen ManageSubjectRooms data tidak hanya didapat dari tabel SubjectRooms saja, tetapi juga dari tabel Participants. Khusus kasus ini pengembang ingin agar pengguna dapat langsung memasukan peserta ke dalam ruangan kelas yang telah dibuat, sehingga tabel participant dimasukan ke dalam screen ini. Perhatikan juga, bilamana screen template yang dipilih adalah editable grid screen hal ini (mengikutsertakan tabel detail) tidak dapat dilakukan.
Screen Navigation Sebanyak apapun screen yang ditambahkan secara default menginduk pada satu menu saja (Tasks). Bilamana ingin membuat banyak menu, hal itu dapat dilakukan dengan mengubah screen navigation dari aplikasi Lightswitch. Untuk mengubah menu, klik kanan pada folder Screen, kemudian pilih Edit Screen Navigation. Mengubah nama dapat dengan memilih bagian yang ingin diubah, klik kanan, pilih Rename. Bilamana ingin menambah menu baru pengembang dapat klik Add Group. Menambah screen dalam satu menu (group) dapat dilakukan dengan klik Include Screen. Sedangkan untuk mengubah urutan menu (group) dapat dilakukan dengan memilih group yang ingin dipindahkan urutannya dan menekan tombol atas/bawah di bagian kanan window. Screen yang ditulis tebal adalah screen yang akan ditampilkan pertama kali ketika aplikasi dibuka. Untuk mengubah screen default dapat dilakukan dengan menekan tombol Set (menentukan screen default) dan Clear (menghapus screen default).
Dalam kasus SistemAkademik, screen ingin dibagi menjadi tiga group (Students, Subjects, dan Rooms). Ketiga group ini akan berisi screen yang bersesuaian (contoh: group Students akan berisi Search Students dan Manage Students).
Group Administration dan screen Roles/Users dibuat otomatis oleh Visual Studio Lightswitch. Group ini digunakan untuk manajemen pengguna dan menambahkan peran
pada pengguna aplikasi. Lebih lanjut mengenai pengguna dan peran akan dibahas pada bab Authentication dan Authorization.
Custom Layout Ada kalanya template yang sudah disediakan tidak sesuai dengan skenario yang ada. Ada beberapa pendekatan yang dapat dilakukan untuk menyelesaikan masalah ini. Paling sederhana adalah dengan mengubah layout yang ada untuk memenuhi skenario. Sedangkan solusi lainnya, bilamana ternyata membutuhkan control di luar dari yang telah disediakan adalah dengan Custom Control yang dibahas pada sub bab berikutnya.
Pada kasus SistemAkademik, pengembang ingin agar ketika menampilkan Subject, pengembang juga dapat melakukan export ke Excel dengan format (SubjectCode, Name, dan Credit). Selain itu juga ingin agar informasi yang ditampilkan dalam ListBox tidak hanya SubjectCode saja tetapi juga Name dan Credit. Solusi pertama adalah dengan membuat sebuah computed property yang menampilkan tiga property (SubjectCode, Name, dan Credit) dengan format tertentu. Buatlah sebuah computed property dengan nama Summary pada tabel Subjects. Buat kode program untuk membuat teks dengan format tertentu, ubahlah computed property Summary menjadi nilai summary dari tabel tersebut. Cara merubah summary dari tabel adalah dengan klik jenis client pada bagian perspective lalu ubah property summary dari tabel tersebut. partial void Summary_Compute(ref string result) { result = string.Format("{0} {1} ({2})", SubjectCode, Name, Credit); }
Dengan solusi pertama antarmuka (screen) tidak perlu diubah, secara otomatis aplikasi menampilkan data yang sesuai dengan format yang diberikan. Tetapi solusi ini ada kekurangan, yaitu data hasil export hanya menghasilkan satu kolom saja, yaitu kolom Summary (computed property). Hal ini dikarenakan control yang bersangkutan hanya terikat (bind) dengan satu property saja. Maka dari itu ada solusi lain untuk mengakali hal ini.
Solusi lainnya adalah dengan mengubah layout dari screen sedemikian rupa sehingga, control diikat (bind) dengan tiga buah property dan layout dirancang sehingga memiliki tampilan yang serupa dengan solusi pertama. Untuk melakukan hal tersebut bukalah screen ManageSubjects. Ubah layout dari isi ListBox menjadi Column Layout. Tambahkan property SubjectCode, Name, Text “(”, Credit, dan Text “)”, hapus sisanya. Atur property dari tiap mengikuti panduan pada tabel berikut.
Kali ini ListBox diikat pada tiga buah property yang ditampilkan menggunakan custom layout. Hasil output aplikasi serupa pada solusi pertama, hanya karena ListBox ini diikat pada tiga buah property, maka hasil export menghasilkan tiga kolom (SubjectCode, Name, dan Credit).
Custom Control Seperti yang dibahas sebelumnya antarmuka (screen) dari aplikasi Lightswitch dapat dikustomisasi supaya sesuai dengan skenario yang ada. Tetapi ada kalanya masalah bukan dari layout itu sendiri, melainkan ingin menampilkan data menggunakan control yang tidak disediakan oleh Lightswitch itu sendiri (contoh: menampilkan dalam bentuk grafik/chart). Hal itu sangat mungkin dilakukan, hanya saja caranya tidak bisa semudah mengubah layout dari tampilan itu sendiri. Pengetahuan mengenai XAML sangat membantu dalam membuat control dapat diintegrasikan ke dalam proyek Lightswitch. Perlu diingat bahwa hasil output dari Lightswitch adalah sebuah aplikasi Silverlight yang mendapatkan asupan data dari Web Service (OData). Sebelum melanjutkan untuk mencoba mengintegrasikan control pada aplikasi Lightswitch, ada baiknya untuk mengunduh dan install Silverlight 5 Toolkit (langkah ini tidak perlu dilakukan bilamana Silverlight 5 Toolkit sudah terinstall) yang ada pada laman http://silverlight.codeplex.com/. Silverlight 5 Toolkit terdapat sebuah control untuk menampilkan grafik ke layar, control ini yang digunakan pada contoh kasus kali ini.
Sebelum memulai untuk menambahkan sebuah Silverlight project pada solusi, ada baiknya untuk membuat sebuah detail screen untuk tabel Student. Detail screen ini (nantinya) dapat diakses lewat screen Search Student. Pastikan untuk memasukan juga data dari tabel SubjectParticipants. Terdapat dua buah tabel yang terikat pada screen ini Students dan SubjectParticipants. Tabel Students tidak akan diubah cara menampilkan datanya, sedangkan pada bagian tabel SubjectPartisipants akan diubah sedemikian rupa sehingga menampilkan sebuah grafik batang untuk nilai dan kode mata kuliah yang bersangkutan. Maka bilamana siswa yang bersangkutan telah mengambil 5 mata kuliah, secara otomatis ditampilkan 5 batang yang tingginya tergantung dari nilai mata kuliah tersebut.
Tambahkan sebuah proyek baru pada solusi SistemAkademik (klik kanan solution, pilih Add New Project, pada Project Template pilih Silverlight User Control, berilah nama SistemAkademik.Controls). Delete kelas Class1 (dengan menghapusnya pada Window Solution Explorer). Tambahkan satu buah Silverlight User Control pada proyek SistemAkademik.Controls beri nama StudentScoresChart. Tambahkan control Chart ke window aktif dengan (drag-and-drop), lalu ubah ukuran chart tersebut untuk memenuhi window. Tambahkan kode program berikut pada editor XAML. <UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit" x:Class="SistemAkademik.Controls.StudentScoresChart" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"> <Style TargetType="FrameworkElement"> <Setter Property="Width" Value="0"/>
Orientation="Y"/>
Dari sekian banyak kode XAML, yang paling penting adalah bagian binding dari ColumnSeries. Pada kode XAML ini data ColumnSeries didapat dari Screen.SubjectParticipants (tabel SubjectParticipants yang terikat pada screen). Nilai yang berubah (dependent) diikat pada property Score dari tabel SubjectParticipants. Nilai independen diikat ke SubjectCode dari tabel Subject. Untuk mendapatkan SubjectCode dapat mengakses lewat tabel SubjectRoom. Lakukan proses kompilasi (build), delete Data Grid (Subject Participants) pada screen StudentDetail. Tambahkan sebuah custom control (New Custom Control), klik Add Reference, pilih proyek SistemAkademik.Controls.
Pilihlah control yang telah dibuat, lalu tekan OK. Bilamana melakukannya dengan benar, maka control yang dimaksud sudah ditambahkan ke layout screen. Jalankan aplikasi, tambahkan beberapa data. Bukalah layar detail pada tabel Student. Maka akan didapat tampilan sebagai berikut.
Authentication dan Authorization Authentication adalah sebuah proses untuk identifikasi sebuah entitas. Dalam kasus sebuah sistem informasi hal ini biasanya untuk memastikan identitas dari pengguna. Biasanya identitas pengguna terkait dengan username dan password. Authorization adalah pemberian hak akses pada entitas yang bersangkutan. Proses authorization biasa dilakukan setelah proses authentication. Contoh seorang admin dari sebuah sistem operasi memiliki hak akses untuk membuat pengguna sistem dan instalasi perangkat lunak. Visual Studio Lightswitch mengadopsi framework ASP.NET Membership untuk melakukan kedua proses ini (authentication dan authorization). Pemberian hak untuk mengakses/melarang pengguna dalam menggunakan sebuah sumber daya pada aplikasi Lightswitch hanya menggunakan sedikit kode program saja. Hal ini tentu saja dapat mempersingkat waktu pengerjaan sistem yang secara tidak langsung meningkatkan produktifitas dari pengembang itu sendiri.
Konfigurasi Access Control Bilamana sistem membutuhkan fitur authentication dan authorization maka yang perlu dilakukan adalah dengan membuka window property dari project Lightswitch, kemudian memilih tab Access Control, dan memilih authentication type selain opsi “Do not enable authentication”. Tergantung kasus yang dihadapi, pengembang perlu untuk menambahkan hak akses dalam data grid permission. Window authentication digunakan bilamana sistem ingin dibuat menggunakan authentication dari sistem operasi atau Active Directory. Authentication ini biasa digunakan bilamana sistem yang dibuat akan dijalankan dalam lingkungan sistem operasi Windows. Form authentication digunakan bilamana sistem ingin disimpan di web dan dapat diakses
umum. Bilamana ingin menggunakan form authentication maka sebaiknya sistem diamankan menggunakan certificate dan diakses via HTTPS. Dalam kasus SistemAkademik, sistem ini ingin agar dapat diakses bebas, sehingga menggunakan opsi form authentication. SistemAkademik memiliki tiga hak akses yang perlu ditambahkan, diperbolehkan manajemen data siswa, mata kuliah, dan ruangan kelas. Gunakan gambar berikut untuk membantu dalam menambahkan hak akses.
Verifikasi Hak Akses Verifikasi hak akses dari pengguna dilakukan melalui kumpulan method yang dikenal sebagai Access Control Methods. Access control methods dapat dibuat pada sisi server (data) atau sisi client (screen). Access control methods pada sisi server mengatur hak akses pengguna dalam memanajemen data (CRUD, Create Retrieve Update Delete), sedangkan access control methods pada sisi client mengatur hak akses dalam membuka sebuah screen atau bagian dari screen (contoh: button). Tergantung dari kebutuhan, pengembang dapat menambahkan access control method dari sisi server, sisi client, atau keduanya. Kembali ke kasus SistemAkademik, pada sisi client ditambahkan access control method untuk Add, Update, dan Delete data dalam tabel. Sedangkan pada sisi server ditambahkan access control method untuk screen Manage Students, Manage Rooms, dan Manage Subjects. Berikut adalah kode program pada sisi server. Menambahkan kode program ini dapat dilakukan dengan menakses menu Write Code pada screen yang dimaksud lalu memilih sub menu NamaTabel_CanInsert, NamaTabel_CanUpdate, dan NamaTabel_CanDelete. partial void Students_CanInsert(ref bool result) { var currentUser = Application.Current.User; result = currentUser.HasPermission(Permissions.StudentAdministration); } partial void Students_CanUpdate(ref bool result) { var currentUser = Application.Current.User; result = currentUser.HasPermission(Permissions.StudentAdministration); } partial void Students_CanDelete(ref bool result) { var currentUser = Application.Current.User; result = currentUser.HasPermission(Permissions.StudentAdministration); }
partial void Subjects_CanInsert(ref bool result) { var currentUser = Application.Current.User; result = currentUser.HasPermission(Permissions.SubjectAdministration); } partial void Subjects_CanUpdate(ref bool result) { var currentUser = Application.Current.User; result = currentUser.HasPermission(Permissions.SubjectAdministration); } partial void Subjects_CanDelete(ref bool result) { var currentUser = Application.Current.User; result = currentUser.HasPermission(Permissions.SubjectAdministration); } partial void SubjectRooms_CanInsert(ref bool result) { var currentUser = Application.Current.User; result = currentUser.HasPermission(Permissions.RoomAdministration); } partial void SubjectRooms_CanUpdate(ref bool result) { var currentUser = Application.Current.User; result = currentUser.HasPermission(Permissions.RoomAdministration); } partial void SubjectRooms_CanDelete(ref bool result) { var currentUser = Application.Current.User; result = currentUser.HasPermission(Permissions.RoomAdministration); } partial void RoomParticipants_CanInsert(ref bool result) { var currentUser = Application.Current.User; result = currentUser.HasPermission(Permissions.RoomAdministration); } partial void RoomParticipants_CanUpdate(ref bool result) { var currentUser = Application.Current.User; result = currentUser.HasPermission(Permissions.RoomAdministration); } partial void RoomParticipants_CanDelete(ref bool result) { var currentUser = Application.Current.User; result = currentUser.HasPermission(Permissions.RoomAdministration); }
Tambahkan juga kode program pada sisi client yang bertujuan menyembunyikan screen bilamana tidak memilik hak akses yang sesuai. partial void ManageStudents_CanRun(ref bool result) { result = User.HasPermission(Permissions.StudentAdministration); }
partial void ManageSubjects_CanRun(ref bool result) { result = User.HasPermission(Permissions.SubjectAdministration); } partial void ManageSubjectRooms_CanRun(ref bool result) { result = User.HasPermission(Permissions.RoomAdministration); }
Pengujian Hak Akses Setelah membuat kode program untuk mengatur hak akses dari pengguna, maka ada baiknya dilakukan pengujian terlebih dahulu. Hal ini perlu untuk memastikan pengguna yang memiliki hak akses yang dapat menggunakan fitur tertentu dari aplikasi yang dibuat. Pertama-tama bukalah property dari SistemAkademik. Pastikan semua checkbox “Granted for debug” pada data grid permission tidak ada yang dicek. Jalankan aplikasi, bilamana benar maka semua screen manage data tidak dapat diakses. Tambahkan hak akses StudentAdministration (dengan cek checkbox di baris StudentAdministration).
Daftar Pustaka A. D. Sole, Microsoft Visual Studio Lightswitch, Pearson Education, Inc., 2012. D. Feldman, Developing Business Intelligence Apps for SharePoint, O’Reilly Media, Inc., 2013. J. V. d. Haegen, Lightswitch Succinctly, Morrisville: Syncfusion, 2012. T. Leung, Visual Studio Lightswitch 2012, New York: APRESS, 2013. "Arity," Wikipedia, 29 12 2013. [Online]. Available: http://en.wikipedia.org/wiki/Arity. "Built-In Types Table (C# Reference)," Microsoft, [Online]. Available: http://msdn.microsoft.com/en-us/library/ya5y69ds.aspx. "Class (Computer Programming)," Wikipedia, 12 10 2013. [Online]. Available: http://en.wikipedia.org/wiki/Class_(computer_programming). "C Sharp (programming language)," Wikipedia, 20 3 2014. [Online]. Available: http://en.wikipedia.org/wiki/C_Sharp_(programming_language). "Enterprise Software," Wikipedia, 20 12 2013. [Online]. Available: http://en.wikipedia.org/wiki/Enterprise_software. "Function overloading," Wikipedia, 19 10 2013. [Online]. Available: http://en.wikipedia.org/wiki/Function_overloading. "How to: Execute Cleanup Code Using finally (C# Programming Guide)," Microsoft, [Online]. Available: http://msdn.microsoft.com/en-us/library/ms173166.aspx. "Inheritance (Object-Oriented Programming)," Wikipedia, 30 12 2013. [Online]. Available: http://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming). "Language Integrated Query," Wikipedia, 20 12 2013. [Online]. Available: http://en.wikipedia.org/wiki/Language_Integrated_Query. "LINQ (Language Integrated Query)," Microsoft, [Online]. Available: http://msdn.microsoft.com/en-us/library/bb397926.aspx. "Multitier Architecture," Wikipedia, 23 10 2013. [Online]. Available: http://en.wikipedia.org/wiki/Multitier_architecture. M. Yaiser, "Object-Oriented Programming Concepts: Objects and Classes," Adobe, 31 10 2011. [Online]. Available: http://www.adobe.com/devnet/actionscript/learning/oopconcepts/objects-and-classes.html. "Object-Oriented Programming," Wikipedia, 16 12 2013. [Online]. Available: http://en.wikipedia.org/wiki/Object-oriented_programming. "Open Data Protocol," Wikipedia, 21 12 2013. [Online]. Available: http://en.wikipedia.org/wiki/OData. "Polymorphism (Computer Science)," Wikipedia, 20 10 2013. [Online]. Available: http://en.wikipedia.org/wiki/Polymorphism_(computer_science).
"Properties (C# Programming Guide)," Microsoft, [Online]. Available: http://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx. "Signatures and Overloading," Microsoft, [Online]. Available: http://msdn.microsoft.com/enus/library/aa691131(v=vs.71).aspx.