එක් පන්තියක් පමණක් එය ක්‍රියාත්මක කරන විට මට අතුරු මුහුණතක් භාවිතා කිරීමට අවශ්‍යද?


259

බහුවිධ පංති නීති රීති හා ක්‍රියාත්මක කිරීම් මාලාවක් අනුගමනය කරන අතුරු මුහුණතක සමස්ත ලක්ෂ්‍යය නොවේද?



18
නැතහොත් එකමුතුව පහසු කිරීම.

11
බහු පංතිවලට අතුරුමුහුණත් ක්‍රියාත්මක කිරීමට ඉඩ දීම සහ ඔබේ කේතය අතුරුමුහුණත් මත රඳා පැවතීම ඒකක පරීක්ෂණ සඳහා හුදකලා වීමට අත්‍යවශ්‍ය වේ. ඔබ ඒකක පරීක්ෂණයක් කරන්නේ නම්, ඔබට එම අතුරු මුහුණත ක්‍රියාත්මක කරන වෙනත් පන්තියක් ඇත.
StuperUser

2
මෙම ප්‍රශ්නය පිළිබඳ රෙඩ්ඩිට් සාකච්ඡාව .
yannis

6
පොදු ක්ෂේත්‍ර සහ ක්‍රම ඔවුන්ගේම අතින් “අතුරු මුහුණතක්” වේ. බහුමාපකයේ lack නතාවය හිතාමතාම සැලසුම් කර ඇත්නම් අතුරු මුහුණතක් භාවිතා කිරීමට හේතුවක් නැත. සඳහන් කර ඇති අනෙක් අය පරීක්ෂා කරන බහුඅවයවිකතාව සැලසුම් සහගතව භාවිතා කිරීමකි.
mike30

Answers:


210

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

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


85
+1 පරීක්ෂාව යන්නෙන් අදහස් වන්නේ ඔබට සෑම විටම පාහේ ක්‍රියාත්මක කිරීම් දෙකක් ඇති බවයි
jk.

24
Ann යානිස් රිසෝස් යග්නි නිසා ඔබේ අවසාන කරුණ සමඟ එකඟ නොවන්න. පංති පරිභෝජනය කිරීමේදී CFoo වෙනුවට IFoo සමඟ ආදේශ කිරීම මෙන්ම පංති වලින් පොදු අතුරුමුහුණතක් ලබා ගැනීම සුළුපටු ය. අවශ්‍යතාවයට පෙර එය ලිවීමේ කිසිදු තේරුමක් නැත.
ඩෑන් ඊස් ෆයිඩ්ලිං ෆයර්ලයිට්

5
මම තවමත් ඔබේ තර්කය අනුගමනය කරන බව මට විශ්වාස නැත. කේත උත්පාදනය කිරීමේ මෙවලම් කාරණයෙන් පසුව එය එකතු කිරීම වඩා ලාභදායී බැවින්, ඔබට ඒ සඳහා පැහැදිලි අවශ්‍යතාවයක් ඇති වීමට පෙර අතුරු මුහුණත නිර්මාණය කිරීමට ඊටත් වඩා අඩු හේතුවක් මම දකිමි.
ඩෑන් ඊස් ෆයිඩ්ලිං ෆයර්ලයිට්

7
මම හිතන්නේ නැතිවූ අතුරුමුහුණතක් යග්නි සඳහා හොඳ උදාහරණයක් නොව “කැඩුණු කවුළුවක්” සහ නැතිවූ ප්‍රලේඛනයකි. පංතියේ පරිශීලකයින්ට වියුක්ත කිරීම වෙනුවට ක්‍රියාත්මක කිරීමට එරෙහිව කේත කිරීමට ප්‍රායෝගිකව බල කෙරෙයි.
ෆේබියෝ ෆ්‍රැකැසි

