আমি রেলস অ্যান্টিপ্যাটার্নস নামে একটি বই পড়ছি এবং তারা ডেমিটারের আইন ভঙ্গ না করার জন্য প্রতিনিধিদের ব্যবহার করার বিষয়ে কথা বলছে talk এখানে তাদের প্রধান উদাহরণ:
তারা বিশ্বাস করে যে কন্ট্রোলারে এই জাতীয় কিছু কল করা খারাপ (এবং আমি সম্মত)
@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
থাকলেও এই কোডটি এখনও ডেমিটারের আইন লঙ্ঘন করে।
এখন পেপারবয় সংগ্রহে_মনি পদ্ধতিতে, আমাদের কাছে দুটি বিন্দু নেই, কেবল আমাদের "গ্রাহক.ক্যাশ" আছে have এই প্রতিনিধি দল কি আমাদের সমস্যার সমাধান করেছে? একেবারেই না. যদি আমরা আচরণটি দেখি তবে একটি কাগজপোকুই নগদ আউট পাওয়ার জন্য সরাসরি কোনও গ্রাহকের মানিব্যাগের কাছে পৌঁছে যাচ্ছে।
সম্পাদনা
আমি সম্পূর্ণরূপে বুঝতে পারি এবং সম্মত হয়েছি যে এটি এখনও লঙ্ঘন এবং আমি Wallet
আমার কাছে অর্থ প্রদানের ব্যবস্থা করে এবং আমাকে Customer
ক্লাসের অভ্যন্তরে সেই পদ্ধতিটি কল করা উচিত বলে প্রত্যাহারের নামে একটি পদ্ধতি তৈরি করতে হবে । আমি যা পাই না তা হ'ল এই প্রক্রিয়া অনুসারে, আমার প্রথম উদাহরণটি এখনও ডেমিটারের আইন লঙ্ঘন করে কারণ Invoice
এখনও Customer
রাস্তাটি পেতে সরাসরি প্রবেশ করছে।
কেউ কি আমাকে বিভ্রান্তি দূর করতে সাহায্য করতে পারে? আমি গত 2 দিন ধরে এই বিষয়টিকে ডুবে যাওয়ার চেষ্টা করছি, তবে এটি এখনও বিভ্রান্তিকর।