Friday, June 29, 2007

LINQ to SQL first try

Emm, saya dah lama tak tulis ADO.net dataaccess punya code dan saya akui saya banyak dah lupa macam maner nak guna SqlCommand, SqlConnection etc, pernah ada satu adhoc nyer project memerlukan saya buat connection ke database dan query simple data dan bayangkan saya terpaksa google dan pergi ke ADO.Net QuikStart unutk start buat SqlConnection dan cari mcm maner nak pangil connection string.

Ini adalah kerana kesemua project yang saya buat jika terlibat dengan database saya akan menggunakan NHibernate sebagai OR Mapper, jadi memang patut skill ADO.Net saya pupus macam tu sahaja, saya tak menyesal pun..hahaha :) mesti pengikut setia Microsoft ADO.Net yang menggunakan DataAccess Application Block pada semacam je.

Anyway hari nie ada kelainan sedikit, saya terbaca beberapa comment tentang LINQ to SQL tapi belum pernah tergerak hati lagi nak mencuba, ntah lepas habis run automated test dgn jaya, saya tergerak untuk godek-godek serba sedikit LINQ to SQL , mcam maner rupa nyer, LINQ itu sendiri memang saya faham apa ke bende nyer, tapi bila dah terlalu banyak codename dlm .Net nyer group saya pun jadi pening. Saya rasa ada bnyk lagi tech baru dlm .Net saya tak tahu mcm Jasper, Astoria dan beberapa project lain yang nama codename pun saya tak ingat.

Ok lah saya tunjukkan mcm maner saya start guna LINQ to SQL tapi nie shorcut je, saper minat try sendiri :)

- Create Orcas project
- Add LINQ to SQL File
- Create SQL Connection Database di DataConenction
- Lepas tu coding LINQ

Contoh mcm gambar ini







Code yang ditulis:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LINQToSQL
{
class Program
{
static void Main(string[] args)
{
NorthwindDataContext ndc = new NorthwindDataContext();
var prod = from p in ndc.Products
where p.Category.CategoryName == "Seafood"
select p;
foreach (Product p in prod)
{
Console.WriteLine(p.ProductName);
}
Console.ReadKey();

}
}
}


Ringkasan:
Emm masih tak boleh nak lawan NHibernate sebab, NHibernate kekuatannya ialah rich domain context dan LINQ to SQL masih lagi relational database driven context.

Simple MVC Test Konsep

Pagi nie, sementara tengah tunggu file dari another group untuk buat automated test, saya cuba try simple coding konsep mvc. Bila try simple coding mcm nie lebih menjadikan kita faham akan sesuatu pattern itu. Tapi saya tak sure adakah konsep yang saya fikirkan nie betul atau pun tidak.

Pattern MVC terdiri dari tiga element, Model, View dan Controller. Controller akan menjadi raja dalm kes MVC, Controller akan manipulate data dari Model dan akan panggil which View untuk process seterusnya.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace MVC
{
public class Program
{
public static void Main(string[] args)
{
IndexController ic = new IndexController();

ic.Index();
ic.Save();

Console.ReadKey();
}
}

public class IndexController
{
Hashtable ht = new Hashtable();

PersonView pv = new PersonView();

public void Index()
{
Person p = new Person();
p.Name = "Azam";

ht.Add("name", p.Name);

string indexHtml = pv.IndexHtml();

indexHtml = indexHtml.Replace("$name", ht["name"].ToString());

Console.WriteLine(indexHtml);

}

public void Save()
{
ht.Add("save", "Record Has Been Saved");
string indexHtml = pv.SaveHtml();
indexHtml = indexHtml.Replace("$save", ht["save"].ToString());

Console.WriteLine(indexHtml);
}
}

public class Person
{
public string Name;
}

public class PersonView
{
public string IndexHtml()
{
return "Name :$name";
}

public string SaveHtml()
{
return "Save :$save";
}
}
}

Output:

Name: Azam
Save: Record Hass Been Saved


