දූෂණ විරෝධී තට්ටුවක් යනු කුමක්ද, එය භාවිතා කරන්නේ කෙසේද?


158

දූෂණ විරෝධී ස්තරය සැබවින්ම අදහස් කරන්නේ කුමක්දැයි වටහා ගැනීමට මම උත්සාහ කරමි. එය පැරණි කේත හෝ නරක ඒපීඅයි වටා සංක්‍රමණය වීමට / වැඩ කිරීමට ක්‍රමයක් බව මම දනිමි. මට නොතේරෙන දෙය නම් එය ක්‍රියා කරන ආකාරය සහ එය නුසුදුසු ස්ථරයෙන් වෙන්වීමක් බවට පත් කිරීමයි.

මම යම් සෙවීමක් කර ඇත, නමුත් මට සරල උදාහරණ හෝ පැහැදිලි කිරීම් සොයාගත නොහැක, එබැවින් මම එය තේරුම් ගෙන සරල උදාහරණ සමඟ පැහැදිලි කළ හැකි අයෙකු සොයමි. මගේ ප්‍රශ්නය තෘප්තිමත් කරන පිළිතුරක් සරල විය යුතුය (අවශ්‍යයෙන්ම කෙටි නොවේ), සහ ක්‍රියාත්මක කිරීම සහ භාවිතය පිළිබඳ තේරුම් ගත හැකි උදාහරණ සපයයි.

මගේ භාවිතය සඳහා මෙම ප්‍රශ්නය බලන්න .

Answers:


149

පහත දැක්වෙන පරිදි නිර්මාණය කර ඇති වෙනත් කෙනෙකුගේ කේතයක් ඔබ භාවිතා කළ යුතු යැයි සිතන්න:

    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); }
    }

එහි ප්‍රති As ලයක් ලෙස, ඔබේ “ප්‍රධාන කේතය” අවුල් වන්නේ නැත 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.


ඉහත උදාහරණය පදනම් වී ඇත්තේ c2 විකියේ දී Anticorrupt Layer පැහැදිලි කර ඇති ආකාරය මත ය :

ඔබේ යෙදුම තුළ දත්ත සමුදායක් හෝ වෙනත් යෙදුමක් සමඟ ගනුදෙනු කිරීමට අවශ්‍ය නම්, ඔබේම යෙදුම තුළ ඔබට අවශ්‍ය ආකෘතියට නුසුදුසු හෝ අදාළ කළ නොහැකි නම්, එම ආකෘතියට සහ ඔබේ භාෂාවට පරිවර්තනය කිරීමට AnticorruptLayer භාවිතා කරන්න.

සටහන උදාහරණය හිතාමතාම සරල කර ensed නීභවනය කර පැහැදිලි කිරීම කෙටියෙන් තබා ගනී.

දූෂණ විරෝධී ස්තරය පිටුපස ආවරණය කිරීම සඳහා ඔබට විශාල API අවුල් ජාලයක් තිබේ නම්, එම ප්‍රවේශයම අදාළ වේ: පළමුව, ඔබේ “ප්‍රධාන කේතය” දූෂිත දේට සෘජුව හා දෙවනුව ප්‍රවේශ නොවන බවට වග බලා ගන්න , එය වඩාත් පැහැදිලි ආකාරයකින් නිරාවරණය කරන්න ඔබගේ භාවිත සන්දර්භය තුළ පහසුය.

ඉහත සරල කළ උදාහරණයකින් ඔබ්බට ඔබේ ස්තරය “පරිමාණය” කරන විට, ඔබේ API පහසු කිරීම සුළුපටු කාර්යයක් නොවන බව සැලකිල්ලට ගන්න. ක් ආයෝජනය උත්සාහයක් කිරීමට ලේයරය නිවැරදි මාර්ගය නිර්මාණය , එහි අපේක්ෂිත භාවිතය තහවුරු ඒකකය පරීක්ෂණ ආදිය

වෙනත් වචන වලින් කිවහොත්, ඔබේ API සැබවින්ම සැඟවී ඇති එකකට වඩා වැඩි දියුණු කිරීමක් බවට වග බලා ගන්න, ඔබ තවත් දූෂණ ස්ථරයක් හඳුන්වා නොදෙන බවට වග බලා ගන්න.


