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

রোবাস্টনেস প্রিন্সিপ্যাল দিয়ে রুবি কোডের নির্ভরযোগ্য বাড়ান

এই আইডিয়াগুলো আমি Confident Ruby বই থেকে শিখেছিলাম, আমার সবচেয়ে পছন্দের রুবি বই। এই পোস্ট পছন্দ হলে বইটি কিনে পুরো পড়ুন। এখানে খুব ভালো কন্টেন্ট আছে।

আপনার current_user মেথড User রিটার্ন করে, বাদে ইউজার না থাকলে nil রিটার্ন করে। search মেথড Array রিটার্ন করে, বাদে শুধু একটা রেজাল্ট থাকলে সেটা সরাসরি রিটার্ন করে। লগিক্যাল লাগছে, হয়তো সুবিধাজনকও!

তবে শীঘ্রই এই সিদ্ধান্তগুলো আপনার কোডকে if স্টেটমেন্টের পাহাড়ের নিচে দাফন করবে। হয় if kind_of? সব জায়গায় ছড়িয়ে পড়ে। অথবা সব জায়গায় nil চেক করতে বাধ্য হবেন। অথবা বদতর, নতুন ফিচার শিপ করার সাথে সাথে NoMethodError দেখাবে। অনুমান করুন আরেকটা হটফিক্সের সময়!

এটা প্রতিরোধ করার উপায় আছে, এবং সেটা মাত্র একটু চিন্তাশীলতা দিয়ে।

রোবাস্টনেস প্রিন্সিপ্যাল

কম্পিউটিং-এ একটি প্রিন্সিপ্যাল আছে যা বলে,

আপনি যা করুন সেটা কনজারভেটিভ হোন, অন্যদের থেকে যা গ্রহণ করুন সেটা লিবারেল হোন।

এই প্রিন্সিপ্যাল আপনার রুবি মেথডগুলোতে প্রয়োগ করা যায়। আপনার লিখা মেথডগুলো যুক্তিসঙ্গত ইনপুট গ্রহণ করবে, এবং কনসিস্টেন্ট আউটপুট রিটার্ন করবে।

শেষ পার্টে ফোকাস: কেউ আপনার লিখা মেথড কল করলে, সে সঠিকভাবে জানে সেটা কী রিটার্ন করবে।

আউটপুট নিয়ে চিন্তাশীল হন

রেইলস ২.১-এর ActiveRecord::Errors#on ইমপ্লিমেন্টেশন দেখুন:

# File activerecord/lib/active_record/validations.rb, line 212 def on(attribute) attribute = attribute.to_s return nil unless @errors.has_key?(attribute) errors = @errors[attribute].map(&:to_s) errors.size == 1 ? errors.first : errors end 

কল করলে এটি অথবা Array অব Stringস, অথবা একটা String, অথবা nil রিটার্ন করতে পারে। কলারকে দায়িত্ব দিয়ে দেয়া হয়েছে সেটা বুঝতে যে কোন টাইপের অবজেক্ট পাচ্ছে। এটা খারাপ আইডিয়া:

  • কলারের কোডে অপ্রয়োজনীয় টাইপ-চেকিং ঘুसाয়।

  • কলারের জানতে হয় খুব বেশি যে মেথডটা কল করছে। কমপক্ষে সেটা যেসব টাইপের অবজেক্ট রিটার্ন করতে পারে এবং কখন কোন টাইপ রিটার্ন হবে সেটা জানতে হয়।

  • এজ কেস টেস্ট করার বেশি থাকে। কোড আশা অনুযায়ী কাজ করছে কিনা নিশ্চিত করতে তিনটে সিনেরিও ট্রাই করতে হয়।

আপনার মেথডগুলো রিটার্ন কেসে কনসিস্টেন্ট হওয়া উচিত। যদি সাধারণত Array রিটার্ন করেন, তাহলে সর্বদা Array রিটার্ন করার ব্যবস্থা করুন। যদি সাধারণত User রিটার্ন করেন কিন্তু কখনো nil, তবে Null User অবজেক্ট বানিয়ে সেটা রিটার্ন করুন nil-র বদলে।

আপনি কম স্ট্রিক্টও হতে পারেন: "আমি Taggable মডিউল ইনক্লুড করা কিছু রিটার্ন করব"। অথবা আরও জেনেরিক: "আমি id এবং name অ্যাট্রিবিউট থাকা কিছু রিটার্ন করব"। গুরুত্বপূর্ণ হলো কনসিস্টেন্সি এবং কলারের জানা যে কী এক্সপেক্ট করতে হবে।

jQuery চমৎকার উদাহরণ। অধিকাংশ jQuery মেথড একই টাইপের Array-লাইক অবজেক্ট রিটার্ন করে। এজন্য jQuery মেথডগুলো অবিশ্বাস্যভাবে কম্পোজেবল, এবং এক লাইনে চমৎকার কাজ করা যায়।

আপনার জানার জন্য, রেইলস পরে সেই মেথড ফিক্স করল:

# File activemodel/lib/active_model/errors.rb, line 133 def [](attribute) get(attribute.to_sym) || set(attribute.to_sym, []) end 

এখন সেটা সর্বদা Array রিটার্ন করে। তাদেরও সহজ, আমাদেরও সহজ।

ইনকনসিস্টেন্সি নিশ্চেষ্ট করুন

পরবর্তী بار যখন "একটি Array অথবা nil" রিটার্ন করতে যাবেন, শুধু Array রিটার্ন করুন। কোডবেস চেক করুন কোথায় kind_of? এবং respond_to? ব্যবহার করছেন। সেই কোড যেসব মেথড কল করছে সেগুলো রিফ্যাক্টর করুন যাতে সিঙ্গেল টাইপ রিটার্ন করে।

এবং দেখুন কীভাবে রিটার্ন ভ্যালু নিয়ে আপনার অনুমানগুলো প্রজেক্টে ছড়িয়ে পড়ে আপনার নিকটবর্তী সব কোডকে সরল করে দিচ্ছে।

  1. রুবির grep মেথড মাস্টারিং: কোড উদাহরণসহ একটি ব্যবহারিক গাইড

  2. রুবির Map মেথড মাস্টারিং: উদাহরণসহ একটি ব্যবহারিক গাইড

  3. রুবিতে N-Queens চ্যালেঞ্জ মাস্টারিং: একটি ধাপে ধাপে সমাধান

  4. রুবি কোড উন্নত করুন: ক্লিনার OOP ডিজাইনের জন্য Cohesion & Coupling আয়ত্ত করুন