paint-brush
একটি ইন্টারফেসের কোড: আপনার যা জানা দরকারদ্বারা@oussamamater
482 পড়া
482 পড়া

একটি ইন্টারফেসের কোড: আপনার যা জানা দরকার

দ্বারা Oussama Mater7m2024/06/18
Read on Terminal Reader

অতিদীর্ঘ; পড়তে

"কোড টু একটি ইন্টারফেস" আমার কাছে কখনই বোধগম্য হয়নি। আমি একটি ইন্টারফেস তৈরি করার এবং তারপর এটি বাস্তবায়ন করার প্রয়োজনীয়তা নিয়ে প্রশ্ন করেছি। এই ইন্টারফেসগুলি কখন এবং কোথায় ব্যবহার করতে হবে তা আমি কীভাবে নির্ধারণ করব? আপনি যদি এটির সম্মুখীন হন তবে জেনে রাখুন যে আমরা সবাই সেখানে ছিলাম। আপনাকে কেন "কোড টু ইন্টারফেস" করতে হবে তা বুঝতে সাহায্য করুন।
featured image - একটি ইন্টারফেসের কোড: আপনার যা জানা দরকার
Oussama Mater HackerNoon profile picture

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


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


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

আসুন কিছু কোড লিখি

যেহেতু AI দায়িত্ব নিচ্ছে, এবং প্রত্যেকেই এটি সম্পর্কে তাদের বিষ্ঠা হারাচ্ছে, আমরা পার্টিতে দেরি করতে চাই না। আমরা আমাদের ওয়েবসাইটে এটি যুক্ত করতে চাই, একটি ছোট চ্যাটবট যা আমাদের পণ্য সম্পর্কে প্রশ্নের উত্তর দেয় তা করবে।


আমি আমার উদাহরণের জন্য পিএইচপি ব্যবহার করা হবে; আপনি স্বাচ্ছন্দ্য যে কোনো ভাষা ব্যবহার করতে দ্বিধা বোধ করুন. যা গুরুত্বপূর্ণ তা হল ধারণা।


আমাদের চ্যাটবট এর মতো সহজ হতে পারে:

 <?php class ChatBot { public function ask(string $question): string { $client = new OpenAi(); $response = $client->ask($question); return $response; } }

একটি একক পদ্ধতি আছে ask() , যা OpenAI SDK ব্যবহার করে তাদের API এর সাথে সংযোগ স্থাপন করে, একটি প্রশ্ন উত্থাপন করে এবং তারপর কেবল প্রতিক্রিয়াটি ফেরত দেয়।


আমরা এখন আমাদের চ্যাটবট ব্যবহার শুরু করতে পারি

 $bot = new ChatBot(); $response = $bot->ask('How much is product X'); // The product costs $200.


এখনও অবধি, বাস্তবায়ন ভাল দেখাচ্ছে, এটি প্রত্যাশিত হিসাবে কাজ করছে এবং প্রকল্পটি স্থাপন করা হয়েছে এবং ব্যবহার করা হচ্ছে। কিন্তু, আমরা অস্বীকার করতে পারি না যে আমাদের চ্যাটবট ওপেন এআই API-এর উপর অনেক বেশি নির্ভরশীল; আমি নিশ্চিত আপনি একমত.


এখন, আসুন এমন একটি পরিস্থিতি বিবেচনা করি যেখানে ওপেন এআই দাম দ্বিগুণ হয় এবং বাড়তে থাকে, আমাদের বিকল্পগুলি কী কী? আমরা হয় শুধু আমাদের ভাগ্য স্বীকার করি, অথবা অন্য API সন্ধান করি। প্রথম বিকল্পটি সহজ, আমরা কেবল তাদের অর্থ প্রদান করতে থাকি এবং ২য়টি যতটা সহজ মনে হয় ততটা সহজ নয়। নতুন প্রদানকারীর সম্ভবত নিজস্ব API এবং SDK থাকবে; আমাদেরকে ওপেন এআই-এর জন্য ডিজাইন করা সমস্ত ক্লাস, পরীক্ষা এবং সম্পর্কিত উপাদানগুলির আপডেট করতে হবে, এটি অনেক কাজ।


এটি উদ্বেগও বাড়ায়; যদি নতুন API সঠিকতার পরিপ্রেক্ষিতে আমাদের প্রত্যাশা পূরণ না করে বা ডাউনটাইম বাড়িয়ে দেয়? আমরা যদি একই সাথে বিভিন্ন প্রদানকারীর সাথে পরীক্ষা করতে চাই? উদাহরণস্বরূপ, অতিথিদের জন্য একটি সহজ API ব্যবহার করার সময় ওপেনএআই ক্লায়েন্টের সাথে আমাদের সাবস্ক্রাইব করা ক্লায়েন্টদের প্রদান করছেন? আপনি দেখতে পারেন কিভাবে এই জটিল হতে পারে, এবং আপনি কেন জানেন? কারণ আমাদের কোড খারাপভাবে ডিজাইন করা হয়েছে।


