Menurut hukum Demeter, apakah kelas diperbolehkan untuk mengembalikan salah satu anggotanya?
Ya itu pasti.
Mari kita lihat poin-poin utama :
- Setiap unit harus memiliki pengetahuan yang terbatas tentang unit lain: hanya unit "erat" yang terkait dengan unit saat ini.
- Setiap unit hanya boleh berbicara dengan teman-temannya; jangan berbicara dengan orang asing.
- Hanya berbicara dengan teman dekat Anda.
Ketiganya membuat Anda bertanya satu pertanyaan: Siapa teman?
Ketika memutuskan apa yang akan dikembalikan, Hukum Demeter atau prinsip pengetahuan paling sedikit (LoD) tidak menentukan bahwa Anda membela terhadap coders yang bersikeras melanggarnya. Ini menentukan bahwa Anda tidak memaksa pembuat kode untuk melanggarnya.
Membuat bingung ini adalah alasan mengapa begitu banyak yang berpikir seorang setter harus selalu kembali batal. Tidak. Anda harus mengizinkan cara untuk membuat kueri (getter) yang tidak mengubah status sistem. Itu pemisahan permintaan perintah dasar .
Apakah ini berarti Anda bebas mempelajari rantai kode bersama-sama apa pun yang Anda inginkan? Tidak. Rantai bersama hanya apa yang dimaksudkan untuk dirantai bersama. Kalau tidak, rantai mungkin berubah dan tiba-tiba barang Anda rusak. Inilah yang dimaksud oleh teman.
Rantai panjang bisa dirancang untuk. Antarmuka yang lancar, iDSL, sebagian besar Java8, dan StringBuilder tua yang baik semuanya dimaksudkan untuk membuat Anda membangun rantai panjang. Mereka tidak melanggar LoD karena semua yang ada di rantai dimaksudkan untuk bekerja bersama dan berjanji untuk terus bekerja bersama. Anda melanggar demeter saat Anda menyatukan hal-hal yang tidak pernah saling mendengar. Teman adalah mereka yang berjanji untuk menjaga agar rantai Anda tetap berfungsi. Friends of Friends tidak.
Terlepas dari kelas yang secara khusus ditunjuk untuk mengembalikan objek - seperti kelas pabrik dan pembangun - apakah boleh metode untuk mengembalikan objek, misalnya objek yang dipegang oleh salah satu properti kelas atau akankah itu melanggar hukum demeter (1) ?
Ini hanya menciptakan peluang untuk melanggar demeter. Ini bukan pelanggaran. Ini bahkan belum tentu buruk.
Dan jika itu melanggar hukum demeter, apakah penting jika objek yang dikembalikan adalah objek yang tidak dapat diubah yang mewakili sepotong data dan tidak berisi apa pun selain getter untuk data ini (2)?
Kekekalan itu baik tetapi tidak relevan di sini. Mendapatkan barang melalui rantai yang lebih panjang tidak membuatnya lebih baik. Apa yang membuatnya lebih baik adalah memisahkan cara mendapatkan dari penggunaan. Jika Anda menggunakan, tanyakan apa yang Anda butuhkan sebagai parameter. Jangan berburu untuk itu dengan menggali getter orang asing.
Dalam kode semu:
Saya menduga bahwa hukum Demeter melarang pola seperti di atas. Apa yang dapat saya lakukan untuk memastikan doSomethingElse () dapat dipanggil tanpa melanggar hukum (3)?
Sebelum saya berbicara tentang x.doSomethingElse(a)
mengerti bahwa Anda pada dasarnya telah menulis
b.getA().doSomething()
Sekarang, LoD bukan latihan penghitungan titik . Tetapi ketika Anda membuat rantai Anda mengatakan bahwa Anda tahu cara mendapatkan A
(dengan menggunakan B
) dan Anda tahu cara menggunakan A
. Baiklah sekarang A
dan B
lebih baik berteman dekat karena Anda baru saja menggabungkan mereka.
Jika Anda baru saja meminta sesuatu untuk memberi Anda A
sesuatu yang dapat Anda gunakan A
dan tidak akan peduli dari mana asalnya dan B
bisa hidup bahagia dan bebas dari obsesi Anda untuk mendapatkan A
dari B
.
Adapun x.doSomethingElse(a)
tanpa rincian dari mana x
asalnya, LoD tidak memiliki apa-apa untuk dikatakan tentang hal itu.
LoD dapat mendorong pemisahan penggunaan dari konstruksi . Tapi saya akan tunjukkan jika Anda secara religius memperlakukan setiap objek sebagai tidak ramah Anda akan terjebak menulis kode dalam metode statis. Anda dapat membuat grafik objek yang sangat rumit dengan cara utama ini tetapi pada akhirnya Anda harus memanggil metode untuk memulai sesuatu yang berfungsi. Anda hanya perlu memutuskan siapa teman Anda. Tidak ada jalan keluar dari itu.
Jadi ya, sebuah kelas diperbolehkan untuk mengembalikan salah satu anggotanya di bawah LoD. Ketika Anda melakukannya, Anda harus menjelaskan apakah anggota itu ramah dengan kelas Anda karena jika tidak, beberapa klien dapat mencoba menghubungkan Anda ke kelas itu dengan menggunakan Anda untuk mendapatkannya sebelum menggunakannya. Itu penting karena sekarang apa yang Anda kembalikan harus selalu mendukung penggunaan itu.
Ada banyak kasus di mana ini bukan masalah. Koleksi dapat mengabaikan ini hanya karena mereka dimaksudkan untuk berteman dengan semua yang menggunakannya. Demikian pula benda bernilai ramah dengan semua orang. Tetapi jika Anda menulis alamat yang memvalidasi utilitas yang menuntut objek karyawan tempat ia mengekstraksi alamat, daripada hanya meminta alamatnya, Anda sebaiknya berharap bahwa karyawan dan alamat keduanya berasal dari perpustakaan yang sama.