TL; DR:
DTO menggambarkan pola transfer negara. POCO tidak menjelaskan apa pun. Ini cara lain untuk mengatakan "objek" di OOP. Itu berasal dari POJO (Jawa), diciptakan oleh Martin Fowler yang secara harfiah hanya menggambarkannya sebagai nama yang lebih menarik untuk 'objek' karena 'objek' tidak terlalu seksi.
DTO adalah pola objek yang digunakan untuk mentransfer keadaan di antara lapisan yang memprihatinkan. Mereka dapat memiliki perilaku (yaitu secara teknis bisa menjadi poco) selama perilaku itu tidak mengubah negara. Misalnya, mungkin ada metode yang membuat cerita bersambung.
POCO adalah objek polos, tetapi yang dimaksud dengan 'polos' adalah bahwa objek itu tidak istimewa. Ini hanya berarti itu adalah objek CLR tanpa pola tersirat padanya. Istilah umum. Itu tidak dibuat untuk bekerja dengan beberapa kerangka kerja lain. Jadi, jika POCO Anda memiliki [JsonProperty]
atau dekorasi EF di seluruh propertinya, misalnya, maka saya berpendapat bahwa itu bukan POCO.
Berikut beberapa contoh berbagai jenis pola objek untuk dibandingkan:
- Lihat Model : digunakan untuk memodelkan data untuk tampilan. Biasanya memiliki anotasi data untuk membantu pengikatan dan validasi. Dalam MVVM, itu juga bertindak sebagai pengontrol. Ini lebih dari sekadar DTO
- Value Object : digunakan untuk merepresentasikan nilai
- Agregat Root : digunakan untuk mengelola negara dan invarian
- Penangan : digunakan untuk menanggapi suatu peristiwa / pesan
- Atribut : digunakan sebagai dekorasi untuk menangani masalah lintas sektoral
- Layanan : digunakan untuk melakukan tugas-tugas kompleks
- Controller : digunakan untuk mengontrol aliran permintaan dan respons
- Pabrik : digunakan untuk mengonfigurasi dan / atau merakit objek kompleks untuk digunakan ketika konstruktor tidak cukup baik. Juga digunakan untuk membuat keputusan tentang objek mana yang harus dibuat saat runtime.
- Repositori / DAO : digunakan untuk mengakses data
Ini semua hanyalah objek, tetapi perhatikan bahwa sebagian besar dari mereka umumnya terikat pada suatu pola. Jadi Anda bisa menyebutnya "objek" atau Anda bisa lebih spesifik tentang maksudnya dan menyebutnya dengan apa adanya. Ini juga mengapa kami memiliki pola desain; untuk menggambarkan konsep kompleks dalam beberapa karya. DTO adalah sebuah pola. Root agregat adalah sebuah pola, View Model adalah sebuah pola (mis. MVC & MVVM). POCO bukan sebuah pola.
POCO tidak menjelaskan suatu pola. Ini hanya cara berbeda untuk merujuk ke kelas / objek di OOP. Anggap saja sebagai konsep abstrak; mereka bisa merujuk pada apa saja. IMO, ada hubungan satu arah meskipun karena begitu suatu objek mencapai titik di mana ia hanya dapat melayani satu tujuan dengan bersih, itu bukan lagi POCO. Misalnya, setelah Anda menandai kelas Anda dengan dekorasi untuk membuatnya bekerja dengan beberapa kerangka kerja, itu bukan lagi POCO. Karena itu:
- DTO adalah POCO
- POCO bukan DTO
- Model Tampilan adalah POCO
- POCO bukan Model Tampilan
Poin dalam membuat perbedaan antara keduanya adalah tentang menjaga pola yang jelas dan konsisten dalam upaya untuk tidak melintasi masalah dan mengarah pada penggabungan yang ketat. Sebagai contoh jika Anda memiliki objek bisnis yang memiliki metode untuk bermutasi, tetapi juga dihiasi dengan dekorasi EF untuk disimpan ke SQL Server DAN JsonProperty sehingga dapat dikirim kembali melalui titik akhir API. Objek itu akan tidak toleran untuk berubah, dan kemungkinan akan dikotori dengan varian properti (misalnya UserId, UserPk, UserKey, UserGuid, di mana beberapa dari mereka ditandai untuk tidak disimpan ke DB dan yang lain ditandai untuk tidak diserialisasi ke JSON di titik akhir API).
Jadi, jika Anda memberi tahu saya bahwa ada sesuatu yang merupakan DTO, maka saya mungkin akan memastikan bahwa itu tidak pernah digunakan untuk hal lain selain mengubah keadaan. Jika Anda memberi tahu saya bahwa ada sesuatu yang merupakan model tampilan, maka saya mungkin akan memastikan itu tidak disimpan ke basis data. Jika Anda memberi tahu saya bahwa ada sesuatu yang merupakan Model Domain, maka saya mungkin akan memastikan tidak ada ketergantungan pada apa pun di luar domain. Tetapi jika Anda mengatakan kepada saya bahwa ada sesuatu yang disebut POCO, Anda tidak akan benar-benar memberi tahu saya sama sekali.