আমাদের দৃষ্টি ছিল না; আমরা শুধু একটি API বাছাই করেছি এবং এটি এবং এর বাস্তবায়নের উপর সম্পূর্ণ নির্ভরশীল ছিলাম। এখন, "কোড টু ইন্টারফেস" নীতিটি আমাদের এই সমস্ত থেকে রক্ষা করত। কিভাবে? দেখা যাক.


একটি ইন্টারফেস তৈরি করে শুরু করা যাক:

 <?php interface AIProvider { public function ask(string $question): string; }


আমরা আমাদের ইন্টারফেস আছে, বা আমি এটি কল করতে চাই, একটি চুক্তি. এর এটি বাস্তবায়ন করা যাক বা এটি কোড.

 <?php class OpenAi implements AIProvider { public function ask(string $question): string { $openAiSdk = new OpenAiSDK(); $response = $openAiSdk->ask($question); return "Open AI says: " . $response; } } class RandomAi implements AIProvider { public function ask(string $question): string { $randomAiSdk = new RandomAiSDK(); $response = $randomAiSdk->send($question); return "Random AI replies: " . $response->getResponse(); } }


বাস্তবে, OpenAiSDK এবং RandomAiSDK উভয়ই কনস্ট্রাক্টরের মাধ্যমে ইনজেকশন করা হবে। এইভাবে, আমরা একটি DI কন্টেইনারে জটিল ইনস্ট্যান্টিয়েশন লজিক অর্পণ করি, একটি ধারণা যা নিয়ন্ত্রণের বিপরীত নামে পরিচিত। এটি কারণ প্রতিটি প্রদানকারীর সাধারণত নির্দিষ্ট কনফিগারেশনের প্রয়োজন হয়।


আমাদের কাছে এখন দুটি সরবরাহকারী রয়েছে যা আমরা প্রশ্নের উত্তর দিতে ব্যবহার করতে পারি। তাদের বাস্তবায়ন নির্বিশেষে, আমরা নিশ্চিত যে যখন একটি প্রশ্ন দেওয়া হয়, তারা তাদের API এর সাথে সংযুক্ত হবে এবং এর উত্তর দেবে। তাদের AIProvider চুক্তি মেনে চলতে হবে।