Code diatas memang simple dan itu hanya lah 0.1% dari MVC yang real. :)

Thursday, June 28, 2007

Object Modeling, Tahap Advance ke ? Part 1

Ok tajuk kat atas tu saya ambil dari seseorang yang saya anggap Guru, saya banyak belajar dari beliau dan hingga sekarang masih lagi berguru :)

So artikel ini adalah berdasarkan Object Modeling yang telah disediakan oleh beliau di link ini TulisanInsan.

Saya minat nak try side by side TDD and Design Domain, so saya akan demo basic dari UML dan start buat simple test dan tambah lagi dan lagi dan lagi.. :)

Pada saya Pelanggan ada 2 konteks sama ada perlu dimasukkan dlm object atau ianya external object yang akan communicate melalui PelayanKaunter tapi tak begitu penting dlm sistem, mungkin juga pelanggan ini akan penting dalam sistem dan bukan menjadi external object jika maklumat pelanggan itu diperlukan atau ada apa-apa information dari pelanggan yang akan memainkan peranan dalam aplikasi tersebut. Jika kita banyangkan aplikasi ini adalah seperti KFC atau Mc Donalds, pelanggan tak berapa penting.. itu pendapat saya. Saya juga akan cuba menggunakan sebanyak mungkin Fluent Interface semasa buat TDD.

First saya akan bahagikan Test Suite saya kepada beberapa suite, unutk permulaan yang penting sya akan buat CreateTest suite. Test ini akan menumpukan test creation object.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Domain.KaunterMakanan;
using NUnit.Framework;

namespace KaunterMakanan.Test
{
[TestFixture]
public class CreateTest
{
[Test]
public void CreatePelayanKaunter()
{
PelayanKaunter pk = new PelayanKaunter();
Assert.IsNotNull(pk);
}

[Test]
public void CreatePesananMI()
{
PesananMI pmi = new PesananMI();
Assert.IsNotNull(pmi);
}

[Test]
public void PelayanCounterCanCreatePesanan()
{
PelayanKaunter pk = new PelayanKaunter();
pk.CreatePesanan(new PesananMI());

Assert.AreEqual(1, pk.PesananLists.Count);
}


}
}


Code diatas hanyalah test suite dimana belum ada domain lagi dibuat.So bila run code diatas memang akan menjadi fail. So kita perlu ada object PelayanKaunter dan PesananMI

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Domain.KaunterMakanan
{
public class PelayanKaunter
{
}
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Domain.KaunterMakanan
{
public class PesananMI
{
}
}


So next kita run semula code kita dan 2 dari 3 Test Suite akan hijau manakala Test Suite PelayanCounterCanCreatePesanan still merah, ini adalah kerana kita masih lagi tidak mempunyai method CreatePesanan didalam object PelayanKaunter. Next kita akan refactor code PelayanKaunter dengan tambah method CreatePesanan() dan berdasarkan usecase En Hamdi PelayanKaunter boleh create many PesananMI.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Domain.KaunterMakanan
{
public class PelayanKaunter
{


protected List<PesananMI> pesananLists = new List<PesananMI>();

public List<PesananMI> PesananLists
{
set { pesananLists = value; }
get { return pesananLists; }
}

public void CreatePesanan(PesananMI pesananMI)
{
pesananLists.Add(pesananMI);

}
}
}


bersambung

Friday, June 22, 2007

Update



*Gambar team, selepas makan kat Muzium Kesenian Islam

Saya sebenarnya menulis bukan sebab nak mengajar sesiapa atau nak tunjuk pandai,sebab saya sendiri tak pandai dan tak reti nak mengajar, cuma saya rasa untuk saya lebih faham.. saya perlu luahkan apa yang saya faham, sebab saya tak de murid maka saya luahkan dlm bentuk penulisan..dan saya tak ambik sesiapa jadi murid saya dlm bidang soft dev .. sebab saya categori org yang masih menuntut ilmu. Saya tak plan sgt tentang bahasa apa hendak tulis, sebab tu tatabahasa saya agak berterabur, saya bukan org sastera .. :)

