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

নিরাপদ মানকি-প্যাচিং: কোড বিভ্রান্তি এড়াতে ৩টি টেকনিক

মানকি প্যাচিং। রুবি প্রথম ট্রাই করার সময়, এটা বিস্ময়কর লাগে। আপনি কোর ক্লাসগুলোর মধ্যে মেথড যোগ করতে পারেন! আপনাকে Time.now.advance(days: -1) কল করতে হবে না, আপনি লিখতে পারেন 1.day.ago! এটা রুবি পড়া এবং লেখায় আনন্দদায়ক করে। যতক্ষণ...

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

আপনি বিভ্রান্ত হয়েন যেন কোন কোড আসলে রান হয়েছে, তাই ব্রেক হলে ডিবাগ করতে পারেন না।

এবং আপনি ভাবেন যে আপনার সকল সমস্যার কারণ ছিল ছয় মাস আগে, যখন আপনি Enumerable-কে মানকি-প্যাচ করেছেন শুধু এক লাইন কোড পাঁচ ক্যারেক্টার ছোট করার জন্য।

তবে বিকল্প কী? কোনো সুবিধা নেই? কোড যেন GroupableArray.new([1, 2, 3, 4]).in_groups_of(2) এর মত見える? blank? কোর রুবি-তে আসার জন্য অপেক্ষা করবেন তারপর নাইস ইউজার ইনপুট হ্যান্ডলিং পাবেন?

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

মডিউলে রাখুন

একটি ক্লাস মানকি-প্যাচ করার সময়, শুধু ক্লাসটি রি-ওপেন করে আপনার প্যাচ ঠেলে দেবেন না:

class DateTime def weekday? !sunday? && !saturday? end end

কেন না?

  • যদি দুটি লাইব্রেরি একই মেথড মানকি-প্যাচ করে, তবে আপনি বুঝতে পারবেন না।

    প্রথম মানকি-প্যাচটি ওভাররাইট হয়ে যাবে এবং চিরকালের জন্য হারিয়ে যাবে।

  • যদি এরর হয়, তবে এটা যেন DateTime-এর ভিতরে হয়েছে তা দেখাবে।

    তکنিক্যালি সঠিক হলেও, এটা সেটা সহায়ক নয়।

  • আপনার মানকি প্যাচ বন্ধ করা কঠিন।

    আপনাকে পুরো প্যাচ কমেন্ট আউট করতে হবে, অথবা মানকি প্যাচ ফাইলটি রিকোয়ার না করার মাধ্যমে কোড রান করতে হবে।

  • যদি আপনি, বলে, এই মানকি প্যাচ রান করার আগে require 'date' ভুলে যান, তবে আপনি অজান্তে DateTime-কে রিডিফাইন করবেন প্যাচ করার বদলে।

বদলে, আপনার মানকি প্যাচগুলো একটি মডিউলে রাখুন:

module CoreExtensions module DateTime module BusinessDays def weekday? !sunday? && !saturday? end end end end

এভাবে, আপনি সম্পর্কিত মানকি প্যাচগুলো একসাথে সংগঠিত করতে পারেন। এরর হলে, সমস্যা যে কোড থেকে আসছে সেটা স্পষ্ট হয়। এবং আপনি সেগুলো এক এক গ্রুপ করে ইনক্লুড করতে পারেন:

# আসলে DateTime কে মানকি-প্যাচ করুন DateTime.include CoreExtensions::DateTime::BusinessDays

আপনি যদি প্যাচটি আর না চান, শুধু সেই লাইনটি কমেন্ট আউট করুন।

সেগুলো একসাথে রাখুন

যখন আপনি কোর ক্লাসগুলোর মানকি প্যাচ করেন, আপনি কোর রুবি এপিআই-র সাথে যোগ করছেন। কোর প্যাচ থাকা প্রতিটি অ্যাপ্লিকেশন একটু ভিন্ন অনুভূতি দেয়। তাই আপনার কাছে একটি উপায় থাকতে হবে যাতে নতুন কোডবেসে ঢুকলে আপনি দ্রুত সেই পরিবর্তনগুলো শিখতে পারেন। আপনাকে জানতে হবে আপনার মানকি প্যাচগুলো কোথায় থাকে।

আমি অধিকাংশ রেইলসের মানকি-প্যাচিং কনভেনশন ফলো করি। প্যাচগুলো যাবে lib/core_extensions/class_name/group.rb-এ। তাই এই প্যাচ:

module CoreExtensions module DateTime module BusinessDays def weekday? !sunday? && !saturday? end end end end