11
කිසියම් පරීක්ෂණ රාමුවක් තෘප්තිමත් කිරීම සඳහා ඔබ කවදා හෝ ඔබේ කේත පදනම අර්ථ විරහිත කබොල්ලකින් දූෂණය කරන්නේ ඇයි? මම බැරෑරුම් ලෙස අදහස් කරන්නේ, මම ස්වයං-ඉගැන්වූ ජාවාස්ක්‍රිප්ට් සේවාදායක පාර්ශවකරුවෙකු වන අතර ඩබ්ලිව්ටීඑෆ් නිරාකරණය කිරීමට උත්සාහ කිරීම සී # සහ ජාවා සංවර්ධක ඕඕඩී ක්‍රියාවට නැංවීම වැරදියි. ඔවුන් ඔබේ අත්වලින් IDE කම්මුලට ගසා, ඔබ පාසැලේදී එවැනි දෙයක් කරන විට ඔවුන් ඔබව අල්ලා ගන්නා විට පිරිසිදු, පැහැදිලි කේතයක් ලිවීමට ඉගෙන ගන්නා තෙක් එය නැවත ලබා ගැනීමට ඔබට ඉඩ නොදෙයිද? එය අසභ්‍යයි.
එරික් රෙපන්

154

ඔබට පිළිතුරු සපයන්නේ ඔබට අතුරු මුහුණතක් අවශ්‍යද නැද්ද යන්න පංති කීයක් ක්‍රියාත්මක කරයිද යන්න මත රඳා නොපවතී . අතුරුමුහුණත් යනු ඔබගේ යෙදුමේ බහු උප පද්ධති අතර ගිවිසුම් නිර්වචනය කිරීමේ මෙවලමකි ; එබැවින් ඇත්ත වශයෙන්ම වැදගත් වන්නේ ඔබේ යෙදුම උප පද්ධතිවලට බෙදා ඇති ආකාරයයි. කොපමණ පංති ක්‍රියාත්මක කළත්, සංවෘත උප පද්ධතිවල ඉදිරිපස කෙළවර ලෙස අතුරු මුහුණත් තිබිය යුතුය.

මෙන්න ඉතා ප්‍රයෝජනවත් එක් නියමයකි:

  • ඔබ පන්තිය Fooකෙලින්ම පන්තියට යොමු කරන්නේ නම් BarImpl, ඔබ වෙනස් වන Fooසෑම අවස්ථාවකම වෙනස් කිරීමට ඔබ දැඩි ලෙස කැපවී සිටී BarImpl. ඔබ මූලික වශයෙන් සලකන්නේ පන්ති දෙකක් පුරා බෙදී ඇති කේත ඒකකයක් ලෙස ය.
  • ඔබ අතුරුමුහුණතFoo වෙත යොමු කරන්නේ නම් , ඔබ වෙනස් වන විට සිදුවන වෙනස්කම් වළක්වා ගැනීම සඳහා ඔබම කැපවී සිටී . BarFooBarImpl

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

මේ සියල්ලට අමතරව (හෝ ඇත්ත වශයෙන්ම එය නිසා), අතුරුමුහුණත් වෙනම සම්පාදනය ප්‍රවර්ධනය කරයි. අතුරුමුහුණත් සම්පාදනය කිරීම සුළුපටු වන අතර ඒවා ක්‍රියාත්මක කිරීමට වඩා අඩු පරායත්තතා ඇති බැවින්, එයින් අදහස් වන්නේ ඔබ Fooඅතුරු මුහුණතක් භාවිතා කිරීම සඳහා පන්තිය ලියන්නේ නම් Bar, සාමාන්‍යයෙන් නැවත සම්පාදනය BarImplකිරීමකින් තොරව නැවත සකස් කළ හැකි Fooබවයි. විශාල යෙදුම් වලදී මෙය බොහෝ කාලයක් ඉතිරි කර ගත හැකිය.


18
මට හැකි නම්, මම මෙය කිහිප වතාවක් වැඩි දියුණු කරමි. IMO මෙම ප්‍රශ්නයට හොඳම පිළිතුරයි.
ෆේබියෝ ෆ්‍රකාසි

5
පංතිය එක් භූමිකාවක් පමණක් ඉටු කරන්නේ නම් (එනම් ඒ සඳහා එක් අතුරු මුහුණතක් පමණක් අර්ථ දක්වා ඇත), එසේ නම් මෙය රාජ්‍ය / පෞද්ගලික ක්‍රම හරහා නොකරන්නේ ඇයි?
මැතිව් ෆින්ලේ