Saya dah lama tak update pasal kerja, kerja kat company P, ok menarik.. enviroment pun agak tenang didalam team cuma ada bebrapa cubaan serangan dari luar, yang tak berapa suka kot melihat team ini memperkenalkan a few technolgy dlm soft dev. Saya masih lagi lead .Net team tapi saya memilih jalan alternatif.. :) .. walau org melihat kalau developer dari camp microsoft , mesti berfikir cara development soft akan follow cara yang di perkenalkan microsoft "pattern and best pratices from microsoft", saya agak terbuka dalam aliran soft dev, saya juga agak terbuka dlm memilih technology, saya tak memperkecilkan tech yang di develop oleh group lain *Java,Ruby etc, pada saya jika product mereka bagus ..saya akui dan jika berkesempatan saya juga berminat hendak mepelajari jika pun tidak secara direct tapi teknik penghasilan technolgy tersebut. Latar belakang saya juga dari java, jadi keinginan untuk ambil tahu perkembangan Java masih lagi ader.

Dalam handle .Net team di sini saya lebih memilih menggunakan agile process, dimana buat sedikit dan deliver kepada client kemudian ubah dan tambah lagi. Client tak semestinya client dalam ertikata apa yang kita faham.. dalam dev soft client saya boleh terdiri dari programmer yang perlukan code dan design saya dan juga dari QA unutk jalankan test dan dari pihak management sendiri.So bila saya develop sesuatu, lagi cepat saya bagi programmer untuk test dan extend code tersebut dan juga QA untuk test lagi cepat dan berkualiti code tersebut.

TDD dan DDD merupakan dua cara yang saya praktikan untuk buat agile, terdapat beberapa tools untuk menyokong process ini.Saya selesa dengan cara ini.

Emm .. apa lagi..nak update.. kerje lain:).. walau ader terfikir tapi bukan dlm jangka masa terdekat.

Thursday, June 21, 2007

Anounymous Method

Anonymous Method new features dlm .Net 2.0, baru je nak cuba faham kan apa adavantage guna anonymous method. Perkara utama dlm anonymous method ialah ianya boleh buat inline method dan memudahkan untuk baca dan maitainbility code.

Anonymous method menggunakan delegate. Dan di dalam .Net 2.0 untuk declare delegate cukup mudah -contoh:


public delegate void Print();

atau

public delegate string GetPrintValue();

atau

public delegate void PrintValueWithParameter(string param);


Kebaikan delegate ialah execution method boleh ditangguhkan sehingga dikehendaki oleh client. Contoh dibawah ialah bagaimana untuk guna Anonymous Method

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace Delagate1
{

public class Program
{
public delegate void PrintLine();

public static void Main(string[] args)
{
PrintLine pl = delegate() { Console.WriteLine("Print Line"); };

pl();

Console.ReadKey();

}
}
}



Code dibawah ini dikenali sebagai Anonymous Method

 PrintLine pl = delegate() { Console.WriteLine("Print Line"); };



