দুর্নীতি দমন স্তর কী এবং এটি কীভাবে ব্যবহৃত হয়?


151

আমি দুর্নীতি দমন স্তরটির অর্থ কী তা বোঝার চেষ্টা করছি। আমি জানি যে এটি উত্তরাধিকারের কোড বা খারাপ এপিআই এর চারপাশে স্থানান্তর / কাজ করার একটি উপায়। আমি যা বুঝতে পারি না তা হ'ল এটি কীভাবে কাজ করে এবং কী এটিকে অনাকাঙ্ক্ষিত স্তর থেকে পরিষ্কার বিচ্ছিন্ন করে তোলে।

আমি কিছু অনুসন্ধান করেছি, তবে আমি কোনও সাধারণ উদাহরণ বা ব্যাখ্যা খুঁজে পাচ্ছি না, তাই আমি এমন কোনও ব্যক্তির সন্ধান করছি যিনি এটি বোঝে এবং সাধারণ উদাহরণ দিয়ে ব্যাখ্যা করতে পারেন। আমার প্রশ্নের সন্তুষ্ট করতে পারে এমন একটি উত্তর সহজ হওয়া উচিত (অগত্যা সংক্ষিপ্ত নয়) এবং বাস্তবায়ন এবং ব্যবহারের বোধগম্য উদাহরণ সরবরাহ করতে হবে।

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

উত্তর:


147

কল্পনা করুন যে আপনাকে অন্য কারও কোড ব্যবহার করতে হবে যা নীচের মত দেখানো হয়েছে:

    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?
}

... এবং এটি যে আপনি কেবলমাত্র আপনার অ্যাপ্লিকেশনটির জন্য প্রয়োজন নেই এমন পরামিতিগুলির পুনরাবৃত্তিমূলক ব্যবহার থেকে পরিত্রাণ পেতে বিশেষতঃ এটি ব্যবহার করা সহজ করতে চান।

ঠিক আছে, সুতরাং আপনি একটি দুর্নীতি বিরোধী স্তর তৈরি শুরু করুন।

  1. প্রথম জিনিসটি আপনার "মূল কোড" Messyসরাসরি না বোঝায় তা নিশ্চিত করা। উদাহরণস্বরূপ, আপনি নির্ভরতা পরিচালনার ব্যবস্থা এমনভাবে করেন যাতে অ্যাক্সেসের চেষ্টা Messyকরা সংকলন করতে ব্যর্থ হয়।

  2. দ্বিতীয়ত, আপনি একটি উত্সর্গীকৃত "স্তর" মডিউল তৈরি করেন যা কেবলমাত্র একমাত্র অ্যাক্সেস করে 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 আপনি এটি এইভাবে ভাবতে পারেন: ভালভাবে নকশিত কোডটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে টুইঙ্ক করা খুব বেশি কঠিন হওয়া উচিত নয়। যদি এটি প্রমাণিত হয় যে আপনার অ্যাডাপ্টারের ডিজাইনটি প্রত্যাশার চেয়ে বেশি পরিশ্রম করে, এটি নির্দেশ করতে পারে যে অন্তর্নিহিত কোডটি ভাল, কোনওভাবে "দূষিত"। সেক্ষেত্রে আপনি কাজটি আলাদা আলাদা পর্যায়ে বিভক্ত করার বিষয়টি বিবেচনা করতে পারেন: প্রথমে, সঠিকভাবে কাঠামোগত উপায়ে অন্তর্নিহিত এপিআই উপস্থাপনের জন্য একটি অ্যান্টি-দুর্নীতি স্তর স্থাপন করুন এবং তারপরে, আপনার সুরক্ষা স্তরটির উপরে আপনার অ্যাডাপ্টার / ফোকাসটি ডিজাইন করুন।


1
নির্ভরশীল এপিআই ক্লাসের পুরো কাঠামো থাকলে এই স্কেলটি কীভাবে হয়? এটি কী এখনও স্তরটি প্রয়োগ করে বাকি স্তরটিকে অ্যাপ্লিকেশনটির সুরক্ষা দেয়?
12

1
@Knownasilya যে একটি খুব ভাল প্রশ্ন, উত্তর ঠিকানাটি প্রসারিত
মশা

4
In other words, make sure that your API is indeed an improvement over one it hides, make sure that you don't just introduce another layer of corruption.পুরো বিভাগটি একটি সাহসী ট্যাগের উপযুক্ত।
লিলিয়েনথাল

