কম্পিউটার টিউটোরিয়াল

জটিল কোড সরল করুন: স্প্যাগেটি কোড ম্যানেজ করার নতুন দৃষ্টিভঙ্গি

দানবকায় `if` স্টেটমেন্টের ঝুঁকি আপনাকে তাকিয়ে আছে। আপনি মনে করছেন সরল করা উচিত, কিন্তু সেই Business Logic আড়ালে আটকে যাচ্ছে।

উদাহরণস্বরূপ, একটি সেলস প্ল্যাটফর্ম যেখানে `Quote` বানান, যাতে অনেক `LineItem` থাকে। কিন্তু, ডুপ্লিকেট লাইন আইটেম থাকতে পারে যদি সেগুলো ad হয়, কিন্তু একাধিক website হলে প্রাইস যোগ করে একটা লাইন আইটেম হিসেবে দেখাতে হবে। ও হ্যাঁ, যদি কেউ website কিনে এবং তার কোটে ইতিমধ্যে পাঁচটা ad থাকে, তবে website-এ ২০% ডিসকাউন্ট দিতে হবে।

এখান থেকে ল্যাপটপ উইন্ডোয়ের বাইরে নেমে দাওয়ার শব্দ শুনছি।

আপনি 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?গুলো মনে মনে বিরক্ত করত।

তবে কী হয় যদি আপনি কোটের পর্সপেক্টিভের বদলে লাইন আইটেমের পর্সপেক্টিভ থেকে চিন্তা করা শুরু করেন? যদি पूছেন না কী টাইপের লাইন আইটেম, বরং বলেন লাইন আইটেমকে নিজের আপনাকে কোটে যোগ করতে?

আপনার মেথডগুলো উল্টে দিন!

কোড রিফ্যাক্টর করার আমার পছন্দের উপায়ের একটা: কলার এবং ক্যালিকে উল্টে দিয়ে ট্রাই করা। উপরের কোড ব্যবহার করে উদাহরণ:

app/models/quote.rb
class Quote ... def add_line_item(line_item) line_item.add_to_quote(self) end end 
app/models/line_item.rb
class Ad < LineItem ... def add_to_quote(quote) quote.line_items << self end end 
app/models/website.rb
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 সাবক্লাস যোগ করা এখন খুব সহজ, `add_line_item` মেথড ব্লোট করবে না।

আপনার কোড একটু ক্লিনার, এবং অনেক বেশি ফ্লেক্সিবল। সাধারণত, আমি এটা উইন বলব।

যেখানে এই প্যাটার্ন ব্যবহার না করাই ভালো

রিভার্সিং মেথড যতই উপকারী হোক, কিছু কারণ আছে এই প্যাটার্ন ব্যবহার না করার:

  • এনক্যাপসুলেশন ভাঙতে পারে। `Quote` অবজেক্টের যেসব অ্যাট্রিবিউট এক্সপোজ করতে নো চোসিলে সেগুলো পাবলিক এক্সপোজ করতে হয়।

  • কাপলিং বাড়াতে পারে। `Quote` এবং `Ad` দুটোই একে অপরের সম্পর্কে জানতে হবে। এবং কতটুকু জানতে হবে সেটার ওপর নির্ভর করে কোড আরও জটিল হতে পারে।

  • `Ad`-এ সিঙ্গল রেসপন্সিবিলিটি প্রিন্সিপ্যাল লঙ্ঘন করতে পারে, কারণ এখন `Ad`-র দায়িত্ব আছে নিজের আপনাকে `Quote`-এ কীভাবে যোগ করবেন সেটা জানা।

এই সমস্যায় معمولত ওয়ার্কআরাউন্ড করা যায়। কিন্তু এগো চোখ রাখুন, কারণ রিফ্যাক্টরিং কোডকে খারাপ করতে দিবেন না!

এটা আমার ফেভারিটের একটা কেন

এই সমস্যা থাকলেও, এটা আমার পছন্দের রিফ্যাক্টরিংয়ের একটা। এই প্যাটার্ন ইউজ করে যে কোড লিখি সেটা ক্লিয়ারার এবং বেশি কনফিডেন্ট।

তবুও যখন সেটা হয় না, এই প্যাটার্ন ব্যবহার করলে আমাকে আমার অবজেক্টগুলোর রিলেশনশিপ ভিন্নভাবে চিন্তা করতে বাধ্য করে। "এই ফিচার ভয়ংকর, আশ्चর্য এই ভয়ংকর কোড লিখতে হচ্ছে" - এই রুটে পড়লে, এটা ব্রেইনকে নতুন সমাধানের পথে ধাক্কা দেয়। এটা আমাকে বাধ্য করে ভিন্নভাবে কোড স্ট্রাকচার করার চিন্তা করার জন্য, এবং এটা অবিশ্বাস্যভাবে উপকারী।

নিজের কোডে ট্রাই করুন

আমার অনেক পছন্দের প্যাটার্নের মত, Reversing Method প্রথম পেয়েছিলাম Smalltalk Best Practice Patterns-এ, এবং তখন থেকে ইটার ভ্যালুয়েবল টুল।

পরবর্তীবার সিমিলার অবজেক্ট যেগুলোর আচরণ একটু ভিন্ন, সেগুলো হ্যান্ডেল করতে সমস্যা হলে ট্রাই করুন! নতুন কোড ভালো লাগলে রাখুন। না লাগলেও, এটা আপনার মাইন্ডকে ভালো কোডের পথে নিয়ে যাবে।

  1. আইফোন পাসকোড পরিবর্তন করার পদ্ধতি

  2. RuboCop দিয়ে রুবি কোড কোয়ালিটি উন্নত: লিন্টিং ও অটো-ফরম্যাটিং

  3. টার্মিনাল কমান্ড দিয়ে macOS নোটিফিকেশন ব্যানার ডিউরেশন কাস্টমাইজ করুন

  4. ইন্টারনেট এক্সপ্লোরার ৮–১১-এ সোর্স কোড এডিটর পরিবর্তন করার পদ্ধতি