Arsip

Archive for Januari, 2013

Perbedaan Antara DTO dan POCO

25 Januari 2013 13 komentar

GambarTulisan saya kali ini akan membahas mengenai perbedaan antara konsep DTO (Data Transfer Object) dan POCO (Plain Old CLR Object).
Tulisan ini saya buat karena banyak yang beranggapan bahwa konsep DTO dan POCO adalah sama, mudah-mudahan dengan sedikit penjelasan kita bisa memahami perbedaan konsep keduanya.

Apa yang dimaksud dengan Data Transfer Object (DTO)?

Menurut wikipedia yang dimaksud dengan DTO adalah

“The difference between Data Transfer Objects and Business Objects or Data Access Objects is that a DTO does not have any behaviour except for storage and retrieval of its own data (accessors and mutators).”

jika diterjemahkan kurang lebih adalah sebagai berikut :
“Perbedaan antara Data Transfer Objects dan Business Objects atau Data Access Objects adalah bahwa DTO tidak memiliki method apapun kecuali untuk penyimpanan dan pengambilan data sendiri (accesor dan mutator).”

Jadi konsep utama dari DTO adalah penyimpanan data, sehingga DTO tidak memiliki metode/fungsi selain accesor dan mutator (Get,Set) yang hanya digunakan untuk mendapatkan dan mengatur data. Lalu mengapa begitu simple? hal ini bertujuan agar kita dapat mengetikkan dengan sedikit code namun powerfull dan ringan. Biasanya pendekatan DTO dijadikan sebagai wadah untuk memindahkan data dari DAL (data access layer) ke BAL (bussiness access layer) atau antara lapisan dimasing-masing dalam arsitektur n-tier. Berikut ini kode untuk pendekatan DTO

public class Currency
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Code { get; set; }
    public string Prefix { get; set; }
    public string Sufix { get; set; }
    public double Rate { get; set; }
    public string Description { get; set; }
    public bool IsDefault { get; set; }

    // Konstruktor
    public Currency()
    {
        this.Id = 0;
        this.Code = string.Empty;
        this.Name = string.Empty;
        this.IsDefault = false;
        this.Rate = 1;
        this.Prefix = string.Empty;
        this.Sufix = string.Empty;
        this.Description = string.Empty;
    }
}

Jadi, singkatnya, DTO hanyalah sebuah kumpulan data. Class ini tidak memiliki validasi, tidak ada logika bisnis, tidak ada logika apapun. Ini sangat sederhana, ringan dan hanya dijadikan wadah untuk memindahkan data.

Apa POCO?

POCO merupakan singkatan dari (Plain Old CLR Object) atau ada juga yang mengatakan (Plain Old C# Object). POCO sebenarnya adalah versi .Net dari POJO (Plain Old Java Object). Pendekatan POCO lebih kearah Bisnis Object yang memiliki data, validasi, dan setiap logika bisnis lain yang ingin ditempatkan di sana. Tapi ada satu hal yang tidak dimiliki POCO, POCO tidak memiliki persistensi. Pendekatan POCO tidak memiliki fungsi Currency.GetById() atau Currency.Save(). POCO hanya berisi data dan logika domain, tidak ada logika persistensi apapun disana.

Berikut ini adalah kode untuk kelas POCO CurrencyBAL. Di kode tersebut anda akan melihat bahwa tidak ada logika persistensi apapun disana, hanya data dan fungsi validasi. Anda juga akan melihat bahwa kode tersebut tidak membuat sekelompok accesor dan mutator (Get, Set) untuk data currency saya. Karena akan mengacaukan kelas Currency saya yang telah didefinisikan di kelas Currency. Sebaliknya saya hanya memiliki satu properti bernama Data yang merupakan kelas Currency. Dengan pendekatan ini memudahkan kita untuk mendapatkan dan menyimpan data currency.

public class CurrencyBAL
{
    public Currency Data { get; set; }

    public CurrencyBAL()
    {
        this.Data = new Currency();
    }

    public CurrencyBAL(Currency currency)
    {
        this.Data = currency;
    }

    public List<ValidationError> Validate()
    {
        List _validations = new List<ValidationError>();

        if (string.IsNullOrEmpty(this.Data.Name))
        {
            _validations.Add(new ValidationError("Currency Name Harus diisi."));
        }

        // Blaa.... Blaa....Blaa....
        // Silahkan lanjutkan lagi jika anda ada ide
        return _validations;
    }
}

So.. Tidak ada logika persistensi disana, hanya data dan logika validasi. Mungkin anda berpikir, jika tidak ada logika persistensi disana lalu bagaimana cara mendapatkan dan menyimpan data? Jawabannya adalah, kelas lain. POCO harus terhidrasi oleh beberapa kelas lain yang merangkum logika persistensi untuk entitas tersebut, seperti repositori atau pengontrol data. Saya biasanya menggunakan repositori. Untuk contoh ini saya menggunakan kelas Repository<Currency> yang merangkum logika untuk mendapatkan objek currency, kemudian menetapkan CurrencyBAL.Data = currency. Kelas Repository<Currency> saya memiliki metode Save() dan GetById(). Kode untuk mendapatkan dan menetapkan entitas orang UI saya terlihat seperti ini:

            Repository<Currency> currencies = new Repository<Currency>();
            Currency current = currencies.GetByID(1);
            current.Code = "IDR";
            // Bla... Bla... Bla...

            // Simpan ke database
            currencies.Save();

Kenapa harus menggunakan cara ini?

Pertanyaan berikutnya adalah: Apa gunanya? Mengapa saya harus menggunakan pola-pola tersebut, dan bukan hanya menggunakan DataTables dan menempatkan semua logika persistensi saya di objek entitas saya? Jawabannya adalah. Saya lebih suka arsitektur POCO / Repository / DTO, mungkin bagi beberapa developer beranggapan itu bukan cara yang tepat untuk merancang aplikasi. Namun saya berpikir manfaat terbesar dari metode ini adalah bahwa arsitektur ini yang sangat bersih dan mudah untuk di maintain. Dengan menggunakan metode ini kita memisahkan tugas dari masing-masing object antara Logika Bisnis dan Logika Persistensi, yang lebih sesuai dengan Prinsip Tanggung Jawab Single dimana masing-masing melakukan fungsinya sendiri tanpa tumpang tindih. Penggunaan metode POCO, DTO dan DAL yang baik akan memudahkan developer dalam mengembahkan arsitektur applikasi yang tepat. Banyak ORM yang menggunakan metode ini seperti Entity Framework, nHibernate, dan masih banyak lagi.

Jadi, kesimpulannya, sebaiknya belajarlah mencintai POCO, dan pastikan Anda tidak menyebar informasi yang salah tentang POCO dan DTO. DTO adalah property data yang digunakan untuk memindahkan data antara lapisan aplikasi. sedangkan POCO adalah bisnis object yang lengkap, namun tidak memiliki fungsi persistensi.

Kategori:Tidak Dikategorikan