এখন, আমাদের ChatBot এ, আমরা নিম্নলিখিতগুলি করতে পারি

 class ChatBot { private AIProvider $client; // A dependency can be injected via the constructor public function __construct(AIProvider $client) { $this->client = $client; } // It can also be set via a setter method public function setClient(AIProvider $client): void { $this->client = $client; } public function ask(string $question): string { return $this->client->ask($question); } }


ভালভাবে লক্ষ্য করুন যে উদাহরণের লক্ষ্য হল একাধিক উপায়ে প্রদর্শন করা যে আপনি একটি নির্ভরতা ইনজেকশন করতে পারেন, এই ক্ষেত্রে, একটি AIProvider । আপনাকে কনস্ট্রাক্টর এবং সেটার উভয়ই ব্যবহার করতে হবে না।


আপনি দেখতে পারেন আমরা কিছু পরিবর্তন করেছি; আমরা আর OpenAI এর উপর নির্ভরশীল নই, এবং আপনি এটির কোন রেফারেন্স পাবেন না। পরিবর্তে, আমরা চুক্তি/ইন্টারফেসের উপর নির্ভর করি। এবং, কোনো না কোনোভাবে, আমরা বাস্তব জীবনে এই উদাহরণের সাথে সম্পর্ক করতে পারি; আমরা সবাই অন্তত একবার ChatBot হয়েছি।


একটি সৌর প্যানেল সিস্টেম কেনার কল্পনা করুন। কোম্পানি এটি ইনস্টল করার জন্য প্রযুক্তিবিদদের পাঠানোর প্রতিশ্রুতি দেয়, আপনাকে আশ্বস্ত করে যে তারা যে কর্মচারীকে পাঠান না কেন, কাজটি হয়ে যাবে এবং শেষ পর্যন্ত আপনার প্যানেল ইনস্টল করা হবে। সুতরাং, তারা জোশ বা জর্জ পাঠায় কিনা তা আপনি সত্যিই চিন্তা করবেন না। এগুলি আলাদা হতে পারে, একটি অন্যটির চেয়ে ভাল, তবে উভয়ই প্যানেল ইনস্টল করার জন্য চুক্তিবদ্ধ৷


তারা এমন হবে না, আপনি জানেন যে আমি আপনার টিভি মেরামত করছি তার পরিবর্তে, তারা নির্দিষ্ট কাজ করতে কোম্পানির দ্বারা বাধ্য। RandomAi এবং OpenAi উভয়ই AIProvider এর কর্মচারী হিসেবে কাজ করে; আপনি একটি প্রশ্ন জিজ্ঞাসা করুন, এবং তারা একটি উত্তর প্রদান করবে. আপনি যেমন প্যানেলগুলি কে ইন্সটল করে তা নিয়ে চিন্তা করেননি, তেমনই ChatBot কে কাজটি করে তা নিয়ে মোটেও চিন্তা করা উচিত নয়। এটি কেবলমাত্র জানা দরকার যে প্রদত্ত যে কোনও বাস্তবায়ন এটি করবে।


এখন, আপনি অবাধে এক বা অন্য ব্যবহার করতে পারেন.

 $bot = new ChatBot(); // For subscribed users $bot = new ChatBot(new OpenAi()); $response = $bot->ask('How much is Product X'); // Open AI says: 200$ // For guests $bot->setClient(new RandomAi()); $response = $bot->ask('How much is Product X'); // Random AI replies: 200$

এখন, আপনার সম্পূর্ণ API প্রদানকারী পরিবর্তন করার নমনীয়তা আছে, এবং আপনার কোড সবসময় একই আচরণ করবে। আপনাকে এটি সম্পর্কে কিছু পরিবর্তন করতে হবে না কারণ আপনি একটি ইন্টারফেসে কোড করেছেন , তাই আমরা আগে যে উদ্বেগগুলি উত্থাপন করেছি তার কোনোটিই একটি সমস্যা হবে না৷

বোনাস আছে, সবসময়

আমাদের উদাহরণে, একটি ইন্টারফেসে কোডিং করে, আমরা তিনটি সলিড নীতিকে সম্মান করেছি, এমনকি আমরা না জেনেও, আমাকে বিশদভাবে বলতে দিন।


আমি বিস্তারিত যাবো না; প্রতিটি নীতির একটি দীর্ঘ নিবন্ধ থাকতে পারে। একটি ইন্টারফেসে কোডিং করে আমরা কী অর্জন করেছি তা দেখানোর জন্য এটি একটি সংক্ষিপ্ত ব্যাখ্যা।

খোলা-বন্ধ নীতি

আমরা যে প্রথম নীতিটিকে সম্মান করি সেটি হল ওপেন-ক্লোজড প্রিন্সিপল, যা বলে যে কোডটি এক্সটেনশনের জন্য খোলা এবং পরিবর্তনের জন্য বন্ধ হওয়া উচিত। এটি যতটা চ্যালেঞ্জিং শোনাতে পারে, আপনি এটি অর্জন করেছেন। এটি সম্পর্কে চিন্তা করুন, ChatBot এখন পরিবর্তনের জন্য বন্ধ করা হয়েছে; আমরা আবার কোড স্পর্শ করব না। শুরু থেকেই এটাই ছিল আমাদের লক্ষ্য।


কিন্তু, এটি সম্প্রসারণের জন্য উন্মুক্ত; যদি আমরা একটি 3য়, 4র্থ, এমনকি একটি 5ম প্রদানকারী যোগ করা হয়, কিছুই আমাদের থামাচ্ছে না. আমরা ইন্টারফেস বাস্তবায়ন করতে পারি, এবং আমাদের ক্লাস এটি বাক্সের বাইরে ব্যবহার করতে পারে, কোন পরিবর্তনের প্রয়োজন নেই।

লিসকভ প্রতিস্থাপন

আমি আপনাকে এর সংজ্ঞা দিয়ে বিরক্ত করব না, তবে মূলত, এটি বলে যে আপনি ক্লাসগুলিকে তাদের সমস্ত সাবক্লাসের সাথে প্রতিস্থাপন করতে পারেন এবং এর বিপরীতে। টেকনিক্যালি, আমাদের সমস্ত AI প্রদানকারী are-a AIProvider , এবং তাদের বাস্তবায়ন একে অপরের জন্য অদলবদল করা যেতে পারে, ChatBot সঠিকতাকে প্রভাবিত না করে, পরবর্তীরাও জানে না এটি কোন প্রদানকারীকে ব্যবহার করছে 😂, তাই হ্যাঁ, আমরা মিস লিসকভকে সম্মান করি .

নির্ভরতা বিপরীত

আমাকে অবশ্যই স্বীকার করতে হবে, এটির নিজস্ব নিবন্ধ থাকতে পারে। কিন্তু সহজভাবে বলতে গেলে, নীতিটি বলে যে আপনার কংক্রিটের পরিবর্তে বিমূর্ততার উপর নির্ভর করা উচিত, যা আমরা করছি ঠিক তাই। আমরা একটি প্রদানকারীর উপর নির্ভরশীল, ওপেন এআই এর মত একটি নির্দিষ্ট নয়।


মনে রাখবেন, এই সব, কারণ আমরা একটি ইন্টারফেস কোডিং.

এটি অবশেষে আপনার জন্য ক্লিক করবে

যখনই আপনি এমন একটি ক্লাস আপডেট করেন যা আপনি জানেন যে আপনার আপডেট করা উচিত নয়, এবং আপনার কোড যদি বিবৃতি দিয়ে হ্যাক হয়, আপনার একটি ইন্টারফেস প্রয়োজন। সর্বদা নিজেকে জিজ্ঞাসা করুন, এই শ্রেণীর কি সত্যিই জানতে হবে কিভাবে? আমি কি চিরকাল এই পরিষেবা প্রদানকারীকে ব্যবহার করব? নাকি ডাটাবেস ড্রাইভার? যদি না হয়, আপনি কি জানেন.


এটি বলার সাথে সাথে, এটিকে কিছু সময় দিন, এটি অবশেষে আপনার জন্য ক্লিক করবে