পটভূমি: আমি একটি বার্তা কাঠামো বিকাশ করছি। এই কাঠামোটি অনুমতি দেবে:
- একটি সার্ভিস বাসের মাধ্যমে বার্তা প্রেরণ
- বার্তা বাসে সারি সাবস্ক্রাইব
- একটি বার্তা বাসে বিষয় সাবস্ক্রাইব করা
আমরা বর্তমানে র্যাবিট এমকিউ ব্যবহার করছি, তবে আমি জানি আমরা খুব অদূর ভবিষ্যতে মাইক্রোসফ্ট সার্ভিস বাসে (প্রিমিসে) চলে যাব।
আমি ইন্টারফেস এবং বাস্তবায়নগুলির একটি সেট তৈরি করার পরিকল্পনা করছি যাতে আমরা যখন সার্ভিস-এ চলে যাই তখন ক্লায়েন্ট কোডের (যেমন প্রকাশক বা গ্রাহক) কোনও সংশোধন না করে আমার কেবল নতুন বাস্তবায়ন সরবরাহ করা দরকার।
এখানে সমস্যাটি হ'ল রাবিট এমকিউ এবং সার্ভিসবাস সরাসরি অনুবাদযোগ্য নয়। উদাহরণস্বরূপ, রাব্বিটএমকিউ এক্সচেঞ্জ এবং বিষয়বস্তুর নামগুলির উপর নির্ভর করে, যেখানে সার্ভিসবাস সবই নেমস্পেস এবং কুইজের বিষয়ে। এছাড়াও, সার্ভিস ক্লায়েন্ট এবং রাবিটএমকিউ ক্লায়েন্টের মধ্যে কোনও সাধারণ ইন্টারফেস নেই (উদাহরণস্বরূপ উভয়ের আইকনেকশন থাকতে পারে তবে ইন্টারফেসটি আলাদা - কোনও সাধারণ নামস্থান থেকে নয়)।
সুতরাং আমার বক্তব্য, আমি নিম্নলিখিত হিসাবে একটি ইন্টারফেস তৈরি করতে পারেন:
public interface IMessageReceiver{
void AddSubscription(ISubscription subscriptionDetails)
}
দুটি প্রযুক্তির অ-অনুবাদযোগ্য বৈশিষ্ট্যগুলির কারণে, উপরের ইন্টারফেসের সার্ভিসবাস এবং রাবিট এমকিউ বাস্তবায়নের আলাদা আলাদা প্রয়োজনীয়তা রয়েছে। সুতরাং IMessageReceiver এর আমার RabbitMq বাস্তবায়নটি দেখতে দেখতে এটি দেখতে পারে:
public void AddSubscription(ISubscription subscriptionDetails){
if(!subscriptionDetails is RabbitMqSubscriptionDetails){
// I have a problem!
}
}
আমার কাছে, উপরের লাইনটি লিসকোভের বিকল্প ব্যবস্থার বিধি ভঙ্গ করেছে।
আমি এটিকে ঘুরিয়ে ফেলার কথা বিবেচনা করেছি, যাতে সাবস্ক্রিপশনটি একটি আইসেসেজ সংযোগ গ্রহণ করে, তবে আবার রাব্বিটম্যাক সাবস্ক্রিপশনের জন্য একটি রেবিট এমকিউমেসেজ সংযোগের নির্দিষ্ট বৈশিষ্ট্য প্রয়োজন।
সুতরাং, আমার প্রশ্নগুলি হ'ল:
- আমি কি ঠিক করছি যে এটি এলএসপিকে ব্রেক করে?
- আমরা কি একমত যে কিছু ক্ষেত্রে এটি অনিবার্য, বা, আমি কিছু মিস করছি?
আশা করি, এটি স্পষ্ট এবং বিষয়টিতে!
interface IMessageReceiver<T extends ISubscription>{void AddSubscription(T subscriptionDetails); }
। একটি বাস্তবায়ন তখন public class RabbitMqMessageReceiver implements IMessageReceiver<RabbitMqSubscriptionDetails> { public void AddSubscription(RabbitMqSubscriptionDetails subscriptionDetails){} }
(জাভাতে) মতো দেখতে পেত ।
interface TestInterface<T extends ISubscription>
পরিষ্কারভাবে যোগাযোগ করবে যে কোন ধরণের গৃহীত হয় এবং বাস্তবায়নের মধ্যে পার্থক্য রয়েছে।