සම්පූර්ණත්වය සඳහා, ඇඩැප්ටරය සහ මුහුණත මේ හා අදාළ රටාවන් අතර සියුම් නමුත් වැදගත් වෙනසක් සැලකිල්ලට ගන්න . එහි නමෙන් දැක්වෙන පරිදි, ප්‍රති- දූෂිත ස්තරය උපකල්පනය කරන්නේ යටින් පවතින ඒපීඅයි හි ගුණාත්මක ගැටළු ඇති බවයි ("දූෂිත") සහ සඳහන් කර ඇති ගැටළු වලින් ආරක්ෂාවක් ලබා දීමට අදහස් කරයි.

ඔබට එය මේ ආකාරයෙන් සිතිය හැකිය: පුස්තකාල නිර්මාණකරුවා Reasonableඒ වෙනුවට එහි ක්‍රියාකාරිත්වය නිරාවරණය කිරීම වඩා හොඳ යැයි ඔබට සාධාරණීකරණය කළ හැකි නම් Messy, මෙයින් අදහස් කරන්නේ ඔබ ප්‍රති-දූෂණ ස්ථරයේ වැඩ කරමින්, ඔවුන්ගේ කාර්යය කරමින්, ඔවුන්ගේ සැලසුම් වැරදි නිවැරදි කරන බවයි.

ඊට ප්‍රතිවිරුද්ධව, ඇඩැප්ටරය සහ ෆැසෙඩ් යටි සැලසුමේ ගුණාත්මකභාවය පිළිබඳ උපකල්පන නොකරයි. මේවා ඔබේ විශේෂිත අවශ්‍යතා සඳහා අනුවර්තනය කරමින් ආරම්භ කිරීම සඳහා හොඳින් සැලසුම් කර ඇති API වෙත යෙදිය හැකිය.

ඇත්ත වශයෙන්ම, ඇඩැප්ටරය සහ ෆැසෙඩ් වැනි රටා යටින් පවතින කේතය හොඳින් සැලසුම් කර ඇතැයි අපේක්ෂා කිරීම වඩාත් tive ලදායී විය හැකිය. ඔබට එය මේ ආකාරයෙන් සිතිය හැකිය: හොඳින් සැලසුම් කරන ලද කේතය විශේෂිත භාවිත අවස්ථා සඳහා කරකැවීම එතරම් අපහසු නොවිය යුතුය. ඔබේ ඇඩැප්ටරයේ සැලසුම බලාපොරොත්තු වූවාට වඩා වැඩි උත්සාහයක් ගත යුතු බව පෙනේ නම්, මෙයින් ඇඟවෙන්නේ යටින් පවතින කේතය කෙසේ හෝ “දූෂිත” බවයි. එවැනි අවස්ථාවකදී, ඔබට කාර්යය වෙන් කිරීම අදියරයන් ලෙස සලකා බැලිය හැකිය: පළමුව, යටින් පවතින API නිසි ලෙස ව්‍යුහාත්මක ආකාරයකින් ඉදිරිපත් කිරීම සඳහා ප්‍රතිවෛරස් ස්ථරයක් ස්ථාපිත කරන්න, ඊළඟට, එම ආරක්ෂණ ස්ථරයට ඉහළින් ඔබේ ඇඩැප්ටරය / මුහුණත සැලසුම් කරන්න.


1
යැපෙන API පන්තිවල සම්පූර්ණ ව්‍යුහයක් තිබේ නම් මෙම පරිමාණය කරන්නේ කෙසේද? එය තව දුරටත් කළමනාකරණය කළ හැකිද? එවිට එය යෙදුමේ ඉතිරි කොටස ආරක්ෂා කරයි.
knownasilya

1
-නොනසිලියා එය ඉතා හොඳ ප්‍රශ්නයකි, එයට පිළිතුරු සැපයීම සඳහා පිළිතුර පුළුල් විය
gnat

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.එම සම්පූර්ණ කොටසම නිර්භීත ටැගයකට සුදුසු ය.
ලිලියන්තල්

