Saya membaca buku berjudul Rails AntiPatterns dan mereka berbicara tentang menggunakan delegasi untuk menghindari melanggar Hukum Demeter. Inilah contoh utama mereka:
Mereka percaya bahwa memanggil sesuatu seperti ini di controller itu buruk (dan saya setuju)
@street = @invoice.customer.address.street
Solusi yang mereka usulkan adalah melakukan yang berikut:
class Customer
has_one :address
belongs_to :invoice
def street
address.street
end
end
class Invoice
has_one :customer
def customer_street
customer.street
end
end
@street = @invoice.customer_street
Mereka menyatakan bahwa karena Anda hanya menggunakan satu titik, Anda tidak melanggar Hukum Demeter di sini. Saya pikir ini tidak benar, karena Anda masih melalui pelanggan untuk pergi melalui alamat untuk mendapatkan jalan faktur. Saya terutama mendapat ide ini dari posting blog yang saya baca:
http://www.dan-manges.com/blog/37
Dalam posting blog contoh utama adalah
class Wallet
attr_accessor :cash
end
class Customer
has_one :wallet
# attribute delegation
def cash
@wallet.cash
end
end
class Paperboy
def collect_money(customer, due_amount)
if customer.cash < due_ammount
raise InsufficientFundsError
else
customer.cash -= due_amount
@collected_amount += due_amount
end
end
end
Posting blog menyatakan bahwa meskipun hanya ada satu titik customer.cash
alih-alih customer.wallet.cash
, kode ini masih melanggar Hukum Demeter.
Sekarang dalam metode collect_money Paperboy, kami tidak memiliki dua titik, kami hanya memiliki satu di "customer.cash". Apakah delegasi ini menyelesaikan masalah kita? Tidak semuanya. Jika kita melihat perilaku itu, seorang tukang koran masih merogoh dompet pelanggan untuk mendapatkan uang tunai.
EDIT
Saya benar-benar mengerti dan setuju bahwa ini masih merupakan pelanggaran dan saya perlu membuat metode Wallet
penarikan yang disebut menangani pembayaran untuk saya dan saya harus memanggil metode itu di dalam Customer
kelas. Yang tidak saya dapatkan adalah bahwa menurut proses ini, contoh pertama saya masih melanggar Hukum Demeter karena Invoice
masih menjangkau langsung ke Customer
jalan.
Adakah yang bisa membantu saya menghilangkan kebingungan ini? Saya telah mencari selama 2 hari terakhir mencoba untuk membiarkan topik ini masuk, tetapi masih membingungkan.