ব্রিজ ডিজাইনের ধরণটি কোনও প্রোগ্রামের ইন্টারফেস থেকে বাস্তবায়নকে পৃথক করে।
কেন এই সুবিধাজনক?
ব্রিজ ডিজাইনের ধরণটি কোনও প্রোগ্রামের ইন্টারফেস থেকে বাস্তবায়নকে পৃথক করে।
কেন এই সুবিধাজনক?
উত্তর:
এটি আপনাকে ইন্টারফেসের স্বাধীনভাবে বাস্তবায়ন পরিবর্তন করতে দেয়। এটি প্রয়োজনীয় পরিবর্তনগুলি মোকাবেলায় সহায়তা করে।
ক্লাসিক উদাহরণটি সিস্টেমের বাকী অংশটি পরিবর্তন না করেই আরও বড়, আরও ভাল, দ্রুত, ছোট, বা অন্যথায় ভিন্ন কিছু দিয়ে একটি স্টোরেজ বাস্তবায়নকে প্রতিস্থাপন করা হয়।
ড্যানিয়েলের জবাব ছাড়াও পলিমারফিজমের মত ধারণার মাধ্যমে বাস্তবায়ন থেকে ইন্টারফেসকে পৃথক করা আপনাকে একই ইন্টারফেসের একাধিক বাস্তবায়ন তৈরি করতে দেয় যা বিভিন্ন উপায়ে একই কাজ করে।
উদাহরণস্বরূপ, প্রচুর ভাষার মানক গ্রন্থাগারের কোথাও একটি স্ট্রিমের ধারণা রয়েছে । একটি স্ট্রিম এমন কিছু যা সিরিয়াল অ্যাক্সেসের জন্য ডেটা ধারণ করে। এর দুটি বুনিয়াদি ক্রিয়াকলাপ রয়েছে: পড়ুন (স্ট্রিম থেকে পরবর্তী এক্স সংখ্যাটি বাইট লোড করুন) এবং লিখুন (স্ট্রমে ডেটা বাইটের এক্স সংখ্যা যুক্ত করুন) এবং কখনও কখনও তৃতীয়টি সন্ধান করুন (স্রোতের "বর্তমান অবস্থান" পুনরায় সেট করুন) একটি নতুন জায়গায়)।
এটি একটি সহজ যথেষ্ট ধারণা, তবে আপনি এটি দিয়ে কী করতে পারেন তার সমস্ত বিষয় চিন্তা করুন। সর্বাধিক সুস্পষ্ট একটি হ'ল ডিস্কে থাকা ফাইলগুলির সাথে যোগাযোগ করা। একটি ফাইল স্ট্রিম আপনাকে কোনও ফাইল থেকে ডেটা পড়তে বা এটিতে লিখতে দেয়। তবে আপনি যদি এর পরিবর্তে কোনও নেটওয়ার্ক সংযোগের মাধ্যমে ডেটা প্রেরণ করতে চান?
আপনি যদি সরাসরি বাস্তবায়নের উপর নির্ভর করে থাকেন তবে আপনাকে একই ফাইল কোনও ফাইলে সংরক্ষণ করতে বা এটি নেটওয়ার্কে প্রেরণ করতে দুটি সম্পূর্ণ ভিন্ন রুটিন লিখতে হবে। তবে আপনার যদি একটি স্ট্রিম ইন্টারফেস থাকে, আপনি এটির দুটি পৃথক বাস্তবায়ন তৈরি করতে পারেন ( FileStream
এবং NetworkStream
) যে তথ্যটি যেখানে যেতে হবে সেগুলি প্রেরণের নির্দিষ্ট বিশদটি সজ্জিত করে এবং তারপরে আপনাকে কেবল কোডটি লিখতে হবে যা একবার ফাইল সংরক্ষণের সাথে সম্পর্কিত হয় write । হঠাৎ আপনার SaveToFile
এবং SendOverNetwork
রুটিনগুলি অনেক সরল: তারা কেবল উপযুক্ত ধরণের স্ট্রিম সেট আপ করে এটি SaveData
রুটিনে প্রেরণ করে , যা একটি স্ট্রিম ইন্টারফেস গ্রহণ করে - যতক্ষণ না এটি সম্পাদন করতে পারে ততক্ষণ কী প্রকারের যত্নের প্রয়োজন নেই it অপারেশন লিখুন - এবং স্ট্রিমায় ডেটা সংরক্ষণ করে।
এর অর্থ হ'ল যদি আপনার ডেটা ফর্ম্যাট পরিবর্তন হয় তবে আপনাকে এটি একাধিক ভিন্ন জায়গায় পরিবর্তন করতে হবে না। যদি আপনি কোনও স্ট্রিম গ্রহণ করে এমন একটি রুটিনে আপনার ডেটা সেভিং কোডটিকে কেন্দ্রীভূত করেন, তবে এটিই কেবলমাত্র একমাত্র জায়গা যা এটি আপডেট করা দরকার, সুতরাং যখন আপনি উভয়ই পরিবর্তন করার প্রয়োজন হবে তখন আপনি ঘটনাক্রমে কেবলমাত্র একটি জায়গা পরিবর্তন করে কোনও বাগ প্রবর্তন করতে পারবেন না। সুতরাং প্রয়োগগুলি থেকে ইন্টারফেসগুলি পৃথক করা এবং পলিমারফিজম ব্যবহার করে এমন কোড তৈরি করে যা পড়তে ও বুঝতে সহজতর হয় এবং এতে বাগের সম্ভাবনাও কম থাকে।
IStream
ইন্টারফেস দিয়ে শুরু করেন , আপনাকে প্রতিটি স্ট্রিমের জন্য কার্যকারিতার পুরো সেটটি পুনরায় উদ্ভাবন করতে হবে। তবে যদি আপনি একটি বেস বিমূর্ত স্ট্রিম শ্রেণি দিয়ে শুরু করেন তবে এটি সমস্ত সাধারণ অবস্থা এবং কার্যকারিতা ধরে রাখতে পারে এবং তারপরে বংশধরদের স্বতন্ত্র বৈশিষ্ট্যগুলি প্রয়োগ করতে দেয়।
এগুলি সম্পর্কিত হলেও আপনার এখানে দুটি খুব আলাদা প্রশ্ন রয়েছে।
শিরোনামের মধ্যে আরও সাধারণ প্রশ্নটি হ'ল আপনি কেন সাধারণভাবে প্রয়োগ থেকে ইন্টারফেসকে আলাদা করবেন। দ্বিতীয় প্রশ্নটি কেন সেতুর প্যাটার্নটি কার্যকর। সেগুলি সম্পর্কিত কারণ ব্রিজ প্যাটার্নটি প্রয়োগকরণ থেকে ইন্টারফেসকে আলাদা করার একটি নির্দিষ্ট উপায়, এর কিছু নির্দিষ্ট পরিণতিও রয়েছে।
সাধারণ প্রোগ্রামটি প্রতিটি প্রোগ্রামারকে বোঝার জন্য গুরুত্বপূর্ণ কিছু। এটি যা প্রোগ্রামে পরিবর্তনগুলি সর্বত্র প্রচার থেকে বাধা দেয়। আমি এগুলি ব্যবহার না করেই মানুষ প্রোগ্রাম করতে সক্ষম তা কল্পনা করতে পারি না।
আপনি যখন কোনও প্রোগ্রামিং ভাষায় একটি সাধারণ সংযোজন বিবৃতি লিখেন, এটি ইতিমধ্যে একটি বিমূর্ততা, (যদিও এটি অপারেটর ওভারলোডিং ম্যাট্রিক বা অন্য কিছু যুক্ত করতে ব্যবহার করছে না) যা শেষ পর্যন্ত কার্যকর হওয়ার আগে বেশ কয়েকটি অন্যান্য কোডের মধ্য দিয়ে যায় আপনার কম্পিউটারের একটি সার্কিটে। যদি প্রয়োগটি (মেশিন কোডের একগুচ্ছ) থেকে ইন্টারফেসের (যেমন "3 + 5") বিভাজন না ঘটে, তবে প্রতিবার প্রয়োগ পরিবর্তন হওয়ার সাথে সাথে আপনাকে নিজের কোডটি পরিবর্তন করতে হবে (যেমন আপনি একটি চালনাতে চেয়েছিলেন নতুন প্রসেসর)।
এমনকি একটি সাধারণ সিআরইউডি প্রয়োগের মধ্যেও প্রতিটি পদ্ধতির স্বাক্ষর একটি বিস্তৃত অর্থে, এটির প্রয়োগের ইন্টারফেস।
এই সমস্ত বিমূর্তকরণের একই মূল লক্ষ্য রয়েছে - কলিং কোডটি সম্ভবত এটি সম্ভবত সবচেয়ে বিমূর্তে অভিপ্রায় ব্যক্ত করুন যা প্রয়োগকারীকে প্রয়োজনীয় তথ্য প্রদান করে। এটি তাদের মধ্যে ন্যূনতম সম্ভাব্য সংযোজন সরবরাহ করে এবং কোডটি যতটা সম্ভব পরিবর্তন করা দরকার তখন রিপল প্রভাবকে সীমাবদ্ধ করে।
এটি সোজা মনে হয়, তবে বাস্তবে এটি জটিল হয়ে যায়।
ব্রিজ প্যাটার্নটি প্রয়োগের কিছু বিটকে ইন্টারফেসগুলিতে আলাদা করার একটি নির্দিষ্ট উপায়। বিন্যাসের চেয়ে শ্রেণির চিত্রটি আরও তথ্যবহুল। এটি ব্রিজের চেয়ে প্লাগেবল মডিউলগুলি রাখার মতো, তবে তারা এটিটির নাম দিয়েছে ব্রিজ কারণ এটি প্রায়শই ব্যবহৃত হয় যেখানে ইন্টারফেসের আগে মডিউলগুলি তৈরি করা হয়েছিল। সুতরাং অনুরূপ বিদ্যমান বাস্তবায়নের জন্য একটি সাধারণ ইন্টারফেস তৈরি করে "ব্রিজ" পার্থক্যটি সাজান এবং আপনাকে কোডটি প্রয়োগের সাথে কাজ করার অনুমতি দেয়।
সুতরাং, বলুন যে আপনি একটি ওয়ার্ড প্রসেসরের একটি অ্যাড-অন লিখতে চেয়েছিলেন, তবে আপনি এটি একাধিক ওয়ার্ড প্রসেসরের উপর কাজ করতে চান। আপনি এমন একটি ইন্টারফেস তৈরি করতে পারেন যা আপনার প্রয়োজনীয় ওয়ার্ড প্রসেসর ভিত্তিক কার্যকারিতা বাদ দেয় (এবং প্রতিটি শব্দ প্রসেসরের মাধ্যমে এটি কার্যকর করতে হবে কারণ আপনি সেগুলি পরিবর্তন করতে পারবেন না), এবং প্রতিটি ওয়ার্ড প্রসেসরের জন্য আপনি যে শব্দটি সমর্থন করতে চান সেই ইন্টারফেসের একজন প্রয়োগকারী। তারপরে আপনার অ্যাপ্লিকেশন সেই ইন্টারফেসটিকে কল করতে পারে এবং প্রতিটি ওয়ার্ড প্রসেসরের বিশদ সম্পর্কে চিন্তা না করে।
এটি আসলে তার থেকে কিছুটা বিশদভাবে বিস্তৃত, কারণ প্রতিটি শ্রেণিই সত্যই শ্রেণীর শ্রেণিবিন্যাস হতে পারে (সুতরাং, কেবল একটি বিমূর্ত ওয়ার্ড প্রসেসর নাও হতে পারে, তবে একটি বিমূর্ত নথি, বিমূর্ত পাঠ্য নির্বাচন ইত্যাদি রয়েছে যার প্রতিটি ক্ষেত্রে কংক্রিট বাস্তবায়ন রয়েছে), তবে এটি একই ধারণা।
এটি কিছুটা ফ্যাসিডের মতো, এক্ষেত্রে অ্যাবস্ট্রাকশন স্তরটি একাধিক অন্তর্নিহিত সিস্টেমগুলিতে একই ইন্টারফেস সরবরাহ করার দিকে দৃষ্টি নিবদ্ধ করে।
এটি নিয়ন্ত্রণের বিপরীতার সাথে সম্পর্কিত, যেহেতু কংক্রিট প্রয়োগকারীকে পদ্ধতি বা নির্মাতাদের কাছে পাঠানো হবে এবং ডাকা প্রকৃত বাস্তবায়ন নির্ধারণ করবে।