19
দুর্নীতিবিরোধী স্তরগুলি নিম্নমানের API এর সাথে ডিল করার জন্য কিছুই করার নয়। তারা ধারণামূলক অমিলের সাথে মোকাবিলা করার বিষয়ে, ডোমেনগুলিকে অভিযোজিত করার জন্য আমরা কেবলমাত্র আমাদের কোডটিকে "আরও দূষিত" ডোমেনগুলিতে ব্যবহার করতে পারি যা আমরা আরও সহজেই ব্যবহার করতে পারি।
আয়ান ফেয়ারম্যান

8
আয়ান ফেয়ারম্যান এটি ঠিকই পেয়েছেন, তবে এই উত্তরটির লেখক সম্ভবত তা করেননি। আপনি যদি ধারণার উত্সটিতে যান (ডিডিডি বই), আপনি কমপক্ষে দুটি জিনিস পেয়ে যাবেন যা এই উত্তরের সাথে বিরোধিতা করে: 1) নতুন ডোমেন মডেলটিকে দূষিত করা এড়াতে একটি দুর্নীতিবিরোধী স্তর তৈরি করা হয়েছে যা আমরা উপাদানগুলির সাথে বিকাশ করছি একটি বিদ্যমান বাহ্যিক সিস্টেমের মডেল থেকে; এটি এমন নয় যে অন্য সিস্টেমটি "দূষিত", বাস্তবে এটি পুরোপুরি ভাল এবং সু-নকশিত হতে পারে; 2) একটি দুর্নীতিবিরোধী স্তর সাধারণত প্রায়ই বিভিন্ন ক্লাস, উপস্থিত থাকবে সহ ফেসেড এবং অ্যাডাপ্টার যেমন, পাশাপাশি সার্ভিস
রোগারিও

41

অন্য উত্স উদ্ধৃত:

ক্লায়েন্টদের তাদের নিজস্ব ডোমেন মডেলের ক্ষেত্রে কার্যকারিতা সরবরাহ করার জন্য একটি বিচ্ছিন্ন স্তর তৈরি করুন। স্তরটি তার বিদ্যমান ইন্টারফেসের মাধ্যমে অন্যান্য সিস্টেমে কথা বলে, অন্য সিস্টেমে সামান্য বা কোনও পরিবর্তন প্রয়োজন। অভ্যন্তরীণভাবে, স্তরটি দুটি মডেলের মধ্যে প্রয়োজনীয় হিসাবে উভয় দিকেই অনুবাদ করে।

এরিক ইভান্স, ডোমেন চালিত ডিজাইন, 16 তম মুদ্রণ, পৃষ্ঠা 365

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

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


6
এই অত্যন্ত গুরুত্বপূর্ণ! একটি এসিএল কেবল মেসি কোডের সাথে ব্যবহার করার জন্য নয়, সীমানা প্রসঙ্গের মধ্যে যোগাযোগের মাধ্যম হিসাবে। এটি একটি প্রসঙ্গ থেকে অন্য প্রসঙ্গে অনুবাদ করে, যাতে প্রতিটি প্রসঙ্গে ডেটা ভাষা এবং সেই প্রসঙ্গে যে ডেটাটি সম্পর্কে চিন্তাভাবনা করে এবং কথা বলে তা প্রতিবিম্বিত করে।
দিদিয়ার এ

29

এডাপটার

যখন আপনার অসামঞ্জস্যপূর্ণ ইন্টারফেস থাকে, যা একইরকম যুক্তি সম্পাদন করে, একে অপরটির সাথে খাপ খাইয়ে নিতে, যাতে আপনি অপরের প্রত্যাশাযুক্ত জিনিসগুলির সাথে একটিটির বাস্তবায়ন ব্যবহার করতে পারেন।

উদাহরণ:

আপনার কাছে একটি জিনিস রয়েছে যা একটি গাড়ি চায়, তবে আপনার কাছে কেবল একটি 4WheelVehicle ক্লাস রয়েছে, সুতরাং আপনি একটি CarBuiltUsing4WheelVehicle তৈরি করেন এবং এটি আপনার গাড়ী হিসাবে ব্যবহার করেন।

অট্টালিকার সদরের বহির্ভাগ

যখন আপনার একটি জটিল / বিভ্রান্তিকর / বিশাল এপিআই থাকে এবং আপনি এটিকে আরও সহজ / পরিষ্কার / আরও ছোট করতে চান। আপনি জটিলতা / বিভ্রান্তি / অতিরিক্তগুলি আড়াল করার জন্য একটি ফেকাদ তৈরি করবেন এবং কেবলমাত্র একটি নতুন সরল / পরিষ্কার / ছোট এপিআই প্রকাশ করবেন।

