নিম্নলিখিত দুটি কারণে ওওপিতে নির্ভরতা পরিচালনা একটি বড় সমস্যা:
- ডেটা এবং কোডের আঁটসাঁট মিলন।
- পার্শ্ব প্রতিক্রিয়া সর্বব্যাপী ব্যবহার।
বেশিরভাগ ওও প্রোগ্রামাররা ডেটা এবং কোডের টান সংযোগকে পুরোপুরি উপকারী বলে মনে করেন, তবে এটি ব্যয় সহ আসে। স্তরগুলির মাধ্যমে ডেটা প্রবাহ পরিচালনা করা যে কোনও দৃষ্টান্তে প্রোগ্রামিংয়ের একটি অনিবার্য অংশ। আপনার ডেটা এবং কোড সংযুক্ত করে অতিরিক্ত সমস্যা যুক্ত করে যে আপনি যদি একটি নির্দিষ্ট সময়ে কোনও ফাংশন ব্যবহার করতে চান তবে আপনাকে তার পয়েন্টটি তার বিন্দুতে পেতে একটি উপায় খুঁজে বের করতে হবে।
পার্শ্ব প্রতিক্রিয়া ব্যবহার অনুরূপ অসুবিধা সৃষ্টি করে। আপনি যদি কিছু কার্যকারিতার জন্য পার্শ্ব প্রতিক্রিয়া ব্যবহার করেন তবে এর বাস্তবায়নটি অদলবদল করতে সক্ষম হতে চান তবে সেই নির্ভরতা ইনজেকশন ছাড়া আপনার কাছে অন্য কোনও বিকল্প নেই।
একটি স্প্যামার প্রোগ্রামের উদাহরণ হিসাবে বিবেচনা করুন যা ইমেল ঠিকানাগুলির জন্য ওয়েব পৃষ্ঠাগুলি স্ক্র্যাপ করে তাদের ইমেল করে। আপনার যদি ডিআই মানসিকতা থাকে তবে এই মুহুর্তে আপনি সেই পরিষেবাগুলির কথা ভাবছেন যা আপনি ইন্টারফেসের পিছনে আবদ্ধ করবেন এবং কোন পরিষেবাগুলি কোথায় ইনজেকশন পাবেন। আমি সেই নকশাটি পাঠকের জন্য অনুশীলন হিসাবে ছেড়ে দেব। আপনার যদি কোনও এফপি মানসিকতা থাকে, এখনই আপনি ফাংশনগুলির সর্বনিম্ন স্তরের ইনপুট এবং আউটপুটগুলির কথা ভাবছেন, যেমন:
- কোনও ওয়েব পৃষ্ঠার ঠিকানা ইনপুট করুন, সেই পৃষ্ঠার পাঠ্যটিকে আউটপুট দিন।
- কোনও পৃষ্ঠার পাঠ্য ইনপুট করুন, সেই পৃষ্ঠা থেকে লিঙ্কগুলির একটি তালিকা আউটপুট করুন।
- কোনও পৃষ্ঠার পাঠ্য ইনপুট করুন, সেই পৃষ্ঠায় ইমেল ঠিকানাগুলির একটি তালিকা আউটপুট করুন।
- ইমেল ঠিকানাগুলির একটি তালিকা ইনপুট করুন, নকল মুছে ফেলা সহ ইমেল ঠিকানার একটি তালিকা আউটপুট করুন।
- একটি ইমেল ঠিকানা ইনপুট করুন, সেই ঠিকানার জন্য একটি স্প্যাম ইমেল আউটপুট করুন।
- একটি স্প্যাম ইমেল ইনপুট করুন, এই ইমেলটি প্রেরণের জন্য SMTP কমান্ডগুলি আউটপুট করুন।
আপনি যখন ইনপুট এবং আউটপুটগুলির ক্ষেত্রে ভাবেন, কোনও কার্য নির্ভরতা নেই, কেবলমাত্র ডেটা নির্ভরতা। এটাই তাদের ইউনিট পরীক্ষায় এত সহজ করে তোলে। আপনার পরবর্তী স্তর আপ একটি ফাংশন আউটপুট পরবর্তী ইনপুট মধ্যে খাওয়ানোর ব্যবস্থা করে, এবং প্রয়োজন হিসাবে বিভিন্ন বাস্তবায়নের সহজেই পরিবর্তন করতে পারেন।
খুব প্রকৃত অর্থে, কার্যকরী প্রোগ্রামিং স্বাভাবিকভাবেই আপনাকে আপনার ফাংশন নির্ভরতাগুলি সর্বদা উল্টে ফেলার জন্য উত্সাহ দেয় এবং তাই সাধারণত আপনাকে সত্যের পরে আর কোনও বিশেষ ব্যবস্থা নিতে হয় না। আপনি যখন করেন, উচ্চ-অর্ডার ফাংশন, বন্ধকরণ এবং আংশিক প্রয়োগের মতো সরঞ্জামগুলি কম বয়লারপ্লেট দিয়ে সম্পাদন করা আরও সহজ করে তোলে।
মনে রাখবেন যে এটি নির্ভরশীলতা নয় যা সমস্যাযুক্ত। এটি নির্ভরতা যা ভুল পথে নির্দেশ করে। পরবর্তী স্তরটির মতো একটি ফাংশন থাকতে পারে:
processText = spamToSMTP . emailAddressToSpam . removeEmailDups . textToEmailAddresses
এই স্তরের পক্ষে নির্ভরযোগ্যতাগুলি এইভাবে হার্ড-কোডেড হওয়া পুরোপুরি ঠিক আছে কারণ এর একমাত্র উদ্দেশ্য নিম্ন-স্তর ফাংশনগুলি একসাথে আঠালো করা। একটি বাস্তবায়ন অদলবদল করা অন্যরকম রচনা তৈরি করার মতোই সহজ:
processTextFancy = spamToSMTP . emailAddressToFancySpam . removeEmailDups . textToEmailAddresses
পার্শ্ব প্রতিক্রিয়াগুলির অভাবের ফলে এই সহজ পুনরায় সাজানো সম্ভব হয়েছে। নিম্ন স্তরের ফাংশন একে অপরের থেকে সম্পূর্ণ স্বতন্ত্র। পরবর্তী স্তর আপ চয়ন করতে পারে processText
আসলে কিছু ব্যবহারকারীর কনফিগারেশনের উপর ভিত্তি করে ব্যবহৃত হয়:
actuallyUsedProcessText = if (config == "Fancy") then processTextFancy else processText
আবার কোনও সমস্যা নয় কারণ সমস্ত নির্ভরতা এক দিক নির্দেশ করে। সেগুলি একইভাবে নির্দেশ করার জন্য আমাদের কিছু নির্ভরতা উল্টে দেওয়ার দরকার নেই, কারণ খাঁটি ফাংশনগুলি ইতিমধ্যে আমাদের তা করতে বাধ্য করেছিল।
নোট করুন যে config
শীর্ষে এটি যাচাই করার পরিবর্তে আপনি নীচের স্তরে নেমে গিয়ে আরও অনেক কিছু তৈরি করতে পারেন । এফপি আপনাকে এটি করতে বাধা দেয় না, আপনি চেষ্টা করলে এটি আরও অনেক বিরক্তিকর হয়ে ওঠে।