4
1. කේත සංවිධානය; අත්සන් සහ ප්‍රලේඛන අදහස් පමණක් ඇති අතුරු මුහුණත තමන්ගේම ගොනුවක තිබීම කේත පිරිසිදුව තබා ගැනීමට උපකාරී වේ. 2. ඔබ පෞද්ගලිකව තබා ගැනීමට කැමති ක්‍රම හෙළි කිරීමට ඔබට බල කරන රාමු (උදා: පොදු සැකසුම් හරහා යැපීම් එන්නත් කරන බහාලුම්). 3. දැනටමත් සඳහන් කර ඇති පරිදි වෙනම සම්පාදනය; පන්ති නම් Fooඅතුරු මුහුණත මත රඳා පවතී Barනම් BarImplrecompile කිරීමට තොරව වෙනස් කළ හැකිය, Foo. 4. රාජ්‍ය / පෞද්ගලික දීමනා වලට වඩා සිහින්ව ප්‍රවේශවීමේ පාලනය (එකම පන්තිය සේවාදායකයින් දෙදෙනෙකුට විවිධ අතුරුමුහුණත් හරහා නිරාවරණය කරන්න).
සකුන්ඩිම්

3
අවසාන එක: 5. සේවාදායකයින් (ඉතා මැනවින්) මගේ මොඩියුලය කොපමණ පන්ති ප්‍රමාණයක් හෝ කීයක් තිබේද යන්න හෝ නොසලකා හැරිය යුතුය. ඔවුන් දැකිය යුත්තේ වර්ග සමූහයක් වන අතර සමහර කර්මාන්තශාලා හෝ මුහුණත බෝල රෝල් කිරීම සඳහා ය. එනම්, ඔබේ පුස්තකාලය සමන්විත වන පන්ති පවා සංයුක්ත කිරීමේ වටිනාකම මම බොහෝ විට දකිමි.
සකුන්ඩිම්

7
acacundim BarImpl 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බාර් ක්‍රියාත්මක කරන අවස්ථාව ගැන ය. බහු පංති තත්වයන් සඳහා, පරායත්ත ප්‍රතිලෝම මූලධර්මය සහ එය අතුරුමුහුණත ප්‍රයෝජනවත් වන්නේ කෙසේදැයි මම තේරුම් ගතිමි.
ෂිෂීර් ගුප්තා

103

හැසිරීම නිර්වචනය කිරීම සඳහා අතුරුමුහුණත් නම් කර ඇත, එනම් ශ්‍රිත / ක්‍රමවල මූලාකෘති සමූහයකි. අතුරුමුහුණත ක්‍රියාත්මක කරන වර්ග එම හැසිරීම ක්‍රියාත්මක කරනු ඇත, එබැවින් ඔබ එවැනි වර්ගයක් සමඟ ගනුදෙනු කරන විට (අර්ධ වශයෙන්) එහි ඇති හැසිරීම කුමක්දැයි ඔබ දනී.

අතුරුමුහුණතක් නිර්වචනය කිරීමේ අවශ්‍යතාවයක් නැත, එය අර්ථ දක්වා ඇති හැසිරීම එක් වරක් පමණක් භාවිතා කරනු ඇති බව ඔබ දන්නේ නම්. KISS (සරල ලෙස තබා ගන්න, මෝඩ)


සෑම විටම නොවේ, එම පන්තිය සාමාන්‍ය පන්තියක් නම් ඔබට එක් පන්තියක අතුරු මුහුණත භාවිතා කළ හැකිය.
ජෝන් යෙසායා කර්මෝනා

1
තවද, නවීන IDE හි "නිස්සාරණ අතුරුමුහුණතක්" ප්‍රතිනිර්මාණය කිරීම සමඟ පහසුවෙන් අවශ්‍ය වූ විට ඔබට අතුරු මුහුණතක් හඳුන්වා දිය හැකිය.
හාන්ස්-පීටර් ස්ටෝර්

පොදු ස්ථිතික ක්‍රම සහ පුද්ගලික ඉදිකිරීම්කරුවෙකු පමණක් සිටින උපයෝගිතා පන්තියක් සලකා බලන්න - ජොෂුවා බ්ලොච් සහ වෙනත් කතුවරුන් විසින් පරිපූර්ණ ලෙස පිළිගත හැකි සහ ප්‍රවර්ධනය කරන ලද.
ඩැරල් ටීග්

62