Saya bawa contoh dlm real life sebegini. Katakan anda sebagai bos sebuah company mencuci bangunan, anda ambil pekerja dan beri latihan , sebuah company lain hendak bersihkan bangunan dan ingin menggunkan khidmat company anda. So kat sini perkerja tadi boleh dijadikan anoymous method untuk buat kerja mencuci dan juga apa method lain yang follow contract delegate dan anda wakilkan pekerja tersebut unutk bersihkan company yang ingin buat cucian.. :) ..waktu ini,idea ini saja yang terlintas kat kepala otak.. :) so mcm maner bentuk code.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace Delagate1
{

public class Program
{
public delegate void PrintLine();

public static void Main(string[] args)
{
PrintLine pl = delegate() { Console.WriteLine("Print Line"); };

pl();

CompanyCuci cc = new CompanyCuci();
Delagate1.CompanyCuci.ICuciLantai cl = cc.DapatkanPencuci();

CompanyYangNakCuci cnc = new CompanyYangNakCuci();
cnc.NakBersihkanLantai(cl);

Console.ReadKey();

}
}

interface ICuciLantai
{
void CuciSemua();

}

class CompanyCuci
{
public delegate CaraCuci ICuciLantai();

public ICuciLantai DapatkanPencuci()
{
return delegate()
{
Console.WriteLine("Start Mencuci");
return new CaraCuci();
};
}
}

class CaraCuci : ICuciLantai
{
#region ICuciLantai Members

public void CuciSemua()
{
Console.WriteLine("Sedang Mencuci");
}

#endregion
}

class CompanyYangNakCuci
{
public void NakBersihkanLantai(Delagate1.CompanyCuci.ICuciLantai cl)
{
cl().CuciSemua();
}
}
}

Ouput:
Start Mencuci
Sedang Mencuci

Tuesday, June 12, 2007

SQL Server 2005 Compact Edition

Semasa develop Autometed Test (AT) untuk scanner simulator, saya decide menggunakan SQL Server 2005 Compact Edition menggantikan SQL Server CE yang digunakan didalam Scanner Symbol MC3000, dan mengikut design AT, unutk menjalankan scanner, ianya perlu di mulakan dari AT dan Web Services menjadi medium antara AT dan Scanner Simulator. Apabila saya excute unit test, saya dapat error "SQL Server Compact Edition is not intended for ASP.NET development".

Saya google dan find beberapa info, dimana SQL Server COmpact Edition memang tak support ASP.Net by default, tetapi ada work around. Ok ini adalah kerana SQL Compact Edition tidak optomized untuk serve sebagai database untuk web site/web services dan juga tidak support untuk multi user connection. Ia di gunakan sebagai embedded database didalam aplikasi. So workaround yang boleh dibuat ialah jika hendak menggunakan Compact Edition bersama Web Services,ianya hanya unutk synchronization ataupun single user dan code untuk tukar behavior SQL Server Compact seperti berikut:

AppDomain.CurrentDomain.SetData("SQLServerCompactEditionUnderWebHosting", true)


Letak code nie before jalankan aplikasi.

Wednesday, June 06, 2007

New C# Orcas Language

Hari ni, saya berkesempatan untuk write simple code menggunakan new C# language dalam Orcas. Salah satu language features baru ialah Query Syntax

Query Syntax ialah cara mudah untuk filter any information dalam memory collection. Ianya menggunakan LINQ query operator. Contoh dibawah

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Linq;
using System.Data.Linq;
using System.Linq;
namespace ExtensionMethod
{
public class Program
{

public static void Main(string[] args)
{
List<People> pe = ListPeople();
IEnumerable<People> p = pe.Where(p1=>p1.Name.Equals("Azam"));
foreach (People pp in p)
{
Console.WriteLine(pp.Name);

}

Console.ReadLine();
}

public static List<People> ListPeople()
{
List<People> p = new List<People>
{
new People {Name="Azam",Address="Melaka"},
new People {Name="Kamal",Address="Wilayah"}
};
return p;
}
}

public class People
{
public string Name { set; get; }
public string Address { set; get; }
}

}

Monday, June 04, 2007

Kembali bekerja setelah seminggu bercuti

Hari nie saya start kerje semula..rasa sengal otak nak start tengok code dan design setelah seminggu tak sentuh komputer, email pun saya malas nak access masa cuti..memang cuti sakan lah minggu lepas, saya just bawa family bercuti ke Bukit Merah..anak saya yang sulong kalau kat rumah cukup.. suka main air dlm pool kecil.. so bila bawa ke bukit merah kat swimming pool kanak-kanak.. cukup main happy lagi..seronok tengok.

Balik bila tgk code, agak lembap sikit first day.. banyak check email..dan baca posting dlm it-tutor.