কল্পনা করুন যে আপনাকে অন্য কারও কোড ব্যবহার করতে হবে যা নীচের মত দেখানো হয়েছে:
class Messy {
String concat(String param, String str) { /* ... */ }
boolean contains(String param, String s) { /* ... */ }
boolean isEmpty(String param) { /* ... */ }
boolean matches(String param, String regex) { /* ... */ }
boolean startsWith(String param, String prefix) { /* ... */ }
}
এখন কল্পনা করুন আপনি খুঁজে পেতে পারেন যে আপনার কোড যা এর উপর নির্ভর করে তা নীচের মত দেখাচ্ছে:
String process(String param) {
Messy messy = new Messy();
if (messy.contains(param, "whatever")) {
return messy.concat(param, "-contains");
}
if (messy.isEmpty(param)) {
return messy.concat(param, "-empty");
}
if (messy.matches(param, "[whatever]")) {
return messy.concat(param, "-matches");
}
if (messy.startsWith(param, "whatever")) {
return messy.concat(param, "-startsWith");
}
return messy.concat(param, "-whatever");
// WTF do I really need to repeat bloody "param" 9 times above?
}
... এবং এটি যে আপনি কেবলমাত্র আপনার অ্যাপ্লিকেশনটির জন্য প্রয়োজন নেই এমন পরামিতিগুলির পুনরাবৃত্তিমূলক ব্যবহার থেকে পরিত্রাণ পেতে বিশেষতঃ এটি ব্যবহার করা সহজ করতে চান।
ঠিক আছে, সুতরাং আপনি একটি দুর্নীতি বিরোধী স্তর তৈরি শুরু করুন।
প্রথম জিনিসটি আপনার "মূল কোড" Messy
সরাসরি না বোঝায় তা নিশ্চিত করা। উদাহরণস্বরূপ, আপনি নির্ভরতা পরিচালনার ব্যবস্থা এমনভাবে করেন যাতে অ্যাক্সেসের চেষ্টা Messy
করা সংকলন করতে ব্যর্থ হয়।
দ্বিতীয়ত, আপনি একটি উত্সর্গীকৃত "স্তর" মডিউল তৈরি করেন যা কেবলমাত্র একমাত্র অ্যাক্সেস করে Messy
এবং আপনার "মূল কোড" এ এমনভাবে প্রকাশ করে যা আপনাকে বোঝায়।
স্তর কোড নীচের মত দেখতে হবে:
class Reasonable { // anti-corruption layer
String param;
Messy messy = new Messy();
Reasonable(String param) {
this.param = param;
}
String concat(String str) { return messy.concat(param, str); }
boolean contains(String s) { return messy.contains(param, s); }
boolean isEmpty() { return messy.isEmpty(param); }
boolean matches(String regex) { return messy.matches(param, regex); }
boolean startsWith(String prefix) { return messy.startsWith(param, prefix); }
}
ফলস্বরূপ, আপনার "মূল কোড" এর পরিবর্তে, নীচে Messy
ব্যবহার করে বিভ্রান্ত হয় না Reasonable
:
String process(String param) {
Reasonable reasonable = new Reasonable(param);
// single use of "param" above and voila, you're free
if (reasonable.contains("whatever")) {
return reasonable.concat("-contains");
}
if (reasonable.isEmpty()) {
return reasonable.concat("-empty");
}
if (reasonable.matches("[whatever]")) {
return reasonable.concat("-matches");
}
if (reasonable.startsWith("whatever")) {
return reasonable.concat("-startsWith");
}
return reasonable.concat("-whatever");
}
দ্রষ্টব্য যে এখানে এখনও কিছুটা গোলমাল সৃষ্টি Messy
হচ্ছে তবে এটি এখন Reasonable
" অভ্যন্তরীনভাবে " লুকিয়ে আছে আপনার "মূল কোড "টিকে পরিষ্কারভাবে এবং দুর্নীতিমুক্ত করতে হবে যা স্টাফের সরাসরি ব্যবহারের মাধ্যমে সেখানে আনা হবে Messy
।
উপরের উদাহরণটি কীভাবে সি 2 উইকিতে অ্যান্টি দুর্নীতি স্তর ব্যাখ্যা করা হয়েছে তার উপর ভিত্তি করে :
যদি আপনার অ্যাপ্লিকেশনটির কোনও ডেটাবেস বা অন্য কোনও অ্যাপ্লিকেশন যার সাথে মডেলটি অনাকাঙ্ক্ষিত বা আপনার নিজের অ্যাপ্লিকেশনের মধ্যে থাকা মডেলটির জন্য অপ্রয়োজনীয়, তার সাথে যোগাযোগ করতে হয়, তবে সেই মডেলটি এবং আপনার থেকে অনুবাদ করতে একটি অ্যান্টিক্র্যাশন লায়ার ব্যবহার করুন।
দ্রষ্টব্য উদাহরণটি ইচ্ছাকৃতভাবে সহজ এবং সংক্ষিপ্ত করে ব্যাখ্যা সংক্ষিপ্ত রাখতে রাখা হয়েছে।
আপনার কাছে দুর্নীতি দমন স্তরটির পিছনে messাকতে যদি বৃহত্তর মেস-অফ-এপিআই থাকে, তবে একই পদ্ধতির প্রয়োগ হয়: প্রথমে নিশ্চিত হয়ে নিন যে আপনার "মূল কোড "টি দূষিত স্টাফগুলিতে সরাসরি এবং দ্বিতীয়টি অ্যাক্সেস না করে , এটি এমনভাবে প্রকাশ করুন যা আরও বেশি আপনার ব্যবহারের প্রসঙ্গে সুবিধাজনক।
উপরের সরলীকৃত উদাহরণের বাইরে আপনার স্তরটিকে "স্কেলিং" করার সময়, আপনার এপিআইকে সুবিধাজনক করে তোলা কোনও তুচ্ছ কাজ নয় account আপনার স্তরটিকে সঠিকভাবে ডিজাইনের জন্য একটি প্রচেষ্টা বিনিয়োগ করুন , ইউনিট পরীক্ষাগুলির মাধ্যমে এর উদ্দেশ্য ব্যবহারটি যাচাই করুন etc.
অন্য কথায়, নিশ্চিত হয়ে নিন যে আপনার এপিআই হ'ল লুকিয়ে থাকাগুলির চেয়ে প্রকৃতই উন্নতি , নিশ্চিত হয়ে নিন যে আপনি কেবল দুর্নীতির অন্য স্তরটি প্রবর্তন করছেন না।
সম্পূর্ণতার জন্য, এটি এবং সম্পর্কিত নিদর্শন অ্যাডাপ্টার এবং সম্মুখের মধ্যে সূক্ষ্ম তবে গুরুত্বপূর্ণ পার্থক্যটি লক্ষ্য করুন । যেমন এর নাম দ্বারা ইঙ্গিত করা হয়েছে, বিরোধী দুর্নীতি স্তর ধরে নিচ্ছে যে অন্তর্নিহিত এপিআইতে মানের সমস্যা রয়েছে ("" দুর্নীতিগ্রস্থ ")) এবং উল্লিখিত সমস্যাগুলির সুরক্ষা দেওয়ার ইচ্ছা করে।
আপনি এটি এইভাবে ভাবতে পারেন: আপনি যদি প্রমাণ করতে পারেন যে লাইব্রেরি ডিজাইনারের Reasonable
পরিবর্তে এর কার্যকারিতাটি প্রকাশ করা আরও ভাল Messy
হবে তবে এর অর্থ হ'ল আপনি দুর্নীতি স্তরে কাজ করছেন, তাদের কাজ করছেন , তাদের ডিজাইনের ভুলগুলি সংশোধন করছেন ।
এর বিপরীতে, অ্যাডাপ্টার এবং ফ্যাসাদ অন্তর্নিহিত নকশার মানের উপর অনুমান করে না। এগুলি এপিআইতে প্রয়োগ করা যেতে পারে যা এটি আপনার নির্দিষ্ট প্রয়োজনের জন্য খাপ খাইয়ে শুরু করার জন্য ডিজাইন করা হয়েছে।
প্রকৃতপক্ষে, এটি আরও বেশি উত্পাদনশীল হতে পারে যে এডাপ্টার এবং ফ্যাসাদের মতো নিদর্শনগুলি অন্তর্নিহিত কোডটি ভালভাবে ডিজাইন করা আশা করে expect আপনি এটি এইভাবে ভাবতে পারেন: ভালভাবে নকশিত কোডটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে টুইঙ্ক করা খুব বেশি কঠিন হওয়া উচিত নয়। যদি এটি প্রমাণিত হয় যে আপনার অ্যাডাপ্টারের ডিজাইনটি প্রত্যাশার চেয়ে বেশি পরিশ্রম করে, এটি নির্দেশ করতে পারে যে অন্তর্নিহিত কোডটি ভাল, কোনওভাবে "দূষিত"। সেক্ষেত্রে আপনি কাজটি আলাদা আলাদা পর্যায়ে বিভক্ত করার বিষয়টি বিবেচনা করতে পারেন: প্রথমে, সঠিকভাবে কাঠামোগত উপায়ে অন্তর্নিহিত এপিআই উপস্থাপনের জন্য একটি অ্যান্টি-দুর্নীতি স্তর স্থাপন করুন এবং তারপরে, আপনার সুরক্ষা স্তরটির উপরে আপনার অ্যাডাপ্টার / ফোকাসটি ডিজাইন করুন।