න්‍යාය අනුව ඔබට අතුරු මුහුණතක් තිබීම සඳහා අතුරු මුහුණතක් නොතිබිය යුතු අතර, යානිස් රිසෝස්ගේ පිළිතුර තවදුරටත් සංකූලතා පිළිබඳව ඉඟි කරයි:

ඔබ ඒකක පරීක්ෂණ ලියන විට සහ Moq හෝ FakeItEasy වැනි ව්‍යාජ රාමු භාවිතා කරන විට (මා භාවිතා කළ නවතම ඒවා දෙක නම් කිරීමට), ඔබ ව්‍යංගයෙන් අතුරු මුහුණත ක්‍රියාත්මක කරන වෙනත් පන්තියක් නිර්මාණය කරයි. කේතය හෝ ස්ථිතික විශ්ලේෂණය සෙවීමෙන් එක් ක්‍රියාත්මක කිරීමක් පමණක් ඇති බව පැවසිය හැකි නමුත් ඇත්ත වශයෙන්ම අභ්‍යන්තර විහිළු ක්‍රියාත්මක කිරීම තිබේ. ඔබ විහිළු ලිවීම ආරම්භ කරන සෑම විටම, අතුරු මුහුණත් උපුටා ගැනීම අර්ථවත් බව ඔබට පෙනී යනු ඇත.

නමුත් රැඳී සිටින්න, තවත් බොහෝ දේ ඇත. ව්‍යංග අතුරුමුහුණත් ක්‍රියාත්මක කිරීම් ඇති තවත් අවස්ථා තිබේ. .NET හි WCF සන්නිවේදන තොගය භාවිතා කිරීම දුරස්ථ සේවාවක් සඳහා ප්‍රොක්සියක් ජනනය කරන අතර එය නැවත අතුරු මුහුණත ක්‍රියාත්මක කරයි.

පිරිසිදු කේත පරිසරයක, මෙහි ඇති අනෙක් පිළිතුරු සමඟ මම එකඟ වෙමි. කෙසේ වෙතත්, අතුරුමුහුණත් භාවිතා කළ හැකි ඕනෑම රාමු, රටා හෝ පරායත්තතාවයන් කෙරෙහි අවධානය යොමු කරන්න.


2
+1: YAGNI මෙහි අදාළ වන බව මට විශ්වාස නැත, අතුරු මුහුණතක් තිබීම සහ අතුරුමුහුණත් භාවිතා කරන රාමු (උදා: JMock, ආදිය) භාවිතා කිරීමෙන් ඔබේ කාලය ඉතිරි කර ගත හැකිය.
ඩෙකෝ

4
E ඩෙකෝ: හොඳ විහිළු රාමු (ඒවා අතර JMock) අතුරුමුහුණත් පවා අවශ්‍ය නොවේ.
මයිකල් බොර්ග්වර්ඩ්

13
ඔබගේ සමච්චල් කිරීමේ රාමුවේ සීමාවක් නිසා පමණක් අතුරු මුහුණතක් නිර්මාණය කිරීම මට භයානක හේතුවක් සේ පෙනේ. උදාහරණයක් ලෙස, ඊසිමොක් පන්තියක් සමච්චලයට ලක් කිරීම කෙසේ වෙතත් අතුරු මුහුණතක් තරම් පහසුය.
ඇල්බේනියාව

8
මම කියන්නේ ඒක අනිත් පැත්තෙන්. පරීක්ෂණයේදී ව්‍යාජ වස්තූන් භාවිතා කිරීම යනු අර්ථ දැක්වීම අනුව ඔබේ අතුරුමුහුණත් සඳහා විකල්ප ක්‍රියාත්මක කිරීම් නිර්මාණය කිරීමයි. ඔබ ඔබේම ව්‍යාජ ක්‍රියාත්මක කිරීමේ පන්ති සාදන්නේද නැතහොත් සමච්චල් කිරීමේ රාමු ඔබට බර ඉසිලීම සිදු කරයිද යන්න මෙය සත්‍යයකි. කොන්ක්‍රීට් පංති සමච්චලයට ලක් කිරීම සඳහා විවිධ හක්ක සහ පහත් මට්ටමේ උපක්‍රම භාවිතා කරන ඊසි මොක් වැනි සමහර රාමු තිබිය හැකිය - සහ ඒවාට වැඩි බලයක්! - නමුත් සංකල්පමය වශයෙන්, ව්‍යාජ වස්තු යනු කොන්ත්‍රාත්තුවක් සඳහා විකල්ප ක්‍රියාත්මක කිරීමකි.
අව්නර් ෂහාර්-කෂ්තාන්

