if
এর সেই বিশাল জগাখিচুড়ি বিবৃতি আপনার মুখের দিকে তাকাতে থাকে। আপনি মনে করেন আপনার উচিত এটিকে সরল করতে সক্ষম হবেন, সেই ব্যবসায়িক লজিক ব্যতীত যা পথে চলতে থাকে।
উদাহরণস্বরূপ, বলুন আপনার একটি বিক্রয় প্ল্যাটফর্ম আছে যেখানে আপনি Quote
তৈরি করেন s, যার অনেকগুলি LineItem
আছে s ব্যতীত, আপনি ডুপ্লিকেট লাইন আইটেমগুলির সাথে একটি উদ্ধৃতি পেতে পারেন যদি সেগুলি বিজ্ঞাপন হয় , কিন্তু যদি আপনার একাধিক ওয়েবসাইট থাকে , আপনাকে একসাথে মূল্য যোগ করতে হবে এবং এটি একটি একক লাইন আইটেম হিসাবে দেখাতে হবে। ওহ এবং এছাড়াও, আপনি যদি একটি ওয়েবসাইট কিনে থাকেন এবং ইতিমধ্যেই আপনার উদ্ধৃতিতে পাঁচটি বিজ্ঞাপন থাকে, তাহলে আপনাকে ওয়েবসাইটটিতে তাদের 20% ছাড় দিতে হবে।
আমি শুনতে পাচ্ছি আপনি আপনার ল্যাপটপটি জানালা দিয়ে ছুড়ে মারছেন এখান থেকে।
আপনি পারতে একগুচ্ছ if
লিখুন এই নিয়মগুলি পরিচালনা করার জন্য বিবৃতি:
class Quote
attr_accessor :line_items
...
def add_line_item(line_item)
if line_item.kind_of?(Ad)
self.line_items << line_item
elsif line_item.kind_of?(Website)
if @line_items.select {|item| item.kind_of?(Ad) }.length >= 5
# TODO: Put the fractions of a cent into a bank account
# I have set up
line_item.price *= 0.8
end
existing_website = self.line_items.detect { |item| item.kind_of?(Website) }
if existing_website
existing_website.price += line_item.price
else
self.line_items << line_item
end
end
end
end
তবে আমি মনে করি আমরা একমত হতে পারি যে এটি কেবল ভয়ঙ্কর। আপনি কীভাবে এমন কিছুকে মুক্ত করতে পারেন?
আপনি পদ্ধতিটিকে ছোট ছোট পদ্ধতির একটি গুচ্ছে পচিয়ে দিতে পারেন, তবে এটি আপনার পায়খানার সমস্ত খেলনা ঢেলে দেওয়ার মতো যাতে আপনার মা মনে করেন আপনি আপনার ঘর পরিষ্কার করেছেন। এবং সেগুলি kind_of?
s এখনও আমাকে অনেক বিরক্ত করবে।
কিন্তু আপনি যদি লাইন আইটেম থেকে জিনিস দেখতে শুরু করেন তাহলে কী হবে দৃষ্টিকোণ, উদ্ধৃতির পরিবর্তে? যদি জিজ্ঞাসা করা এর পরিবর্তে আপনি কি ধরনের লাইন আইটেম নিয়ে কাজ করছেন এবং উদ্ধৃতিতে এটি যোগ করছেন, আপনি শুধু বললেন নিজেকে যোগ করার জন্য লাইন আইটেম উদ্ধৃতি?
আপনার পদ্ধতিগুলো বিপরীত করুন!
রিফ্যাক্টর কোড করার আমার প্রিয় উপায়গুলির মধ্যে একটি হল কলার এবং কলকারীকে বিপরীত করার চেষ্টা করা৷ উপরের কোডটি ব্যবহার করে এখানে একটি উদাহরণ দেওয়া হল:
class Quote
...
def add_line_item(line_item)
line_item.add_to_quote(self)
end
end
class Ad < LineItem
...
def add_to_quote(quote)
quote.line_items << self
end
end
class Website < LineItem
def add_to_quote(quote)
if quote.line_items.select {|item| item.kind_of?(Ad) }.length >= 5
# TODO: Put the fractions of a cent into a bank account
# I have set up
self.price *= 0.8
end
existing_website = quote.line_items.detect { |item| item.kind_of?(Website) }
if existing_website
existing_website.price += self.price
else
quote.line_items << self
end
end
end
এটা নিখুঁত নয়। website.rb
এখনও অনেক প্রয়োজন রিফ্যাক্টরিং সাহায্যের জন্য, এবং পদ্ধতিগুলিকে কীভাবে উল্টানো line_items
-এর এনক্যাপসুলেশন ভেঙে দিয়েছে তাতে আমি খুশি নই .
কিন্তু আপনি জটিলতার প্রথম স্তরটি সরিয়ে ফেলেছেন। আপনি এখন LineItem
-এ কোড রাখতে পারেন বা Quote
, যেখানে এটি সবচেয়ে অর্থপূর্ণ হয় তার উপর নির্ভর করে। LineItem
বস্তুগুলি প্রতিটি LineItem
-এর মধ্যে মিল এবং পার্থক্যগুলি পরিচালনা করতে উত্তরাধিকার এবং মিশ্রণ ব্যবহার করতে পারে উপশ্রেণী এছাড়াও, নতুন LineItem
যোগ করা এখন সত্যিই সহজ আপনার add_line_item
bloating ছাড়াই সাবক্লাস পদ্ধতি।
আপনার কোড একটু ক্লিনার, এবং অনেক বেশি নমনীয়। সুতরাং সাধারণত, আমি এটিকে একটি জয় বলব৷৷
যেখানে আপনি এই প্যাটার্নটি ব্যবহার করতে চান না
বিপরীত পদ্ধতি হিসাবে দরকারী হল, এমন কিছু কারণ রয়েছে যার কারণে আপনি এই প্যাটার্নটি ব্যবহার করতে চান না:
-
এটি এনক্যাপসুলেশন ভেঙ্গে দিতে পারে। আপনাকে
৷Quote
-এ বৈশিষ্ট্যগুলি প্রকাশ করতে হতে পারে আপত্তি যা আপনি প্রকাশ্যে প্রকাশ করতে চাননি৷ -
এটি কাপলিং বাড়াতে পারে৷৷ উভয়ই
Quote
এবংAd
এখন একে অপরের সম্পর্কে জানতে হবে। এবং কতটা কতটা তার উপর নির্ভর করে তাদের একে অপরের সম্পর্কে জানতে হবে, এটি আপনার কোডকে আরো করতে পারে জটিল। -
এটি
Ad
-এ একক দায়িত্ব নীতি লঙ্ঘন করতে পারে , কারণ এখনAd
কিভাবে নিজেকে একটিQuote
এ যোগ করতে হয় তা জানার দায়িত্ব রয়েছে .
আপনি সাধারণত এই সমস্যাগুলি সমাধান করতে পারেন। কিন্তু আপনার সেগুলি সম্পর্কে সচেতন হওয়া উচিত, কারণ আপনি রিফ্যাক্টরিং আপনার কোডকে খারাপ করতে চান না
এটি কেন আমার পছন্দের একটি
এমনকি সেই সমস্যাগুলির মধ্যেও, এটি আমার প্রিয় রিফ্যাক্টরিংগুলির মধ্যে একটি। এই প্যাটার্নটি ব্যবহার করার পরে আমি যে কোডটি লিখি তা আরও পরিষ্কার এবং আরও আত্মবিশ্বাসী হতে থাকে।
কিন্তু তা না হলেও, এই প্যাটার্নটি ব্যবহার করা আমাকে আমার বস্তুর মধ্যে সম্পর্কগুলিকে অন্যভাবে ভাবতে বাধ্য করে৷ যখন আমি "এই বৈশিষ্ট্যটি ভয়ানক, আমি বিশ্বাস করতে পারি না যে এটি পরিচালনা করার জন্য আমাকে এই ভয়ানক কোডটি লিখতে হবে" রুট, এটি আমার মস্তিষ্ককে নতুন উপায়গুলি দেখার জন্য লাথি দেয় যে আমি সেই সমস্যাগুলি সমাধান করতে পারি। এটি আমাকে ভাবতে বাধ্য করে কিভাবে আমি আমার কোডকে ভিন্নভাবে গঠন করতে পারি, এবং এটি অবিশ্বাস্যভাবে দরকারী।
আপনার নিজের কোডে একবার চেষ্টা করে দেখুন
আমার অনেক প্রিয় প্যাটার্নের মত, আমি প্রথম বিপরীত পদ্ধতি দেখেছিলাম Smalltalk বেস্ট প্র্যাকটিস প্যাটার্নে, এবং তখন থেকেই এটি একটি মূল্যবান টুল।
পরের বার একটু ভিন্ন আচরণের অনুরূপ বস্তুর সাথে মোকাবিলা করতে আপনার কঠিন সময় হবে, একবার চেষ্টা করে দেখুন! আপনি যদি নতুন কোডটি ভাল পছন্দ করেন তবে এটি রাখুন। আপনি না করলেও, এটি আপনার মনকে এমন একটি পথে নিয়ে যাবে যা আপনাকে আরও ভাল কোডের দিকে নিয়ে যাবে৷