উদাহরণ:

আপনি একটি লাইব্রেরি ব্যবহার করছেন যার 100 টি পদ্ধতি রয়েছে এবং নির্দিষ্ট কাজটি সম্পাদনের জন্য আপনাকে কিছু গুছিয়ে সূচনা, সংযোগ স্থাপন, খোলার / সমাপনী কাজ করতে হবে, অবশেষে আপনি যা চান তা করতে সক্ষম হবেন এবং আপনি যা চান তার 1 টি বৈশিষ্ট্য সমস্ত 50 গ্রন্থাগারটি করতে পারে, সুতরাং আপনি এমন একটি মুখোমুখি তৈরি করুন যা আপনার প্রয়োজন সেই 1 টি বৈশিষ্ট্যের জন্য কেবল একটি পদ্ধতি রয়েছে এবং এটি আপনার জন্য সমস্ত সূচনা, পরিষ্কারকরণ ইত্যাদি করে।

দুর্নীতি বিরোধী স্তর

যখন আপনার কোনও সিস্টেম আপনার ডোমেনের বাইরে না থাকে, তবুও আপনার ব্যবসায়ের প্রয়োজন হয় সেই অন্যান্য ডোমেনের সাথে কাজ করা। আপনি এই নিজের অন্যান্য ডোমেনটি নিজের মধ্যে প্রবর্তন করতে চান না, তাই এটি দুর্নীতিগ্রস্থ হয়ে গেছে, তাই আপনি আপনার ডোমেনের ধারণাটি এই অন্য ডোমেনটিতে এবং এর বিপরীতে অনুবাদ করবেন।

উদাহরণ:

একটি সিস্টেম গ্রাহককে একটি নাম এবং স্ট্রিংগুলির তালিকাযুক্ত প্রতিটি লেনদেনের জন্য একটি করে দেখে। আপনি প্রোফাইলগুলি একা একা ক্লাস হিসাবে নাম রাখছেন, এবং লেনদেনের স্ট্রিং থাকা একা ক্লাস হিসাবে এবং গ্রাহককে প্রোফাইল এবং লেনদেনের সংকলন হিসাবে দেখেন।

সুতরাং আপনি একটি এসিএল স্তর তৈরি করেন যা আপনার গ্রাহক এবং অন্য সিস্টেমের গ্রাহকের মধ্যে অনুবাদ করতে দেয়। এইভাবে, আপনাকে অন্য সিস্টেমের গ্রাহকটি কখনই ব্যবহার করতে হবে না, আপনার কেবল এসিএলকে বলা দরকার: "আমাকে প্রোফাইল এক্স সহ গ্রাহক দিন, এবং এসিএল অন্য সিস্টেমকে এটিকে X.name এর একটি গ্রাহক দিতে বলে, এবং ফেরত দেয় আপনি প্রোফাইল এক্স সহ গ্রাহক

====================

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


12

এখানে প্রচুর উত্তর বলে যে এসিএলগুলি অগোছালো কোড মোড়ানো সম্পর্কে "কেবল" নয়। আমি আরও গিয়ে বলব যে তারা এগুলি সম্পর্কে মোটেই নেই, এবং যদি তারা তা করে তবে এটি একটি পার্শ্ব সুবিধা।

একটি দুর্নীতিবিরোধী স্তরটি একটি ডোমেনকে অন্যটিতে ম্যাপিং করতে চলেছে যাতে দ্বিতীয় ডোমেন ব্যবহার করে এমন পরিষেবাগুলি প্রথম থেকে ধারণাগুলি দ্বারা "দূষিত" না হয়। এসিএলগুলি ডোমেন মডেলগুলিতে ক্লাসগুলিতে অ্যাডাপ্টারগুলি কী তা কেবলমাত্র একটি ভিন্ন স্তরে ঘটছে। অ্যাডাপ্টারটি তর্কযুক্তভাবে সর্বাধিক গুরুত্বপূর্ণ ডিজাইনের প্যাটার্ন - আমি এটি সর্বদা ব্যবহার করি - তবে মোড়ানো শ্রেণিকে অগোছালো বলে মনে করা বা আপত্তিজনক নয়। এটি যা তা, আমার কেবল এটির একটি আলাদা ইন্টারফেস দরকার।

অগোছালোতার বিষয়ে মনোনিবেশ করা বিভ্রান্তিমূলক এবং ডিডিডি কী তা বোঝায় না। এসিএলগুলি নিম্নমানের নয়, ধারণাগত অমিলের সাথে কাজ করার বিষয়ে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.