24
දූෂණ විරෝධී ස්ථර දුර්වල ගුණාත්මක ඒපීඅයි සමඟ ගනුදෙනු කිරීම හා සම්බන්ධ නොවේ. ඒවා සංකල්පීය නොගැලපීම් සමඟ කටයුතු කිරීම, අපට පහසුවෙන් භාවිතා කළ හැකි වසම් වලට අපගේ කේතය "දූෂිත කිරීම" මගින් පමණක් භාවිතා කළ හැකි වසම් අනුගත කිරීම ය.
ඉයන් ෆෙයාර්මන්

11
ඉයන් ෆෙයාර්මන් එය නිවැරදිව වටහා ගත් අතර මෙම පිළිතුරේ කතුවරයා නිසැකවම එය නොකළේය. ඔබ සංකල්පයේ ප්‍රභවයට (ඩීඩීඩී පොත) ගියහොත්, මෙම පිළිතුරට පටහැනි කරුණු දෙකක් වත් ඔබට හමුවනු ඇත: 1) අප විසින් සංවර්ධනය කරමින් සිටින නව ඩොමේන් ආකෘතිය දූෂණය වීම වළක්වා ගැනීම සඳහා දූෂණ විරෝධී තට්ටුවක් නිර්මාණය කර ඇත. පවත්නා බාහිර පද්ධතියක ආකෘතියෙන්; අනෙක් ක්‍රමය “දූෂිත” බව නොවේ, ඇත්ත වශයෙන්ම එය හොඳ සහ හොඳින් සැලසුම් කර ඇති ඒවා විය හැකිය; 2) දූෂණ විරෝධී ස්ථරය සාමාන්යයෙන් බොහෝ විට කිහිප පන්ති, අඩංගු වනු ඇත ඇතුළු සෙහොනේ හා ඇඩැප්ටරය , මෙන්ම සේවා .
රොජේරියෝ

45

වෙනත් මූලාශ්‍රයක් උපුටා දැක්වීමට:

සේවාදායකයින්ට ඔවුන්ගේ ඩොමේන් ආකෘතිය අනුව ක්‍රියාකාරීත්වය සැපයීම සඳහා හුදකලා තට්ටුවක් සාදන්න. ස්තරය එහි පවතින අතුරුමුහුණත හරහා අනෙක් පද්ධතියට කථා කරයි, අනෙක් පද්ධතියට සුළු හෝ වෙනස් කිරීමක් අවශ්‍ය නොවේ. අභ්යන්තරව, ස්තරය මාදිලි දෙක අතර අවශ්ය පරිදි දෙපැත්තටම පරිවර්තනය කරයි.

එරික් එවාන්ස්, ඩොමේන් ඩ්‍රයිවින් ඩිසයින්, 16 වන මුද්‍රණය, පිටුව 365

වැදගත්ම දෙය නම් දූෂණ විරෝධී ස්ථරයේ සෑම පැත්තකින්ම විවිධ යෙදුම් භාවිතා කිරීමයි. මම වරක් ප්‍රවාහන සේවා සැපයුම් පද්ධතියක් සඳහා වැඩ කරමින් සිටියෙමි. වට සැලසුම් කිරීමට සිදු විය. ඔබට වාහනය ඩිපෝවකින් සන්නද්ධ කිරීමට, විවිධ පාරිභෝගික වෙබ් අඩවි වෙත ධාවනය කර ඔවුන්ට සේවා සැපයීමට හා ටැංකි නැවතුමක් වැනි වෙනත් ස්ථානවලට යාමට ඔබට සිදු විය. නමුත් ඉහළ මට්ටමේ සිට මේ සියල්ල කාර්ය සැලසුම්කරණය විය. එබැවින් වඩාත් පොදු කාර්ය සැලසුම් නියමයන් විශේෂිත ප්‍රවාහන සැපයුම් කොන්දේසි වලින් වෙන් කිරීම අර්ථවත් විය.

එබැවින් දූෂණ විරෝධී ස්ථර හුදකලාව යනු ඔබව අවුල් සහගත කේත වලින් ආරක්ෂා කිරීම පමණක් නොවේ, එය විවිධ වසම් වෙන් කොට අනාගතයේදී ඒවා වෙන්ව පවතින බවට වග බලා ගැනීමයි.


