আপনি কি OOP (অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং) এর সম্পূর্ণ শক্তি ব্যবহার করছেন নাকি আপনি মিস করছেন?
আপনি যদি কোনো বস্তুর ধরনের উপর ভিত্তি করে সিদ্ধান্ত নিচ্ছেন তাহলে আপনি একটি গুরুত্বপূর্ণ OOP বৈশিষ্ট্য মিস করছেন:পলিমরফিজম।
টাইপ ডিসিশন সাধারণত কেস স্টেটমেন্টের মধ্যেই করা হয় (যা OO ফ্রেন্ডলি নয়) এবং এই প্রবন্ধে আপনি শিখবেন কিভাবে সেগুলো সরিয়ে আরও ভালো কোড লিখতে হয়।
প্রকার পরীক্ষা করা হচ্ছে
আমি আপনাকে একটি উদাহরণ দেখিয়ে শুরু করি যেখানে আমরা বহুরূপতার সুবিধা গ্রহণ করি না।
আমরা "রক, কাগজ, কাঁচি" গেমটি বাস্তবায়ন করতে চাই এবং আমরা একটি Game
রাখার সিদ্ধান্ত নিয়েছি ক্লাস এবং প্রতিটি সম্ভাব্য পদক্ষেপের জন্য একটি ক্লাস।
একজন বিজয়ীকে চেক করতে আমরা একটি play
বাস্তবায়ন করতে যাচ্ছি Game
এ পদ্ধতি :
class Game def self.play(move1, move2) return :tie if move1 ==move2 move1.wins_against?(move2) endend
এবং এখানে একটি চাল (অন্যরা একই প্যাটার্ন অনুসরণ করে):
class Rock def wins_against?(other_move) কেস other_move যখন কাগজ তারপর মিথ্যা হলে কাঁচি তারপর সত্যিকারের শেষে শেষ হয়
এখন আমরা play
কল করতে পারি দুটি চাল সহ পদ্ধতি এবং আমরা জানতে পারব প্রথম পদক্ষেপটি জিতলে।
p Game.play(Rock.new, Paper.new)# মিথ্যা
ঠিক আছে, এটি কাজ করছে, কিন্তু আমরা কি আরও ভাল করতে পারি? আমরা কি সেই কুৎসিত কেস স্টেটমেন্ট থেকে পরিত্রাণ পেতে পারি?
টাইপ চেকিংয়ের পরিবর্তে পলিমরফিজম
হ্যাঁ! আমরা OOP মৌলিক ব্যবহার করে টাইপ-চেকিং কেস স্টেটমেন্ট থেকে মুক্তি পেতে পারি।
ধারণাটি হল এই সত্যটি ব্যবহার করা যে আমরা বর্তমান শ্রেণীকে জানি অন্য আন্দোলনের বস্তুকে জিজ্ঞাসা করতে যে এটি আমাদের মারতে পারে কিনা।
এবং আমরা একটি পদ্ধতির নাম ব্যবহার করতে যাচ্ছি যা আমাদের ক্লাসের জন্য নির্দিষ্ট (Rock
এর জন্য পদ্ধতির নাম হতে পারে:do_you_beat_rock?
)
রুবিতে, পলিমরফিজম হল বস্তুর ক্লাস চেক না করেই যেকোন বস্তুতে যেকোন মেথড কল (যা বার্তা হিসাবেও পরিচিত, OOP ভাষায়) পাঠানোর ক্ষমতা। এটি "হাঁস টাইপিং" নামেও পরিচিত, কিন্তু আমি এই শব্দটি পছন্দ করি না 🙂
জাভাতে (এক সেকেন্ডের জন্য আমার সাথে সহ্য করুন...), আপনার কাছে "ইন্টারফেস" নামে কিছু আছে যা আপনাকে কম্পাইলার স্তরে একটি ক্লাস দ্বারা প্রয়োগ করা পদ্ধতিগুলির একটি সেট জোর করতে দেয়৷
রুবিতে আমাদের এটি নেই (সম্ভবত আরও ভাল করার জন্য), তাই আপনাকে পরীক্ষার উপর নির্ভর করতে হবে।
এই নতুন বাস্তবায়ন কেমন দেখাচ্ছে তার একটি কোড উদাহরণ দেখা যাক:
<প্রি>ক্লাস রক ডিফ জয়ের_বিরুদ্ধ?(অন্য_চালনা) other_move.do_you_beat_rock? শেষ def do_you_beat_paper? মিথ্যা শেষ def do_you_beat_scissors? সত্যিকারের সমাপ্তিকেস স্টেটমেন্ট কিভাবে চলে গেছে লক্ষ্য করুন। এটি একটি একক পদ্ধতি কল এবং দুটি পদ্ধতির সংজ্ঞা দ্বারা প্রতিস্থাপিত হয়েছে৷
৷আপডেট করুন :কিছু পাঠক যেমন মন্তব্য করেছেন, আমি লক্ষ্য করিনি যে এই প্যাটার্নটি বাস্তবায়ন করার সময় যুক্তিটি বিপরীত হয়। ড্যানিয়েল পি. ক্লার্কের একটি প্রস্তাবিত সমাধান হল শুধুমাত্র
play
-এ অর্ডারটি ফ্লিপ করাmove2.wins_against?(move1)
করার পদ্ধতি .
এটা কি অনেক বেশি পরিচ্ছন্ন নয়? আপনি কি মনে করেন?
আরো একটি পদক্ষেপ!
এখন ধরা যাক আপনি একটি নতুন পদক্ষেপ যোগ করতে চান। আপনাকে কি পরিবর্তন করতে হবে?
এক মিনিটের জন্য এটি সম্পর্কে চিন্তা করুন...
কেস স্টেটমেন্ট পদ্ধতির সাথে আপনাকে প্রতিটি পদক্ষেপে একটি নতুন শাখা যোগ করতে হবে। লক্ষ্য করুন যে আপনি নতুন কার্যকারিতা প্রবর্তনের জন্য একটি নিখুঁতভাবে কাজ করার পদ্ধতি পরিবর্তন করতে "বাধ্য" হয়েছেন৷
৷কিন্তু এটি আমাদের আরো OOP ভিত্তিক সংস্করণের সাথে একটি সমস্যা নয়। আমাদের যা করতে হবে তা হল নতুন পদ্ধতি যোগ করা। এটি হল খোলা/বন্ধ নীতি (সলিড-এ "O") কর্মে।
আরেকটি বিকল্প হতে পারে মেটাপ্রোগ্রামিং ব্যবহার করা (method_missing
সহ অথবা define_method
)।
আমি কি আসলে এর জন্য মেটাপ্রোগ্রামিং ব্যবহার করব?
সম্ভবত না, যতক্ষণ না চালগুলির সংখ্যা ক্রমাগত পরিবর্তিত হচ্ছে, বা একটি বড় সংখ্যক চালনা আছে৷
মেটাপ্রোগ্রামিং করার জন্য একটি খরচ আছে, এটি একটি রূপালী বুলেট নয় যেমন কিছু লোক বিশ্বাস করতে পারে। আপনি একটু অতিরিক্ত নমনীয়তার জন্য পারফরম্যান্স এবং পঠনযোগ্যতা ট্রেড করবেন।
উপসংহার
এই নিবন্ধে আপনি শিখেছেন যে আপনার শ্রেণীর প্রকারগুলি পরীক্ষা করার জন্য কেস স্টেটমেন্ট ব্যবহার করা এড়ানো উচিত . পরিবর্তে, আপনার পলিমরফিজম এর সুবিধা নেওয়া উচিত .
এটি আপনাকে আরও ভাল কোড তৈরি করতে সাহায্য করবে যা বিদ্যমান কোড পরিবর্তন করার পরিবর্তে নতুন কোড যোগ করে বাড়ানো যেতে পারে। এখন আপনার পদক্ষেপ নেওয়ার এবং কিছু রিফ্যাক্টরিং করার পালা 🙂
Btw এর মানে এই নয় যে আমি আপনার টুলবক্স থেকে কেস স্টেটমেন্ট সম্পূর্ণরূপে পরিত্রাণ পাওয়ার পরামর্শ দিচ্ছি, কিন্তু যখনই আপনি নিজেকে লিখছেন তখন আপনার সতর্ক হওয়া উচিত। নিশ্চিত করুন যে এটি সমস্যার সর্বোত্তম সমাধান।
এই নিবন্ধটি শেয়ার করতে ভুলবেন না আপনি যদি চান যে আমি এই ধরনের নিবন্ধ লিখতে থাকি!