බහුවිධ පංති නීති රීති හා ක්රියාත්මක කිරීම් මාලාවක් අනුගමනය කරන අතුරු මුහුණතක සමස්ත ලක්ෂ්යය නොවේද?
බහුවිධ පංති නීති රීති හා ක්රියාත්මක කිරීම් මාලාවක් අනුගමනය කරන අතුරු මුහුණතක සමස්ත ලක්ෂ්යය නොවේද?
Answers:
තදින් කිවහොත්, නැත, එසේ නොවේ, යග්නි අදාළ වේ. එයින් කියැවෙන්නේ, ඔබ අතුරුමුහුණත නිර්මාණය කිරීමට වැය කරන කාලය අවම වන අතර, විශේෂයෙන් ඔබ වෙනුවෙන් වැඩිපුරම කාර්යයන් කරන කේත උත්පාදනය කිරීමේ මෙවලමක් තිබේ නම්. ඔබට අතුරු මුහුණත අවශ්යද නැද්ද යන්න පිළිබඳව ඔබට අවිනිශ්චිතතාවයක් තිබේ නම්, මම කියන්නේ අතුරු මුහුණතක අර්ථ දැක්වීමට සහාය දැක්වීමේ පැත්තෙන් වැරදීම වඩා හොඳ බවයි.
තව දුරටත්, තනි පන්තියක් සඳහා පවා අතුරු මුහුණතක් භාවිතා කිරීමෙන් ඔබට ඒකක පරීක්ෂණ සඳහා තවත් ව්යාජ ක්රියාත්මක කිරීමක් ලබා දෙනු ඇත. අව්නර් ෂහාර්-කෂ්තාන්ගේ පිළිතුර මේ කාරණය සම්බන්ධයෙන් පුළුල් වේ.
ඔබට පිළිතුරු සපයන්නේ ඔබට අතුරු මුහුණතක් අවශ්යද නැද්ද යන්න පංති කීයක් ක්රියාත්මක කරයිද යන්න මත රඳා නොපවතී . අතුරුමුහුණත් යනු ඔබගේ යෙදුමේ බහු උප පද්ධති අතර ගිවිසුම් නිර්වචනය කිරීමේ මෙවලමකි ; එබැවින් ඇත්ත වශයෙන්ම වැදගත් වන්නේ ඔබේ යෙදුම උප පද්ධතිවලට බෙදා ඇති ආකාරයයි. කොපමණ පංති ක්රියාත්මක කළත්, සංවෘත උප පද්ධතිවල ඉදිරිපස කෙළවර ලෙස අතුරු මුහුණත් තිබිය යුතුය.
මෙන්න ඉතා ප්රයෝජනවත් එක් නියමයකි:
Foo
කෙලින්ම පන්තියට යොමු කරන්නේ නම් BarImpl
, ඔබ වෙනස් වන Foo
සෑම අවස්ථාවකම වෙනස් කිරීමට ඔබ දැඩි ලෙස කැපවී සිටී BarImpl
. ඔබ මූලික වශයෙන් සලකන්නේ පන්ති දෙකක් පුරා බෙදී ඇති කේත ඒකකයක් ලෙස ය.Foo
වෙත යොමු කරන්නේ නම් , ඔබ වෙනස් වන විට සිදුවන වෙනස්කම් වළක්වා ගැනීම සඳහා ඔබම කැපවී සිටී . Bar
Foo
BarImpl
ඔබගේ යෙදුමේ ප්රධාන කරුණු වලදී ඔබ අතුරුමුහුණත් නිර්වචනය කරන්නේ නම්, ඔවුන් සහාය දැක්විය යුතු ක්රම සහ ඒවා නොකළ යුතු ක්රම පිළිබඳව ඔබ හොඳින් සිතා බලන අතර, ක්රියාත්මක කිරීමක් හැසිරවිය යුතු ආකාරය විස්තර කිරීමට අතුරු මුහුණත් පැහැදිලිව අදහස් දක්වන්න (සහ කෙසේද), ඔබගේ යෙදුම තේරුම් ගැනීමට වඩා පහසු වනු ඇත, මන්ද මෙම අදහස් දැක්වූ අතුරුමුහුණත් මඟින් යෙදුමේ නිශ්චිත පිරිවිතරයන් සපයනු ඇත - එය හැසිරීමට අදහස් කරන ආකාරය පිළිබඳ විස්තරයකි . මෙය කේතය කියවීම වඩාත් පහසු කරයි ("මෙම කේතය කුමක් කළ යුතුදැයි ඇසීම වෙනුවට" ඔබට ඇසිය හැකිය "මෙම කේතය එය කළ යුතු දේ කරන්නේ කෙසේද").
මේ සියල්ලට අමතරව (හෝ ඇත්ත වශයෙන්ම එය නිසා), අතුරුමුහුණත් වෙනම සම්පාදනය ප්රවර්ධනය කරයි. අතුරුමුහුණත් සම්පාදනය කිරීම සුළුපටු වන අතර ඒවා ක්රියාත්මක කිරීමට වඩා අඩු පරායත්තතා ඇති බැවින්, එයින් අදහස් වන්නේ ඔබ Foo
අතුරු මුහුණතක් භාවිතා කිරීම සඳහා පන්තිය ලියන්නේ නම් Bar
, සාමාන්යයෙන් නැවත සම්පාදනය BarImpl
කිරීමකින් තොරව නැවත සකස් කළ හැකි Foo
බවයි. විශාල යෙදුම් වලදී මෙය බොහෝ කාලයක් ඉතිරි කර ගත හැකිය.
Foo
අතුරු මුහුණත මත රඳා පවතී Bar
නම් BarImpl
recompile කිරීමට තොරව වෙනස් කළ හැකිය, Foo
. 4. රාජ්ය / පෞද්ගලික දීමනා වලට වඩා සිහින්ව ප්රවේශවීමේ පාලනය (එකම පන්තිය සේවාදායකයින් දෙදෙනෙකුට විවිධ අතුරුමුහුණත් හරහා නිරාවරණය කරන්න).
If you make class Foo refer directly to class BarImpl, you're strongly committing yourself to change Foo every time you change BarImpl
වෙනස් කිරීමේදී, භාවිතා කිරීමෙන් Foo හි වළක්වා ගත හැකි වෙනස්කම් interface Bar
මොනවාද? BarImpl හි ක්රමවේදයක අත්සන් සහ ක්රියාකාරිත්වය වෙනස් නොවන තාක් කල්, Foo හට අතුරු මුහුණතකින් තොරව වෙනසක් අවශ්ය නොවේ (අතුරු මුහුණතේ සම්පූර්ණ අරමුණ). මම මේ කතා කරන්නේ එක් පන්තියක් පමණක් එනම් BarImpl
බාර් ක්රියාත්මක කරන අවස්ථාව ගැන ය. බහු පංති තත්වයන් සඳහා, පරායත්ත ප්රතිලෝම මූලධර්මය සහ එය අතුරුමුහුණත ප්රයෝජනවත් වන්නේ කෙසේදැයි මම තේරුම් ගතිමි.
හැසිරීම නිර්වචනය කිරීම සඳහා අතුරුමුහුණත් නම් කර ඇත, එනම් ශ්රිත / ක්රමවල මූලාකෘති සමූහයකි. අතුරුමුහුණත ක්රියාත්මක කරන වර්ග එම හැසිරීම ක්රියාත්මක කරනු ඇත, එබැවින් ඔබ එවැනි වර්ගයක් සමඟ ගනුදෙනු කරන විට (අර්ධ වශයෙන්) එහි ඇති හැසිරීම කුමක්දැයි ඔබ දනී.
අතුරුමුහුණතක් නිර්වචනය කිරීමේ අවශ්යතාවයක් නැත, එය අර්ථ දක්වා ඇති හැසිරීම එක් වරක් පමණක් භාවිතා කරනු ඇති බව ඔබ දන්නේ නම්. KISS (සරල ලෙස තබා ගන්න, මෝඩ)
න්යාය අනුව ඔබට අතුරු මුහුණතක් තිබීම සඳහා අතුරු මුහුණතක් නොතිබිය යුතු අතර, යානිස් රිසෝස්ගේ පිළිතුර තවදුරටත් සංකූලතා පිළිබඳව ඉඟි කරයි:
ඔබ ඒකක පරීක්ෂණ ලියන විට සහ Moq හෝ FakeItEasy වැනි ව්යාජ රාමු භාවිතා කරන විට (මා භාවිතා කළ නවතම ඒවා දෙක නම් කිරීමට), ඔබ ව්යංගයෙන් අතුරු මුහුණත ක්රියාත්මක කරන වෙනත් පන්තියක් නිර්මාණය කරයි. කේතය හෝ ස්ථිතික විශ්ලේෂණය සෙවීමෙන් එක් ක්රියාත්මක කිරීමක් පමණක් ඇති බව පැවසිය හැකි නමුත් ඇත්ත වශයෙන්ම අභ්යන්තර විහිළු ක්රියාත්මක කිරීම තිබේ. ඔබ විහිළු ලිවීම ආරම්භ කරන සෑම විටම, අතුරු මුහුණත් උපුටා ගැනීම අර්ථවත් බව ඔබට පෙනී යනු ඇත.
නමුත් රැඳී සිටින්න, තවත් බොහෝ දේ ඇත. ව්යංග අතුරුමුහුණත් ක්රියාත්මක කිරීම් ඇති තවත් අවස්ථා තිබේ. .NET හි WCF සන්නිවේදන තොගය භාවිතා කිරීම දුරස්ථ සේවාවක් සඳහා ප්රොක්සියක් ජනනය කරන අතර එය නැවත අතුරු මුහුණත ක්රියාත්මක කරයි.
පිරිසිදු කේත පරිසරයක, මෙහි ඇති අනෙක් පිළිතුරු සමඟ මම එකඟ වෙමි. කෙසේ වෙතත්, අතුරුමුහුණත් භාවිතා කළ හැකි ඕනෑම රාමු, රටා හෝ පරායත්තතාවයන් කෙරෙහි අවධානය යොමු කරන්න.
නැත, ඔබට ඒවා අවශ්ය නොවන අතර සෑම පන්ති යොමු කිරීමක් සඳහාම ස්වයංක්රීයව අතුරු මුහුණත් සෑදීම ප්රති-රටාවක් ලෙස මම සලකමි.
සෑම දෙයක් සඳහාම Foo / FooImpl සෑදීම සඳහා සැබෑ පිරිවැයක් ඇත. IDE විසින් අතුරු මුහුණත / ක්රියාත්මක කිරීම නොමිලයේ නිර්මාණය කළ හැකිය, නමුත් ඔබ කේතය සැරිසැරීමේදී, ඔබට foo.doSomething()
අතුරු මුහුණතේ අත්සන වෙත ගෙනයාමට F3 / F12 වෙතින් අමතර සංජානන බරක් ඇත, ඔබට අවශ්ය සත්ය ක්රියාත්මක කිරීම නොවේ. ප්ලස් ඔබට සෑම දෙයක් සඳහාම එකක් වෙනුවට ලිපිගොනු දෙකක කැළඹීමක් ඇත.
එබැවින් ඔබ එය කළ යුත්තේ ඔබට යමක් අවශ්ය වූ විට පමණි.
දැන් ප්රතිප්රහාර ආමන්ත්රණය කිරීම:
පරායත්ත එන්නත් කිරීමේ රාමු සඳහා මට අතුරු මුහුණත් අවශ්යයි
රාමු සඳහා ආධාරක අතුරුමුහුණත් උරුමයකි. ජාවා හි, ගතික ප්රොක්සි සඳහා අවශ්ය වන අතුරු මුහුණත්, පූර්ව CGLIB. අද, ඔබට සාමාන්යයෙන් එය අවශ්ය නොවේ. එය ප්රගතියක් ලෙස සලකනු ලබන අතර සංවර්ධක produc ලදායිතාව සඳහා ආශීර්වාදයක් වන අතර ඔබට ඒවා තවදුරටත් EJB3, වසන්තය ආදිය අවශ්ය නොවේ.
ඒකක පරීක්ෂණ සඳහා මට විහිළු අවශ්යයි
ඔබ ඔබේම විහිළු ලියා සත්ය ක්රියාත්මක කිරීම් දෙකක් තිබේ නම්, අතුරු මුහුණතක් සුදුසු වේ. ඔබේ කේත මාලාවට FooImpl සහ TestFoo යන දෙකම තිබේ නම් අපි බොහෝ විට මෙම සාකච්ඡාව නොකරනු ඇත.
නමුත් ඔබ Moq, EasyMock, හෝ Mockito වැනි විහිළු රාමුවක් භාවිතා කරන්නේ නම්, ඔබට පන්ති සමච්චලයට ලක් කළ හැකි අතර ඔබට අතුරු මුහුණත් අවශ්ය නොවේ. foo.method = mockImplementation
ක්රම පැවරිය හැකි ගතික භාෂාවක සැකසීමට එය සමානය .
පරායත්ත ප්රතිලෝම මූලධර්මය (DIP) අනුගමනය කිරීමට අපට අතුරු මුහුණත් අවශ්ය වේ
ඩීඅයිපී පවසන්නේ ඔබ ගොඩනඟන්නේ කොන්ත්රාත්තු (අතුරුමුහුණත්) මත මිස ක්රියාත්මක කිරීම් මත නොවන බවයි. නමුත් පන්තියක් දැනටමත් කොන්ත්රාත්තුවක් සහ වියුක්ත කිරීමකි. පොදු / පෞද්ගලික වචන සඳහා එයයි. විශ්ව විද්යාලයේ, කැනොනිකල් උදාහරණය මැට්රික්ස් හෝ බහුපද පන්තියක් වැනි ය - පාරිභෝගිකයින්ට න්යාස නිර්මාණය කිරීම, ඒවා එකතු කිරීම යනාදිය සඳහා පොදු API එකක් ඇත, නමුත් අනුකෘතිය විරල හෝ ense න ස්වරූපයෙන් ක්රියාත්මක කරන්නේ දැයි සැලකිලිමත් වීමට ඉඩ නොදේ. එම කරුණ සනාථ කිරීම සඳහා IMatrix හෝ MatrixImpl අවශ්ය නොවීය.
එසේම, ප්රධාන මොඩියුල මායිම්වල පමණක් නොව, සෑම පන්ති / ක්රම ඇමතුම් මට්ටමකම ඩීඅයිපී බොහෝ විට අධික ලෙස යොදනු ලැබේ. ඔබ ඩීඅයිපී ඕනෑවට වඩා අයදුම් කරන බවට ලකුණක් නම්, ඔබේ අතුරු මුහුණත සහ අගුළු පියවරෙහි ක්රියාත්මක වීම වෙනස් වීම නිසා එකක් වෙනුවට වෙනසක් කිරීමට ගොනු දෙකක් ස්පර්ශ කළ යුතුය. ඩීඅයිපී නිසි පරිදි යොදනු ලැබුවහොත්, එයින් අදහස් වන්නේ ඔබේ අතුරු මුහුණත බොහෝ විට වෙනස් නොවිය යුතු බවයි. එසේම, තවත් ලකුණක් නම්, ඔබේ අතුරු මුහුණතේ ඇත්තේ එක් සැබෑ පාරිභෝගිකයෙකු පමණි (එහි යෙදුම). ඔබ විවිධ යෙදුම්වල පරිභෝජනය සඳහා පන්ති පුස්තකාලයක් ගොඩනඟන්නේ නම් වෙනස් කතාව.
මෙය සමච්චල් කිරීම පිළිබඳ බොබ් මාටින් මාමාගේ කාරණයට සමපාතයකි - ඔබට අවශ්ය විය යුත්තේ ප්රධාන වාස්තු විද්යාත්මක සීමාවන් පමණි. වෙබ් ඇප් එකක HTTP සහ DB ප්රවේශය ප්රධාන සීමාවන් වේ. අතර ඇති සියලුම පන්ති / ක්රම ඇමතුම් එසේ නොවේ. ඩීඅයිපී සඳහා ද එසේමය.
මෙයද බලන්න:
new Mockup<YourClass>() {}
අතර එහි ඉදිකිරීම්කරුවන් ඇතුළු මුළු පන්තියම සමච්චලයට ලක් වේ, එය අතුරු මුහුණතක්, වියුක්ත පන්තියක් හෝ කොන්ක්රීට් පන්තියක් වේවා. ඔබට එසේ කිරීමට අවශ්ය නම් ඉදිකිරීම්කරුගේ හැසිරීම "අභිබවා" යා හැකිය. මොකිටෝ හෝ පවර්මොක්හි සමාන ක්රම ඇතැයි මම සිතමි.
වැටෙහි දෙපස ඇති පිළිතුරු මෙහි සාරාංශගත කළ හැකි බව පෙනේ:
හොඳින් සැලසුම් කර අතුරු මුහුණත් අවශ්ය තැන අතුරුමුහුණත් තබන්න.
යානිගේ පිළිතුරට මා දැක්වූ ප්රතිචාරයේ මා සඳහන් කළ පරිදි , ඔබට අතුරු මුහුණත් පිළිබඳ දැඩි හා වේගවත් රීතියක් තිබිය හැකි යැයි මම නොසිතමි. රීතිය අර්ථ දැක්වීම අනුව නම්යශීලී විය යුතුය. අතුරුමුහුණත් පිළිබඳ මගේ රීතිය නම් ඔබ API නිර්මාණය කරන ඕනෑම තැනක අතුරු මුහුණතක් භාවිතා කළ යුතු බවයි. ඔබ එක් වගකීම් වසමක සිට තවත් සීමාවකට සීමාව ඉක්මවා යන ඕනෑම තැනක API නිර්මාණය කළ යුතුය.
(බිහිසුණු ලෙස සැලසුම් කරන ලද) උදාහරණයක් සඳහා, ඔබ Car
පන්තියක් ගොඩනඟමු යැයි කියමු . ඔබේ පන්තියේදී ඔබට නිසැකවම UI ස්ථරයක් අවශ්ය වේ. මෙම විශේෂිත උදාහරණයේ, එය ස්වරූපයෙන් ගනී IginitionSwitch
, SteeringWheel
, GearShift
, GasPedal
, සහ BrakePedal
. මෙම මෝටර් රථයේ අ අඩංගු බැවින් AutomaticTransmission
ඔබට එය අවශ්ය නොවේ ClutchPedal
. (මෙය භයානක මෝටර් රථයක් බැවින් උසස්පෙළ, ගුවන්විදුලිය හෝ ආසනයක් නොමැත. ඇත්ත වශයෙන්ම, බිම් පුවරු ද අස්ථානගත වී ඇත - ඔබට එම සුක්කානම මත එල්ලී හොඳම දේ බලාපොරොත්තු විය යුතුය!)
ඉතින් මෙම පන්ති අතුරින් අතුරු මුහුණතක් අවශ්ය වන්නේ කුමක්ද? පිළිතුර ඒ සියල්ලම විය හැකිය, නැතහොත් ඒවා කිසිවක් නැත - ඔබේ සැලසුම අනුව.
ඔබට මේ ආකාරයට පෙනෙන අතුරු මුහුණතක් තිබිය හැකිය:
Interface ICabin
Event IgnitionSwitchTurnedOn()
Event IgnitionSwitchTurnedOff()
Event BrakePedalPositionChanged(int percent)
Event GasPedalPositionChanged(int percent)
Event GearShiftGearChanged(int gearNum)
Event SteeringWheelTurned(float degree)
End Interface
එම අවස්ථාවෙහිදී, එම පංතිවල හැසිරීම ICabin Interface / API හි කොටසක් බවට පත්වේ. මෙම උදාහරණයේ දී පංති (සමහරක් තිබේ නම්) බොහෝ විට සරල ය, ගුණාංග කිහිපයක් සහ ශ්රිතයක් හෝ දෙකක් ඇත. ඔබේ සැලසුම සමඟ ඔබ ව්යංගයෙන් ප්රකාශ කරන දෙය නම්, මෙම පංති පවතින්නේ ඔබ සතුව ඇති ඕනෑම ICabin ක්රියාවට නැංවීම සඳහා සහය දැක්වීම සඳහා පමණක් වන අතර ඒවා තනිවම පැවතිය නොහැක, නැතහොත් ඒවා ICabin සන්දර්භයෙන් පිටත අර්ථ විරහිත ය.
ඔබ පුද්ගලික සාමාජිකයින් ඒකක පරීක්ෂා නොකිරීමට එකම හේතුවයි - ඔවුන් පවතින්නේ පොදු API සඳහා සහය දැක්වීමට පමණි , එබැවින් ඔවුන්ගේ හැසිරීම API පරීක්ෂා කිරීමෙන් පරීක්ෂා කළ යුතුය.
එබැවින් ඔබේ පංතිය පවතින්නේ වෙනත් පන්තියකට සහය දැක්වීමට පමණක් නම් සහ සංකල්පමය වශයෙන් ඔබ එය සලකන්නේ එය ඇත්ත වශයෙන්ම තමන්ගේම වසමක් නොමැති බව නම්, එවිට අතුරු මුහුණත මඟ හැරීම සුදුසුය. නමුත් ඔබේ පන්තිය තමන්ගේම වසමක් ඇති තරම් වැඩී ඇතැයි ඔබ සිතන තරම් වැදගත් නම්, ඉදිරියට ගොස් එයට අතුරු මුහුණතක් දෙන්න.
සංස්කරණය කරන්න:
ඔබ නිතරම (මෙම පිළිතුර ඇතුළුව) ඔබ 'ඩොමේන්', 'යැපීම' (නිතර නිතර 'එන්නත් කිරීම' සමඟ) කියවනු ඇත, එය ඔබ වැඩසටහන ආරම්භ කරන විට ඔබට යමක් අදහස් නොකරයි (ඔවුන් විශ්වාස නොකරයි මට ඕනෑම දෙයක් අදහස් කරන්න). වසම සඳහා, එයින් අදහස් කරන්නේ හරියටම එය හරියට:
ආධිපත්යය හෝ අධිකාරය ක්රියාත්මක වන භූමිය; ස්වෛරී හෝ පොදුරාජ්ය මණ්ඩලයේ හෝ ඒ හා සමාන දේපළ. සංකේතාත්මකව ද භාවිතා කරයි. [වර්ඩ්නෙට් සෙන්ස් 2] [1913 වෙබ්ස්ටර්]
මගේ උදාහරණයට අනුව - අපි සලකා බලමු IgnitionSwitch
. මීට්පේස් මෝටර් රථයක, ජ්වලන ස්විචය වගකිව යුත්තේ:
එම ගුණ හදාගන්න වසම පිළිබඳ IgnitionSwitch
ඒ ගැන දන්නවා හා වගකිව යුතු දේ,, හෝ වෙනත් වචන වලින්.
ඒ IgnitionSwitch
සඳහා වගකිව යුතු නොවේ GasPedal
. ජ්වලන ස්විචය සෑම ආකාරයකින්ම ගෑස් පැඩලය ගැන සම්පූර්ණයෙන්ම නොදැන සිටී. ඔවුන් දෙදෙනාම එකිනෙකාගෙන් සම්පූර්ණයෙන්ම ස්වාධීනව ක්රියාත්මක වේ (මෝටර් රථ දෙකම නොමැතිව තරමක් නිෂ් less ල වනු ඇත!).
මා මුලින් සඳහන් කළ පරිදි එය ඔබගේ සැලසුම මත රඳා පවතී. ඔබට IgnitionSwitch
අගයන් දෙකක් ඇති එකක් නිර්මාණය කළ හැකිය : ඔන් ( True
) සහ ඕෆ් ( False
). නැතහොත් ඒ සඳහා සපයා ඇති යතුර සහ වෙනත් ක්රියා රාශියක් සත්යාපනය කිරීම සඳහා ඔබට එය සැලසුම් කළ හැකිය. සංවර්ධකයෙකු වීමේ දුෂ්කර කොටස එයයි වැල්ලේ රේඛා අඳින්නේ කොතැනද යන්න තීරණය කිරීම - සහ අවංකවම බොහෝ විට එය සම්පූර්ණයෙන්ම සාපේක්ෂයි. වැලි වල ඇති රේඛා වැදගත් වුවත් - ඔබේ API ඇත්තේ එතැනිනි, එවිට ඔබේ අතුරුමුහුණත් තිබිය යුතුය.
MSDN වෙතින් :
නිශ්චිත ක්රියාකාරිත්වයක් සැපයීම සඳහා ඔබේ යෙදුම්වලට බොහෝ විට සම්බන්ධයක් නැති වස්තු වර්ග අවශ්ය වන අවස්ථාවන්ට අතුරුමුහුණත් වඩාත් සුදුසු වේ.
බහුවිධ අතුරුමුහුණත් ක්රියාත්මක කළ හැකි තනි ක්රියාත්මක කිරීමක් ඔබට අර්ථ දැක්විය හැකි නිසා අතුරු මුහුණත් මූලික පන්තිවලට වඩා නම්යශීලී වේ.
මූලික පන්තියකින් ක්රියාත්මක කිරීම ඔබට උරුම කර ගැනීමට අවශ්ය නොවන අවස්ථාවන්හිදී අතුරු මුහුණත් වඩා හොඳය.
ඔබට පන්ති උරුමය භාවිතා කළ නොහැකි අවස්ථාවන්හිදී අතුරු මුහුණත් ප්රයෝජනවත් වේ. උදාහරණයක් ලෙස, ව්යුහයන්ට පන්ති වලින් උරුම විය නොහැක, නමුත් ඒවාට අතුරු මුහුණත් ක්රියාත්මක කළ හැකිය.
සාමාන්යයෙන් තනි පංතියක දී, අතුරු මුහුණතක් ක්රියාත්මක කිරීම අවශ්ය නොවනු ඇත, නමුත් ඔබේ ව්යාපෘතියේ අනාගතය සැලකිල්ලට ගනිමින්, පන්තිවල අවශ්ය හැසිරීම විධිමත් ලෙස අර්ථ දැක්වීම ප්රයෝජනවත් විය හැකිය.
ප්රශ්නයට පිළිතුරු සැපයීම සඳහා: ඊට වඩා වැඩි යමක් ඇත.
අතුරුමුහුණතක එක් වැදගත් අංගයක් වන්නේ අභිප්රායයි.
අතුරුමුහුණතක් යනු "දත්ත අඩංගු නොවන වියුක්ත වර්ගයකි, නමුත් හැසිරීම් නිරාවරණය කරයි" - අතුරුමුහුණත (පරිගණකකරණය) එබැවින් මෙය පන්තියක් සහාය දක්වන හැසිරීමක් හෝ හැසිරීම් සමූහයක් නම්, අතුරු මුහුණතකට වඩා නිවැරදි රටාව විය හැකිය. කෙසේ වෙතත්, හැසිරීම (ය) පංතිය විසින් මූර්තිමත් කරන ලද සංකල්පයට ආවේනික නම්, ඔබට අතුරු මුහුණතක් කිසිසේත් අවශ්ය නොවනු ඇත.
ඇසිය යුතු පළමු ප්රශ්නය නම් ඔබ නියෝජනය කිරීමට උත්සාහ කරන දෙය හෝ ක්රියාවලියේ ස්වභාවය කුමක්ද යන්නයි. එම ස්වභාවය යම් ආකාරයකින් ක්රියාත්මක කිරීමට ප්රායෝගික හේතු අනුගමනය කරන්න.
ඔබ මෙම ප්රශ්නය ඇසූ බැවින්, බහු ක්රියාත්මක කිරීම් සඟවා අතුරු මුහුණතක් තිබීමේ අවශ්යතාවයන් ඔබ දැනටමත් දැක ඇති බව මම සිතමි. පරායත්ත ප්රතිලෝම මූලධර්මය මගින් මෙය ප්රකාශ කළ හැකිය.
කෙසේ වෙතත්, අතුරු මුහුණතක් තිබීමේ අවශ්යතාවය හෝ එය ක්රියාත්මක කිරීමේ ගණන මත රඳා නොපවතී. අතුරුමුහුණතක සැබෑ කාර්යභාරය වන්නේ එය ක්රියාත්මක කළ යුතු ආකාරය වෙනුවට කුමන සේවාවක් සැපයිය යුතුද යන්න සඳහන් කරන කොන්ත්රාත්තුවක් එය අර්ථ දැක්වීමයි.
කොන්ත්රාත්තුව නිර්වචනය කළ පසු, කණ්ඩායම් දෙකකට හෝ වැඩි ගණනකට ස්වාධීනව වැඩ කළ හැකිය. ඔබ A මොඩියුලයක් මත වැඩ කරන බවත් එය B මොඩියුලය මත රඳා පවතින බවත් පවසන්න, B හි අතුරු මුහුණතක් නිර්මාණය කිරීම B හි ක්රියාත්මක කිරීම ගැන කරදර නොවී ඔබේ වැඩ කටයුතු කරගෙන යාමට ඉඩ සලසයි. මේ අනුව, බෙදා හරින ලද වැඩසටහන්කරණය හැකි වේ.
B මොඩියුලයට එහි අතුරු මුහුණතේ එක් ක්රියාත්මක කිරීමක් පමණක් තිබුණද, අතුරු මුහුණත තවමත් අවශ්ය වේ.
අවසාන වශයෙන්, අතුරු මුහුණතක් එහි පරිශීලකයින්ගෙන් ක්රියාත්මක කිරීමේ තොරතුරු සඟවයි. කොන්ත්රාත්තුව නිර්වචනය කළ යුතු නිසා, වැඩි මොඩියුලර් මෘදුකාංගයක් ලිවීමට, ඒකක පරීක්ෂණ ප්රවර්ධනය කිරීමට සහ සංවර්ධන වේගය වේගවත් කිරීමට අවශ්ය නිසා අතුරු මුහුණතට ක්රමලේඛනය කිරීම තවත් ලේඛන ලිවීමට උපකාරී වේ.
මෙහි ඇති සියලුම පිළිතුරු ඉතා හොඳයි. ඇත්ත වශයෙන්ම බොහෝ විට ඔබට වෙනත් අතුරු මුහුණතක් ක්රියාත්මක කිරීමට අවශ්ය නොවේ . එහෙත්, ඔබ කොහේ නඩුව පවතින හැක කෙසේ හෝ එය කිරීමට අවශ්ය. මෙන්න මම එය කරන අවස්ථා කිහිපයක්:
තෙවන පාර්ශවීය කේතයට සම්බන්ධ වන ඇඩැප්ටර පන්තිය සමඟ බොහෝ විට සිදුවීමට මට අවශ්ය නැති පන්තිය තවත් අතුරු මුහුණතක් ක්රියාත්මක කරයි .
interface NameChangeListener { // Implemented by a lot of people
void nameChanged(String name);
}
interface NameChangeCount { // Only implemented by my class
int getCount();
}
class NameChangeCounter implements NameChangeListener, NameChangeCount {
...
}
class SomeUserInterface {
private NameChangeCount currentCount; // Will never know that you can change the counter
}
පංතිය භාවිතා කරන්නේ නිශ්චිත
පුස්තකාලයක් වන අතර එය බොහෝ විට බාහිර පුස්තකාල සමඟ අන්තර් ක්රියා කරන විට අගල කාන්දු නොවිය යුතුය . එක් ක්රියාත්මක කිරීමක් පමණක් පැවතියද බාහිර පුස්තකාලය සමඟ අනවශ්ය සම්බන්ධතාවයක් මා විසින් හඳුන්වා නොදෙන බව සහතික කිරීම සඳහා මම අතුරු මුහුණතක් භාවිතා කරමි.
interface SomeRepository { // Guarantee that the external library details won't leak trough
...
}
class OracleSomeRepository implements SomeRepository {
... // Oracle prefix allow us to quickly know what is going on in this class
}
හරස් ස්ථර සන්නිවේදනය
එක් UI පන්තියක් පමණක් කවදා හෝ ඩොමේන් පංතියක් ක්රියාත්මක කළත්, එම ස්ථර අතර වඩා හොඳ වෙන්වීමක් සඳහා එය ඉඩ සලසයි.
package project.domain;
interface UserRequestSource {
public UserRequest getLastRequest();
}
class UserBehaviorAnalyser {
private UserRequestSource requestSource;
}
package project.ui;
class OrderCompleteDialog extends SomeUIClass implements project.domain.UserRequestSource {
// UI concern, no need for my domain object to know about this method.
public void displayLabelInErrorMode();
// They most certainly need to know about *that* though
public UserRequest getLastRequest();
}
බොහෝ වස්තු සඳහා ලබා ගත යුත්තේ ක්රමයේ උප කුලකයක් පමණි. බොහෝ
විට සිදුවන්නේ කොන්ක්රීට් පන්තියේ යම් වින්යාස ක්රමයක් මා සතුව ඇති විටය
interface Sender {
void sendMessage(Message message)
}
class PacketSender implements Sender {
void sendMessage(Message message);
void setPacketSize(int sizeInByte);
}
class Throttler { // This class need to have full access to the object
private PacketSender sender;
public useLowNetworkUsageMode() {
sender.setPacketSize(LOW_PACKET_SIZE);
sender.sendMessage(new NotifyLowNetworkUsageMessage());
... // Other details
}
}
class MailOrder { // Not this one though
private Sender sender;
}
එබැවින් අවසානයේදී මම පුද්ගලික ක්ෂේත්රය භාවිතා කරන එකම හේතුව නිසා අතුරු මුහුණත භාවිතා කරමි: වෙනත් වස්තුවකට ඔවුන් ප්රවේශ නොවිය යුතු දේවල් සඳහා ප්රවේශය තිබිය යුතු නොවේ. මට එවැනි නඩුවක් තිබේ නම්, එක් පන්තියක් පමණක් එය ක්රියාත්මක කළත් මම අතුරු මුහුණතක් හඳුන්වා දෙමි.
අතුරුමුහුණත් සැබවින්ම වැදගත් නමුත් ඔබ සතුව ඇති ඒවා පාලනය කිරීමට උත්සාහ කරන්න.
සෑම දෙයක් සඳහාම අතුරුමුහුණත් නිර්මාණය කිරීමේ පාරට බැස ඇති බැවින් 'කැඩුණු ස්පැගටි' කේතය සමඟ අවසන් වීම පහසුය. මෙම විෂය පිළිබඳව ඉතා wise ානවන්ත වචන කිහිපයක් පළ කර ඇති අයින්ඩේ රහියන්ගේ ප්ර wisdom ාව මම කල් තබමි.
http://ayende.com/blog/153889/limit-your-abstractions-analyzing-a-ddd-application
මෙය ඔහුගේ මුළු ලිපි මාලාවේම පළමු ලිපියයි, එබැවින් දිගටම කියවන්න!
මෙම නඩුවේ අතුරු මුහුණතක් හඳුන්වා දීමට ඔබට තවමත් අවශ්ය විය හැකි එක් හේතුවක් වන්නේ පරායත්ත ප්රතිලෝම මූලධර්මය අනුගමනය කිරීමයි . එනම්, පන්තිය භාවිතා කරන මොඩියුලය කොන්ක්රීට් ක්රියාත්මක කිරීමක් මත පදනම්ව එහි සාරාංශයක් (එනම් අතුරු මුහුණත) මත රඳා පවතී. එය පහත් මට්ටමේ සංරචක වලින් ඉහළ මට්ටමේ සංරචක විකේතනය කරයි.
කිසිවක් කිරීමට සැබෑ හේතුවක් නැත. අතුරුමුහුණත් යනු ඔබට උදව් කිරීමට මිස ප්රතිදාන වැඩසටහනට නොවේ. එබැවින් අතුරු මුහුණත පන්ති මිලියනයක් විසින් ක්රියාත්මක කළද ඔබට එකක් නිර්මාණය කළ යුතු යැයි නීතියක් නොමැත. ඔබ හෝ ඔබේ කේතය භාවිතා කරන වෙනත් ඕනෑම කෙනෙකුට එය ක්රියාත්මක කිරීමට අවශ්ය යමක් වෙනස් කිරීමට අවශ්ය වන පරිදි ඔබ එය නිර්මාණය කරයි. අතුරු මුහුණතක් නිර්මාණය කිරීම මඟින් අනාගතයේදී එය ක්රියාත්මක කරන වෙනත් පන්තියක් නිර්මාණය කිරීමට ඔබට අවශ්ය වනු ඇත.
පන්තියක් සඳහා අතුරු මුහුණතක් නිර්වචනය කිරීමේ අවශ්යතාවයක් සෑම විටම නොමැත.
වටිනා වස්තු වැනි සරල වස්තු වලට බහු ක්රියාත්මක කිරීම් නොමැත. ඔවුන්ට සමච්චල් කිරීමටද අවශ්ය නැත. ක්රියාත්මක කිරීම තනිවම පරීක්ෂා කළ හැකි අතර ඒවා මත යැපෙන වෙනත් පංති පරීක්ෂා කළ විට සත්ය අගය වස්තුව භාවිතා කළ හැකිය.
අතුරු මුහුණතක් නිර්මාණය කිරීම සඳහා පිරිවැයක් ඇති බව මතක තබා ගන්න. එය ක්රියාත්මක කිරීම දිගේ යාවත්කාලීන කළ යුතුය, එයට අමතර ගොනුවක් අවශ්ය වන අතර සමහර IDE හට අතුරු මුහුණත නොව ක්රියාත්මක කිරීමේදී විශාලනය කිරීමේ අපහසුතාවයක් ඇති වේ.
එබැවින් මම අතුරුමුහුණත් නිර්වචනය කරන්නේ ඉහළ මට්ටමේ පන්ති සඳහා පමණි, එහිදී ඔබට ක්රියාත්මක කිරීමෙන් සාරාංශයක් අවශ්ය වේ.
පංතියක් සමඟ ඔබට නොමිලේ අතුරු මුහුණතක් ලැබෙන බව සලකන්න. ක්රියාත්මක කිරීමට අමතරව, පන්තියක් පොදු ක්රම සමූහයෙන් අතුරු මුහුණතක් අර්ථ දක්වයි. එම අතුරුමුහුණත සියලු ව්යුත්පන්න පංති විසින් ක්රියාත්මක කරනු ලැබේ. එය අතුරු මුහුණතක් තදින් කථා නොකරයි, නමුත් එය හරියටම එකම ආකාරයකින් භාවිතා කළ හැකිය. එබැවින් පන්තියේ නාමය යටතේ දැනටමත් පවතින අතුරු මුහුණතක් ප්රතිනිර්මාණය කිරීම අවශ්ය යැයි මම නොසිතමි.