6
මෙය ඉතා වැදගත් ය! ACL යනු අවුල් සහගත කේතය සමඟ භාවිතා කිරීම පමණක් නොව, සීමිත සන්දර්භයන් අතර සන්නිවේදනය කිරීමේ මාධ්‍යයක් ලෙසය. එය එක් සන්දර්භයකින් තවත් සන්දර්භයකට පරිවර්ථනය වන අතර එමඟින් සෑම සන්දර්භයකම දත්ත භාෂාව සහ එම සන්දර්භය දත්ත ගැන සිතන හා කතා කරන ආකාරය පිළිබිඹු කරයි.
ඩිඩියර් ඒ.

33

ඇඩැප්ටරය

ඔබට නොගැලපෙන අතුරුමුහුණත් ඇති විට, ඒ හා සමාන තර්කනයක් සිදු කරන, එකක් අනෙකට අනුවර්තනය කිරීමට, එවිට ඔබට එකක් ක්‍රියාත්මක කිරීම අනෙකා අපේක්ෂා කරන දේවල් සමඟ භාවිතා කළ හැකිය.

උදාහරණයක්:

ඔබට මෝටර් රථයක් අවශ්‍ය වස්තුවක් ඇත, නමුත් ඔබට ඇත්තේ 4WheelVehicle පන්තියක් පමණි, එබැවින් ඔබ CarBuiltUsing4WheelVehicle එකක් සාදා එය ඔබේ මෝටර් රථය ලෙස භාවිතා කරයි.

මුහුණත

ඔබට සංකීර්ණ / ව්‍යාකූල / දැවැන්ත API ඇති විට ඔබට එය සරල / පැහැදිලි / කුඩා කිරීමට අවශ්‍ය විට. සංකීර්ණත්වය / ව්‍යාකූලත්වය / අමතර දේ සැඟවීමට ඔබ මුහුණත නිර්මාණය කරන අතර නව සරල / පැහැදිලි / කුඩා API එකක් පමණක් නිරාවරණය කරයි.

උදාහරණයක්:

ඔබ භාවිතා කරන්නේ ක්‍රම 100 කින් යුත් පුස්තකාලයක් වන අතර, යම් කාර්යයක් ඉටු කිරීම සඳහා ඔබට අවශ්‍ය දේ ආරම්භ කිරීමට, සම්බන්ධ කිරීමට, විවෘත කිරීමට / වැසීමට, අවසානයේදී ඔබට අවශ්‍ය දේ කිරීමට හැකි වන අතර ඔබට අවශ්‍ය සියල්ල 1 අංගයකි පුස්තකාල 50 ටම කළ හැකි අතර, එබැවින් ඔබට අවශ්‍ය වන්නේ එම අංග 1 සඳහා ක්‍රමවේදයක් පමණක් ඇති ෆැසෙඩ් එකක් වන අතර එය ඔබට ආරම්භ කිරීම, පිරිසිදු කිරීම යනාදිය සිදු කරයි.

දූෂණ විරෝධී ස්ථරය

ඔබගේ වසමෙන් පරිබාහිර පද්ධතියක් ඔබ සතුව ඇති නමුත්, ඔබේ ව්‍යාපාර අවශ්‍යතා සඳහා එම වසම සමඟ වැඩ කිරීම අවශ්‍ය වේ. ඔබට මෙම අනෙක් වසම ඔබටම හඳුන්වා දීමට අවශ්‍ය නැත, එබැවින් එය දූෂිත කරයි, එබැවින් ඔබ ඔබේ වසමේ සංකල්පය, මෙම වෙනත් වසමට පරිවර්තනය කරනු ඇත, සහ අනෙක් අතට.

උදාහරණයක්:

එක් පද්ධතියක් පාරිභෝගිකයාට නමක් සහ නූල් ලැයිස්තුවක් ඇති බව සලකයි, එක් එක් ගනුදෙනු සඳහා එකක්. ඔබ පැතිකඩයන් නමක් ඇති තනිවම පන්ති ලෙසත්, ගනුදෙනු තනිවම පන්ති ලෙසත්, ගනුදෙනුකරුට පැතිකඩක් සහ ගනුදෙනු එකතුවක් ලෙසත් ඔබ සලකයි.