1
ඔබ නිෂ්පාදනයේ පරීක්ෂණ වලින් ඉවත් නොවේ. අතුරු මුහුණතක් අවශ්‍ය නැති, අතුරු මුහුණතක් අවශ්‍ය නොවන පන්තියකට සරදම් කරන්නේ ඇයි?
එරික් රෙපන්

41

නැත, ඔබට ඒවා අවශ්‍ය නොවන අතර සෑම පන්ති යොමු කිරීමක් සඳහාම ස්වයංක්‍රීයව අතුරු මුහුණත් සෑදීම ප්‍රති-රටාවක් ලෙස මම සලකමි.

සෑම දෙයක් සඳහාම 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 ප්‍රවේශය ප්‍රධාන සීමාවන් වේ. අතර ඇති සියලුම පන්ති / ක්‍රම ඇමතුම් එසේ නොවේ. ඩීඅයිපී සඳහා ද එසේමය.

මෙයද බලන්න:


6
සුපිරි පන්තියේ ඉදිකිරීම්කරු ධාවනය වැළැක්වීමට ක්‍රමයක් නොමැති බැවින් අතුරුමුහුණත් වලට වඩා සමච්චල් කිරීමේ පන්ති (අවම වශයෙන් ජාවා සහ සී # වලින්) අතහැර දැමිය යුතු යැයි සැලකිය යුතුය, එමඟින් ඔබේ විහිළු වස්තුව පරිසරය සමඟ අනපේක්ෂිත ආකාරයකින් අන්තර්ක්‍රියා කිරීමට හේතු විය හැක. ඉදිකිරීම් කේතය ගැන ඔබ සිතිය යුතු නැති නිසා අතුරු මුහුණතක් සමච්චල් කිරීම ආරක්ෂිත සහ පහසුය.
ජූල්ස්

7
සමච්චල් කිරීමේ පන්ති සම්බන්ධව මම ගැටළු වලට මුහුණ දී නැත, නමුත් IDE සංචලනය බලාපොරොත්තු වූ පරිදි ක්‍රියා නොකිරීම නිසා මම කලකිරීමට පත්ව සිටිමි. සැබෑ ගැටළුවක් විසඳීම උපකල්පිතයකට පහර දෙයි.
wrschneider

1
@ ජූල්ස් ඔබට ජාවාහි ඉදිකිරීම්කරු ඇතුළු කොන්ක්‍රීට් පන්තියක් සමච්චලයට ලක් කළ හැකිය.
assylias

1
@assylias ඔබ ඉදිකිරීම්කරු ධාවනය වළක්වන්නේ කෙසේද?
ජූල්ස්

3
Ules ජූල්ස් එය ඔබගේ සමච්චල් කිරීමේ රාමුව මත රඳා පවතී - උදාහරණයක් ලෙස jmockit සමඟ, ඔබට ලිවිය හැකි new Mockup<YourClass>() {}අතර එහි ඉදිකිරීම්කරුවන් ඇතුළු මුළු පන්තියම සමච්චලයට ලක් වේ, එය අතුරු මුහුණතක්, වියුක්ත පන්තියක් හෝ කොන්ක්‍රීට් පන්තියක් වේවා. ඔබට එසේ කිරීමට අවශ්‍ය නම් ඉදිකිරීම්කරුගේ හැසිරීම "අභිබවා" යා හැකිය. මොකිටෝ හෝ පවර්මොක්හි සමාන ක්‍රම ඇතැයි මම සිතමි.
assylias

23

වැටෙහි දෙපස ඇති පිළිතුරු මෙහි සාරාංශගත කළ හැකි බව පෙනේ:

හොඳින් සැලසුම් කර අතුරු මුහුණත් අවශ්‍ය තැන අතුරුමුහුණත් තබන්න.

යානිගේ පිළිතුරට මා දැක්වූ ප්‍රතිචාරයේ මා සඳහන් කළ පරිදි , ඔබට අතුරු මුහුණත් පිළිබඳ දැඩි හා වේගවත් රීතියක් තිබිය හැකි යැයි මම නොසිතමි. රීතිය අර්ථ දැක්වීම අනුව නම්යශීලී විය යුතුය. අතුරුමුහුණත් පිළිබඳ මගේ රීතිය නම් ඔබ 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. මීට්පේස් මෝටර් රථයක, ජ්වලන ස්විචය වගකිව යුත්තේ:

  1. පරිශීලකයා සත්‍යාපනය කිරීම (හඳුනා නොගැනීම) (ඔවුන්ට නිවැරදි යතුර අවශ්‍යයි)
  2. ස්ටාර්ටරයට ධාරාව සැපයීම නිසා එය සැබවින්ම මෝටර් රථය ආරම්භ කළ හැකිය
  3. ජ්වලන පද්ධතියට ධාරාව සැපයීම නිසා එය දිගටම ක්‍රියාත්මක විය හැකිය
  4. ධාරාව වසා දැමීමෙන් මෝටර් රථය නතර වනු ඇත.
  5. ඔබ එය නරඹන ආකාරය මත පදනම්ව, බොහෝ (සියල්ලම?) නව මෝටර් රථවල ස්විචයක් ඇති අතර එය සම්ප්‍රේෂණය උද්‍යානයෙන් පිටත තිබියදී ජ්වලනයෙන් යතුර ඉවත් කිරීම වළක්වයි, එබැවින් මෙය එහි වසමේ කොටසක් විය හැකිය. (ඇත්තටම එයින් අදහස් කරන්නේ මගේ පද්ධතිය ගැන නැවත සිතා බැලිය යුතු බවයි ...)

එම ගුණ හදාගන්න වසම පිළිබඳ IgnitionSwitchඒ ගැන දන්නවා හා වගකිව යුතු දේ,, හෝ වෙනත් වචන වලින්.

IgnitionSwitchසඳහා වගකිව යුතු නොවේ GasPedal. ජ්වලන ස්විචය සෑම ආකාරයකින්ම ගෑස් පැඩලය ගැන සම්පූර්ණයෙන්ම නොදැන සිටී. ඔවුන් දෙදෙනාම එකිනෙකාගෙන් සම්පූර්ණයෙන්ම ස්වාධීනව ක්‍රියාත්මක වේ (මෝටර් රථ දෙකම නොමැතිව තරමක් නිෂ් less ල වනු ඇත!).

මා මුලින් සඳහන් කළ පරිදි එය ඔබගේ සැලසුම මත රඳා පවතී. ඔබට IgnitionSwitchඅගයන් දෙකක් ඇති එකක් නිර්මාණය කළ හැකිය : ඔන් ( True) සහ ඕෆ් ( False). නැතහොත් ඒ සඳහා සපයා ඇති යතුර සහ වෙනත් ක්‍රියා රාශියක් සත්‍යාපනය කිරීම සඳහා ඔබට එය සැලසුම් කළ හැකිය. සංවර්ධකයෙකු වීමේ දුෂ්කර කොටස එයයි වැල්ලේ රේඛා අඳින්නේ කොතැනද යන්න තීරණය කිරීම - සහ අවංකවම බොහෝ විට එය සම්පූර්ණයෙන්ම සාපේක්ෂයි. වැලි වල ඇති රේඛා වැදගත් වුවත් - ඔබේ API ඇත්තේ එතැනිනි, එවිට ඔබේ අතුරුමුහුණත් තිබිය යුතුය.


කරුණාකර "එයටම ආවේණික වසමක් තිබේ" යන්නෙන් ඔබ අදහස් කරන දේ ගැන වැඩි විස්තර කළ හැකිද?
ලැමින් සනී

1
@ ලමින්සැනේ, විස්තාරනය. එය උපකාරවත් වේද?
වේන් වර්නර්

8

නැත (YAGNI) , ඔබ මෙම අතුරුමුහුණත භාවිතා කර වෙනත් පන්ති සඳහා පරීක්ෂණ ලිවීමට අදහස් කරන්නේ නම් මිස, එම පරීක්ෂණ අතුරු මුහුණත සමච්චලයට ලක් කිරීමෙන් ප්‍රයෝජන ලබයි.


8

MSDN වෙතින් :

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

බහුවිධ අතුරුමුහුණත් ක්‍රියාත්මක කළ හැකි තනි ක්‍රියාත්මක කිරීමක් ඔබට අර්ථ දැක්විය හැකි නිසා අතුරු මුහුණත් මූලික පන්තිවලට වඩා නම්‍යශීලී වේ.

මූලික පන්තියකින් ක්‍රියාත්මක කිරීම ඔබට උරුම කර ගැනීමට අවශ්‍ය නොවන අවස්ථාවන්හිදී අතුරු මුහුණත් වඩා හොඳය.

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

සාමාන්‍යයෙන් තනි පංතියක දී, අතුරු මුහුණතක් ක්‍රියාත්මක කිරීම අවශ්‍ය නොවනු ඇත, නමුත් ඔබේ ව්‍යාපෘතියේ අනාගතය සැලකිල්ලට ගනිමින්, පන්තිවල අවශ්‍ය හැසිරීම විධිමත් ලෙස අර්ථ දැක්වීම ප්‍රයෝජනවත් විය හැකිය.


5

ප්රශ්නයට පිළිතුරු සැපයීම සඳහා: ඊට වඩා වැඩි යමක් ඇත.

අතුරුමුහුණතක එක් වැදගත් අංගයක් වන්නේ අභිප්‍රායයි.

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

ඇසිය යුතු පළමු ප්‍රශ්නය නම් ඔබ නියෝජනය කිරීමට උත්සාහ කරන දෙය හෝ ක්‍රියාවලියේ ස්වභාවය කුමක්ද යන්නයි. එම ස්වභාවය යම් ආකාරයකින් ක්‍රියාත්මක කිරීමට ප්‍රායෝගික හේතු අනුගමනය කරන්න.


5

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

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

කොන්ත්රාත්තුව නිර්වචනය කළ පසු, කණ්ඩායම් දෙකකට හෝ වැඩි ගණනකට ස්වාධීනව වැඩ කළ හැකිය. ඔබ A මොඩියුලයක් මත වැඩ කරන බවත් එය B මොඩියුලය මත රඳා පවතින බවත් පවසන්න, B හි අතුරු මුහුණතක් නිර්මාණය කිරීම B හි ක්‍රියාත්මක කිරීම ගැන කරදර නොවී ඔබේ වැඩ කටයුතු කරගෙන යාමට ඉඩ සලසයි. මේ අනුව, බෙදා හරින ලද වැඩසටහන්කරණය හැකි වේ.

B මොඩියුලයට එහි අතුරු මුහුණතේ එක් ක්‍රියාත්මක කිරීමක් පමණක් තිබුණද, අතුරු මුහුණත තවමත් අවශ්‍ය වේ.

අවසාන වශයෙන්, අතුරු මුහුණතක් එහි පරිශීලකයින්ගෙන් ක්‍රියාත්මක කිරීමේ තොරතුරු සඟවයි. කොන්ත්‍රාත්තුව නිර්වචනය කළ යුතු නිසා, වැඩි මොඩියුලර් මෘදුකාංගයක් ලිවීමට, ඒකක පරීක්ෂණ ප්‍රවර්ධනය කිරීමට සහ සංවර්ධන වේගය වේගවත් කිරීමට අවශ්‍ය නිසා අතුරු මුහුණතට ක්‍රමලේඛනය කිරීම තවත් ලේඛන ලිවීමට උපකාරී වේ.


2
සෑම පන්තියකටම පොදු අතුරු මුහුණතක් (පොදු ක්‍රම) සහ පුද්ගලික අතුරු මුහුණතක් (ක්‍රියාත්මක කිරීමේ විස්තර) තිබිය හැකිය. පංතියේ පොදු අතුරුමුහුණත කොන්ත්‍රාත්තුව යැයි මට තර්ක කළ හැකිය. එම කොන්ත්‍රාත්තුවට වැඩ කිරීමට ඔබට අමතර අංගයක් අවශ්‍ය නොවේ.
ෆුර්මනේටර්

4

මෙහි ඇති සියලුම පිළිතුරු ඉතා හොඳයි. ඇත්ත වශයෙන්ම බොහෝ විට ඔබට වෙනත් අතුරු මුහුණතක් ක්‍රියාත්මක කිරීමට අවශ්‍ය නොවේ . එහෙත්, ඔබ කොහේ නඩුව පවතින හැක කෙසේ හෝ එය කිරීමට අවශ්ය. මෙන්න මම එය කරන අවස්ථා කිහිපයක්:


තෙවන පාර්ශවීය කේතයට සම්බන්ධ වන ඇඩැප්ටර පන්තිය සමඟ බොහෝ විට සිදුවීමට මට අවශ්‍ය නැති පන්තිය තවත් අතුරු මුහුණතක් ක්‍රියාත්මක කරයි .

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

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


3

අතුරුමුහුණත් සැබවින්ම වැදගත් නමුත් ඔබ සතුව ඇති ඒවා පාලනය කිරීමට උත්සාහ කරන්න.

සෑම දෙයක් සඳහාම අතුරුමුහුණත් නිර්මාණය කිරීමේ පාරට බැස ඇති බැවින් 'කැඩුණු ස්පැගටි' කේතය සමඟ අවසන් වීම පහසුය. මෙම විෂය පිළිබඳව ඉතා wise ානවන්ත වචන කිහිපයක් පළ කර ඇති අයින්ඩේ රහියන්ගේ ප්‍ර wisdom ාව මම කල් තබමි.

http://ayende.com/blog/153889/limit-your-abstractions-analyzing-a-ddd-application

මෙය ඔහුගේ මුළු ලිපි මාලාවේම පළමු ලිපියයි, එබැවින් දිගටම කියවන්න!


'කැඩුණු ස්පැගටි' කේතය රවියෝලි
CurtainDog

මට වඩා ලස ag ් code- කේතය හෝ බක්ලාවා කේතය වැනි ශබ්ද - බොහෝ ස්ථර සහිත කේතය. ;-)
dodgy_coder