যাবে lib/core_extensions/date_time/business_days.rb-এ।

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

এজ কেসগুলো চিন্তা করুন

আমি না জানি কেন Enumerable-এ sum মেথড নেই। অনেক সময় ইচ্ছা হয় [1, 2, 3].sum, অথবা ["a", "b", "c"].sum, অথবা [Article.new, Article.new, Article.new].sum লিখতে... ওহ।

যখন আপনি একটি ক্লাস মানকি-প্যাচ করেন, সাধারণত একটা জিনিস আপনার মনে থাকে যা সহজ করতে চান। আপনি নম্বরের সম গণনা করতে চান, কিন্তু ভুলে যান অ্যারে অন্য জিনিসও ধারণ করতে পারে।

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

এটা হ্যান্ডেল করার কয়েকটি উপায় আছে। সেরা থেকে খারাপ পর্যন্ত:

  • অনাকাঙ্ক্ষিত ইনপুট যুক্তিসঙ্গতভাবে হ্যান্ডেল করুন।

    এটা ভালো কাজ করে যদি আপনার প্যাচ স্ট্রিংসের সাথে কাজ করে। আপনি почти যেকোনো জিনিস থেকে যুক্তিসঙ্গত কিছু পেতে পারেন যদি প্রথমে to_s কল করেন। এবং Confident Ruby আপনাকে বিভিন্ন ধরণের ইনপুট হ্যান্ডেল করার অনেক উপায় শিখাবে।

  • এররটি আরও স্পষ্টভাবে হ্যান্ডেল করুন।

    এটা সadece অপ্রত্যাশিত ইনপুট দেখলে ভালো মেসেজের সাথে ArgumentError থ্রো করা হতে পারে। র‍্যান্ডম NoMethodError-এর ওপর নির্ভর করবেন না।

  • কমেন্টে আপনার আশা করা ইনপুটের টাইপ ডকুমেন্ট করুন।

    পূর্বের দুটি অপশন ভালো, যদি ব্যবহার করতে পারেন। কিন্তু আপনি যদি আপনার প্যাচের ভিতরে এজ কেস চেক না कर পারেন, তবে কমপক্ষে সেগুলো ডকুমেন্ট করুন। যাতে, একবার আপনার কলার বুঝতে পারলে যে তাদের সমস্যা আপনার প্যাচের কারণে, তারা বুঝতে পারবে আপনি কী করতে চেয়েছিলেন।

আমার সবসময়ের প্রিয় মানকি প্যাচ

শেষে, আমি আপনাকে আমার সবসময়ের প্রিয় মানকি প্যাচ দিয়ে ছেড়ে যাচ্ছি: Hash#string_merge:

lib/core_extensions/hash/merging.rb
module CoreExtensions module Hash module Merging def string_merge(other_hash, separator = " ") merge(other_hash) {|key, old, new| old.to_s + separator + new.to_s} end end end end {}.string_merge({:class => "btn"}) # => {:class=>"btn"} h = {:class => "btn"} # => {:class=>"btn"} h.string_merge({:class => "btn-primary"}) # => {:class=>"btn btn-primary"}

এটা এইচটিএমএল এলিমেন্টে সিএসএস ক্লাস আটকে দেওয়া খুব সুন্দর করে দেয়।

বিবেচনাপূর্ণ মানকি প্যাচিং

কোর ক্লাস মানকি-প্যাচ করা সব খারাপ নয়। আপনি ভালো করলে, আপনার কোড আরও রুবি-মত হয়। তবে রুবির যেকোনো ধারালো এজের মত, আপনি যখন সেগুলো ব্যবহার করেন, অতিরিক্ত সতর্কতা অবশ্যক।

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

আপনি আজ পর্যন্ত সবচেয়ে ভালো মানকি প্যাচ আপনি কী লিখেছেন (বা দেখেছেন)? কমেন্টে জানান, আমি শুনতে চাই!

  1. পাসওয়ার্ড-সুরক্ষিত কম্পিউটার নিরাপদে আনলক করার ৩ সহজ ধাপ

  2. রিসেট ডিস্ক ছাড়া উইন্ডোজ ৭ পাসওয়ার্ড রিসেট করার ৩টি বিশ্বস্ত পদ্ধতি

  3. ওয়ার্ড ছাড়া এক্সেলেই মেইল মার্জ করুন: ২ কার্যকর VBA পদ্ধতি

  4. Windows 11 ফ্যাক্টরি রিসেট করার তিনটি নিশ্চিত পদ্ধতি - ডেটা রক্ষা করে