Artikel ini mengklaim bahwa kelas data adalah "bau kode". Alasannya:
Itu hal yang normal ketika kelas yang baru dibuat hanya berisi beberapa bidang publik (dan mungkin bahkan beberapa pengambil / setter). Tetapi kekuatan sebenarnya dari objek adalah bahwa mereka dapat berisi tipe perilaku atau operasi pada data mereka.
Mengapa salah untuk objek hanya berisi data? Jika tanggung jawab inti kelas adalah untuk mewakili data, tidak akan menambahkan metode yang beroperasi pada data melanggar Prinsip Tanggung Jawab Tunggal ?
Jawaban:
Sama sekali tidak ada yang salah dengan memiliki objek data murni. Penulis artikel itu terus terang tidak tahu apa yang dia bicarakan.
Pemikiran seperti itu bermula dari gagasan yang lama, gagal, bahwa "OO sejati" adalah cara terbaik untuk memprogram dan bahwa "OO sejati" adalah semua tentang "model data kaya" di mana orang menggabungkan data dan fungsionalitas.
Realitas telah menunjukkan kepada kita bahwa sebenarnya yang terjadi adalah yang sebaliknya, terutama di dunia solusi multi-utas ini. Fungsi murni, dikombinasikan dengan objek data yang tidak dapat diubah, adalah cara yang lebih baik untuk kode.
sumber
Sama sekali tidak ada yang salah dengan memiliki objek data murni. Penulis berpendapat tidak dibagikan oleh pengembang perangkat lunak yang saya tahu.
Khusus untuk pemetaan basis data, Anda secara umum memiliki kelas entitas yang hanya berisi bidang yang disimpan dalam basis data dan getter dan setter. Hibernate Wikipedia (kerangka kerja)
Gagasan lubang kacang Jawa yang digunakan oleh banyak alat / kerangka kerja didasarkan pada kelas data yang disebut kacang yang hanya berisi bidang dan getter dan setter terkait. Wikipdia JavaBeans
Fazit:
Jika seseorang mengklaim bahwa ada sesuatu yang 'buruk' atau 'bau kode', Anda harus selalu mencari alasan yang diberikan. Jika alasannya tidak meyakinkan Anda bertanya kepada orang lain untuk alasan yang lebih baik atau pendapat yang berbeda. (Seperti yang Anda lakukan di forum ini)
sumber
Argumen yang bagus mengapa oleh Martin Fowler:
"Tell-Don't-Ask adalah prinsip yang membantu orang mengingat bahwa orientasi objek adalah tentang menggabungkan data dengan fungsi yang beroperasi pada data itu. Ini mengingatkan kita bahwa daripada meminta objek untuk data dan bertindak pada data itu, kita sebagai gantinya harus memberi tahu objek apa yang harus dilakukan. Ini mendorong untuk memindahkan perilaku ke objek untuk pergi dengan data. "
https://martinfowler.com/bliki/TellDontAsk.html
sumber
baz
sebagai parameter ke metode statis, tetapi untuk melakukan itu, Anda harus terlebih dahulu meminta objek untuk itu. Mungkin dalam paradigma pemrograman di mana metode yang utama (seperti, katakanlah, pemrograman fungsional) ini masuk akal, tetapi dalam lingkungan OO, sama sekali tidak, karena objek adalah yang utama dan harus berisi data dan fungsi untuk bertindak atasnya. Klaim Anda bahwa menghapus metode dari objek telah meningkatkan enkapsulasi juga persis mundur , sejauh yang saya tahu, karena itu berarti bahwa Anda sekarang telahbaz
muncul di luar objek.Yang perlu Anda pahami adalah bahwa ada dua jenis objek:
Objek yang memiliki perilaku . Ini harus menahan diri dari memberikan akses publik ke sebagian besar / anggota data mereka. Saya berharap hanya sedikit metode accessor yang ditentukan untuk ini.
Contohnya adalah regex yang dikompilasi: Objek dibuat untuk memberikan perilaku tertentu (untuk mencocokkan string dengan regex tertentu, dan melaporkan kecocokan (sebagian)), tetapi bagaimana regex yang dikompilasi melakukan tugasnya bukan merupakan milik pengguna bisnis.
Sebagian besar kelas yang saya tulis adalah dalam kategori ini.
Objek yang benar-benar hanya data . Ini seharusnya hanya menyatakan semua anggotanya publik (atau menyediakan set lengkap aksesor untuk mereka).
Contohnya adalah kelas
Point2D
. Sama sekali tidak ada invarian yang perlu dipastikan untuk anggota kelas ini, dan pengguna harus dapat mengakses data hanya melaluimyPoint.x
danmyPoint.y
.Secara pribadi, saya tidak menggunakan banyak kelas seperti itu, tetapi saya kira tidak ada kode yang lebih besar yang saya tulis yang tidak menggunakan kelas semacam itu di suatu tempat.
Menjadi mahir dengan orientasi objek termasuk menyadari bahwa perbedaan ini ada, dan belajar untuk mengklasifikasikan fungsi kelas menjadi salah satu dari dua kategori ini.
Jika Anda kode dalam C ++, Anda bisa membuat perbedaan ini secara eksplisit dengan menggunakan
class
untuk kategori objek pertama, danstruct
untuk yang kedua. Tentu saja, keduanya setara, kecuali ituclass
berarti bahwa semua anggota bersifat pribadi secara default, sementarastruct
menyatakan semua anggota publik secara default. Yang merupakan jenis informasi yang ingin Anda komunikasikan.sumber