मैं एक पुस्तक पढ़ रहा हूं जिसका नाम है रेल्स एंटीपैटर्न और वे कानून के कानून को तोड़ने से बचने के लिए प्रतिनिधिमंडल का उपयोग करने के बारे में बात करते हैं। यहाँ उनका प्रमुख उदाहरण दिया गया है:
उनका मानना है कि कंट्रोलर में कुछ इस तरह से कॉल करना बुरा है (और मैं सहमत हूं)
@street = @invoice.customer.address.street
उनका प्रस्तावित समाधान निम्नलिखित करना है:
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
वे यह कह रहे हैं कि चूंकि आप केवल एक डॉट का उपयोग करते हैं, इसलिए आप यहां कानून के कानून को नहीं तोड़ रहे हैं। मुझे लगता है कि यह गलत है, क्योंकि आप अभी भी चालान की सड़क पाने के लिए ग्राहक से गुजर रहे हैं। मुझे मुख्य रूप से एक ब्लॉग पोस्ट से मुझे यह विचार मिला:
http://www.dan-manges.com/blog/37
ब्लॉग पोस्ट में प्रमुख उदाहरण है
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
ब्लॉग पोस्ट में कहा गया है कि हालांकि customer.cash
इसके बजाय केवल एक डॉट है customer.wallet.cash
, यह कोड अभी भी कानून के कानून का उल्लंघन करता है।
अब पेपरबॉय कलेक्ट_मनी पद्धति में, हमारे पास दो डॉट्स नहीं हैं, हमारे पास "customer.cash" में एक है। क्या इस प्रतिनिधिमंडल ने हमारी समस्या हल कर दी है? हर्गिज नहीं। यदि हम व्यवहार को देखें, तो कैशबैक प्राप्त करने के लिए एक पेपरबॉय अभी भी सीधे ग्राहक के बटुए में पहुंच रहा है।
संपादित करें
मैं पूरी तरह से समझता हूं और सहमत हूं कि यह अभी भी उल्लंघन है और मुझे Wallet
आहरण में एक विधि बनाने की आवश्यकता है जो मेरे लिए भुगतान को संभालती है और मुझे उस पद्धति को Customer
कक्षा के अंदर कॉल करना चाहिए । मुझे जो नहीं मिलता है, वह है कि इस प्रक्रिया के अनुसार, मेरा पहला उदाहरण अभी भी कानून के कानून का उल्लंघन करता है क्योंकि सड़क पाने के लिए Invoice
अभी भी सीधे पहुंच रहा है Customer
।
क्या कोई मुझे भ्रम को दूर करने में मदद कर सकता है। मैं पिछले 2 दिनों से इस विषय को अंदर आने देने की कोशिश कर रहा हूं, लेकिन यह अभी भी भ्रामक है।