2

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


2

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


1

පන්තියක් සඳහා අතුරු මුහුණතක් නිර්වචනය කිරීමේ අවශ්‍යතාවයක් සෑම විටම නොමැත.

වටිනා වස්තු වැනි සරල වස්තු වලට බහු ක්‍රියාත්මක කිරීම් නොමැත. ඔවුන්ට සමච්චල් කිරීමටද අවශ්‍ය නැත. ක්‍රියාත්මක කිරීම තනිවම පරීක්‍ෂා කළ හැකි අතර ඒවා මත යැපෙන වෙනත් පංති පරීක්‍ෂා කළ විට සත්‍ය අගය වස්තුව භාවිතා කළ හැකිය.

අතුරු මුහුණතක් නිර්මාණය කිරීම සඳහා පිරිවැයක් ඇති බව මතක තබා ගන්න. එය ක්‍රියාත්මක කිරීම දිගේ යාවත්කාලීන කළ යුතුය, එයට අමතර ගොනුවක් අවශ්‍ය වන අතර සමහර IDE හට අතුරු මුහුණත නොව ක්‍රියාත්මක කිරීමේදී විශාලනය කිරීමේ අපහසුතාවයක් ඇති වේ.

එබැවින් මම අතුරුමුහුණත් නිර්වචනය කරන්නේ ඉහළ මට්ටමේ පන්ති සඳහා පමණි, එහිදී ඔබට ක්‍රියාත්මක කිරීමෙන් සාරාංශයක් අවශ්‍ය වේ.

පංතියක් සමඟ ඔබට නොමිලේ අතුරු මුහුණතක් ලැබෙන බව සලකන්න. ක්‍රියාත්මක කිරීමට අමතරව, පන්තියක් පොදු ක්‍රම සමූහයෙන් අතුරු මුහුණතක් අර්ථ දක්වයි. එම අතුරුමුහුණත සියලු ව්‍යුත්පන්න පංති විසින් ක්‍රියාත්මක කරනු ලැබේ. එය අතුරු මුහුණතක් තදින් කථා නොකරයි, නමුත් එය හරියටම එකම ආකාරයකින් භාවිතා කළ හැකිය. එබැවින් පන්තියේ නාමය යටතේ දැනටමත් පවතින අතුරු මුහුණතක් ප්‍රතිනිර්මාණය කිරීම අවශ්‍ය යැයි මම නොසිතමි.

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.