එබැවින් ඔබ ACL ස්තරයක් සාදයි, එය ඔබේ ගනුදෙනුකරු සහ අනෙක් පද්ධතියේ පාරිභෝගිකයා අතර පරිවර්තනය කිරීමට ඉඩ සලසයි. මේ ආකාරයෙන්, ඔබ කිසි විටෙකත් අනෙක් පද්ධතියේ ගනුදෙනුකරු භාවිතා කළ යුතු නැත, ඔබ සරලවම ACL ට පැවසිය යුතුය: "මට පැතිකඩ X සමඟ ගනුදෙනුකරු ලබා දෙන්න, සහ ACL අනෙක් පද්ධතියට X.name නම් ගනුදෙනුකරුවකු ලබා දෙන ලෙස පවසමින් නැවත පැමිණේ. ඔබ පැතිකඩ X සහිත ගනුදෙනුකරුවෙකි.

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

මේ තුනම සාපේක්ෂව සමාන ය, මන්ද ඒවා සියල්ලම අවිනිශ්චිත රටා ය. නමුත් ඒවා විවිධ ව්‍යුහයන්, පන්ති / වස්තූන් එදිරිව ඒපීඅයි එදිරිව මොඩියුල / උප පද්ධති ආමන්ත්‍රණය කරයි. ඔබට අවශ්‍ය නම් ඒවා සියල්ලම ඒකාබද්ධ කළ හැකිය. උප පද්ධතියට සංකීර්ණ API එකක් ඇත, එබැවින් ඔබ ඒ සඳහා FACADE එකක් සාදයි, එය වෙනස් ආකෘතියක් භාවිතා කරයි, එබැවින් ඔබේ ආකෘතියට නොගැලපෙන සෑම දත්ත නිරූපණයක් සඳහාම, ඔබ එම දත්ත නැවත ආදර්ශනය කරන ආකාරය වෙත පරිවර්තනය කරනු ඇත. අවසාන වශයෙන්, සමහර විට අතුරුමුහුණත් නොගැලපේ, එබැවින් ඔබ එකිනෙකාගෙන් අනුවර්තනය වීමට ඇඩැප්ටර භාවිතා කරනු ඇත.


16

මෙහි බොහෝ පිළිතුරු පවසන්නේ ACLs අවුල් සහගත කේත ඔතා ගැනීම ගැන පමණක් නොවේ. මම තව දුරටත් ගොස් ඔවුන් කිසිසේත් ඒ ගැන නොවේ යැයි කියනු ඇත, ඔවුන් එසේ කරන්නේ නම් එය අතුරු ප්‍රතිලාභයකි.

දූෂණ විරෝධී තට්ටුවක් යනු එක් වසමක් තවත් වසමකට සිතියම් ගත කිරීමයි, එවිට දෙවන වසම භාවිතා කරන සේවාවන් මුල සිටම සංකල්ප මගින් "දූෂිත" නොවිය යුතුය. ACL යනු ඩොමේන් ආකෘති වන අතර පන්ති වලට ඇඩප්ටරයන් යනු කුමක්ද, එය සිදුවන්නේ වෙනත් මට්ටමක ය. ඇඩැප්ටරය වඩාත්ම වැදගත් මෝස්තර රටාවයි - මම එය නිතරම භාවිතා කරමි - නමුත් ඔතා ඇති පන්තිය අවුල් සහගතද නැද්ද යන්න විනිශ්චය කිරීම අදාල නොවේ. එය එයයි, මට අවශ්‍ය වන්නේ එයට වෙනත් අතුරු මුහුණතක් තිබීමයි.

අවුල් සහගත බව කෙරෙහි අවධානය යොමු කිරීම නොමඟ යවන අතර ඩීඩීඩී යනු කුමක්ද යන්න පිළිබඳ කාරණය මග හැරේ. ACLs යනු දුර්වල ගුණාත්මක භාවයෙන් නොව සංකල්පීය නොගැලපීම් සමඟ කටයුතු කිරීමයි.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.