Objects ජු වස්තු ඉදිකිරීම වෙනුවට කර්මාන්තශාලා පන්තියක් භාවිතා කළ යුත්තේ ඇයි?


168

GitHub සහ CodePlex හි С # සහ ජාවා පන්ති පුස්තකාල ව්‍යාපෘති කිහිපයක ඉතිහාසය මා දැක ඇති අතර, සෘජු වස්තු ක්ෂණිකකරණයට වඩා කර්මාන්තශාලා පන්ති වෙත මාරු වීමේ ප්‍රවණතාවක් මම දකිමි.

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

එවැනි වෙනසක් ප්‍රයෝජනවත් වන්නේ ඇයි? මේ ආකාරයෙන් නැවත ප්‍රතිනිර්මාණය කිරීමේ තේරුම කුමක්ද? ස්ථිතික කර්මාන්තශාලා ක්‍රම ඇමතුම් මගින් පොදු පන්තියේ ඉදිකිරීම්කරුවන්ට ඇමතුම් ආදේශ කිරීමෙන් ලැබෙන ප්‍රතිලාභ මොනවාද?

මම පොදු ඉදිකිරීම්කරුවන් භාවිතා කළ යුත්තේ කවදාද, කර්මාන්තශාලා භාවිතා කළ යුත්තේ කවදාද?



1
රෙදි පන්තියක් / ක්‍රමයක් යනු කුමක්ද?
ඩොවල්

Answers:


59

කර්මාන්තශාලා පන්ති බොහෝ විට ක්‍රියාත්මක කරනු ලබන්නේ ව්‍යාපෘතියට SOLID මූලධර්ම වඩාත් සමීපව අනුගමනය කිරීමට ඉඩ සලසන බැවිනි . විශේෂයෙන්, අතුරු මුහුණත වෙන් කිරීම සහ පරායත්ත ප්‍රතිලෝම මූලධර්ම.

කර්මාන්තශාලා සහ අතුරුමුහුණත් මඟින් දිගු කාලීන නම්යශීලී බවක් ලබා ගත හැකිය. එය වඩාත් විසංයෝජනය කරන ලද - එබැවින් වඩාත් පරීක්ෂා කළ හැකි - සැලසුමකට ඉඩ දෙයි. මෙන්න ඔබ මෙම මාර්ගයට යා හැක්කේ මන්ද යන්න පිළිබඳ පරිපූර්ණ නොවන ලැයිස්තුවක්:

  • ප්‍රතිලෝම පාලක (IoC) බහාලුමක් පහසුවෙන් හඳුන්වා දීමට එය ඔබට ඉඩ සලසයි
  • ඔබට අතුරු මුහුණත් සමච්චලයට ලක් කළ හැකි බැවින් එය ඔබගේ කේතය වඩාත් පරීක්‍ෂා කළ හැකිය
  • යෙදුම වෙනස් කිරීමට කාලය පැමිණි විට එය ඔබට වැඩි නම්යතාවයක් ලබා දෙයි (එනම් යැපෙන කේතය වෙනස් නොකර ඔබට නව ක්‍රියාත්මක කිරීම් නිර්මාණය කළ හැකිය)

මෙම තත්වය සලකා බලන්න.

එකලස් කිරීම (-> යන්නෙන් රඳා පවතින්නේ):

Class A -> Class B
Class A -> Class C
Class B -> Class D

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

එකලස් කිරීම:

Class A -> Interface IB
Class A -> Interface IC
Class B -> Interface IB
Class C -> Interface IC
Class B -> Interface ID
Class D -> Interface ID

මට දැන් කිසිදු වේදනාවක් නොමැතිව B පන්තිය B එකලස් කිරීම සඳහා ගෙන යා හැකිය. එය තවමත් එකලස් කිරීමේ අතුරු මුහුණත් මත රඳා පවතී.

ඔබේ පරායත්තතා නිරාකරණය කිරීම සඳහා IoC බහාලුමක් භාවිතා කිරීමෙන් ඔබට ඊටත් වඩා නම්‍යශීලී බවක් ලබා දේ. ඔබ පන්තියේ පරායත්තතාවයන් වෙනස් කරන සෑම අවස්ථාවකම ඉදිකිරීම්කරු වෙත සෑම ඇමතුමක්ම යාවත්කාලීන කිරීමේ අවශ්‍යතාවයක් නොමැත.

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


43
IMO කර්මාන්තශාලා SOLID සඳහා අවම වශයෙන් වැදගත් දෙයකි. කර්මාන්තශාලා නොමැතිව ඔබට SOLID හොඳින් කළ හැකිය.
යූෆොරික්

28
මට කිසි විටෙකත් තේරුමක් නැති එක් දෙයක් නම්, ඔබ නව වස්තූන් සෑදීමට කර්මාන්තශාලා භාවිතා කරන්නේ නම් ඔබ කර්මාන්ත ශාලාව මුලින්ම සෑදිය යුතුය . ඉතින් එයින් ඔබට ලැබෙන්නේ කුමක්ද? කර්මාන්ත ශාලාව ඔබ විසින්ම ස්ථාපනය කිරීම වෙනුවට වෙනත් අයෙකු ඔබට ලබා දෙනු ඇතැයි උපකල්පනය කර තිබේද? මෙය පිළිතුරෙහි සඳහන් කළ යුතුය, එසේ නොමැතිනම් කර්මාන්තශාලා ඇත්ත වශයෙන්ම ඕනෑම ගැටළුවක් විසඳන්නේ කෙසේද යන්න පැහැදිලි නැත.
user541686

8
@ BЈовић - ඔබ නව ක්‍රියාත්මක කිරීමක් එක් කරන සෑම අවස්ථාවකම හැර, ඔබට දැන් කර්මාන්ත ශාලාව විවෘත කර නව ක්‍රියාත්මක කිරීම සඳහා එය වෙනස් කිරීමට සිදු වේ - පැහැදිලිවම OCP උල්ලං ting නය කිරීම.
ටෙලාස්ටින්

6
E ටෙලාස්ටින් ඔව්, නමුත් සාදන ලද වස්තු භාවිතා කරන කේතය වෙනස් නොවේ. එය වඩා වැදගත් වන්නේ කර්මාන්ත ශාලාවේ වෙනස්කම්.
BЈовић

8
පිළිතුර ආමන්ත්‍රණය කරන ඇතැම් ක්ෂේත්‍රවල කර්මාන්තශාලා ප්‍රයෝජනවත් වේ. ඒවා සෑම තැනකම භාවිතා කිරීම සුදුසු නොවේ . නිදසුනක් ලෙස, නූල් හෝ ලැයිස්තු සෑදීම සඳහා කර්මාන්තශාලා භාවිතා කිරීම බොහෝ දුරට ගෙන යනු ඇත. UDT සඳහා වුවද ඒවා සැමවිටම අවශ්‍ය නොවේ. ප්රධාන දෙය නම් අතුරු මුහුණතක් හරියටම ක්රියාත්මක කිරීම අවලංගු කිරීමට අවශ්ය විට කර්මාන්ත ශාලාවක් භාවිතා කිරීමයි.

132

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

කාරණය නම්, කර්මාන්තශාලා (සහ සිංගල්ටන්) ක්‍රියාත්මක කිරීම අතිශයින්ම පහසු වන අතර එම නිසා මිනිසුන් ඒවා අවශ්‍ය නොවන ස්ථානවල පවා භාවිතා කරයි. එබැවින් ක්‍රමලේඛකයා සිතන විට "මෙම කේතයේ මා භාවිතා කළ යුත්තේ කුමන මෝස්තර රටාද?" කර්මාන්ත ශාලාව මුලින්ම ඔහුගේ මතකයට එයි.

බොහෝ කර්මාන්තශාලා නිර්මාණය වී ඇත්තේ "සමහර විට, යම් දවසක මට එම පන්ති වෙනස් ආකාරයකින් නිර්මාණය කිරීමට අවශ්‍ය වනු ඇත" යනුවෙනි. එය YAGNI හි පැහැදිලි උල්ලං is නය කිරීමකි .

ඔබ IoC රාමුව හඳුන්වා දෙන විට කර්මාන්තශාලා යල් පැන යයි, මන්ද IoC යනු එක්තරා ආකාරයක කර්මාන්ත ශාලාවක් වන බැවිනි. බොහෝ IoC රාමු වලට විශේෂිත කර්මාන්තශාලා ක්‍රියාත්මක කිරීම නිර්මාණය කළ හැකිය.

එසේම, CreateXXXඉදිකිරීම්කරුවන් පමණක් කැඳවන ක්‍රම සමඟ විශාල ස්ථිතික පන්ති නිර්මාණය කිරීමට පවසන මෝස්තර රටාවක් නොමැත . එය විශේෂයෙන් කර්මාන්තශාලාවක් (හෝ වියුක්ත කර්මාන්ත ශාලාවක්) ලෙස හැඳින්වේ.


6
"IoC යනු කර්මාන්තශාලාවක්" හැර ඔබේ බොහෝ කරුණු සමඟ මම එකඟ වෙමි : IoC බහාලුම් කර්මාන්තශාලා නොවේ . ඒවා යැපුම් එන්නත් ලබා ගැනීම සඳහා පහසු ක්‍රමයකි. ඔව්, සමහරුන්ට ස්වයංක්‍රීය කර්මාන්තශාලා ඉදිකිරීමට හැකියාවක් ඇත, නමුත් ඒවා කර්මාන්තශාලා නොවන අතර ඒවා ලෙස සැලකිය යුතු නොවේ. මමත් යග්නි කාරණය සමඟ පොරබදමි. ඔබේ ඒකක පරීක්ෂණයෙන් පරීක්ෂණ දෙගුණයක් ආදේශ කිරීමට හැකිවීම ප්‍රයෝජනවත් වේ. කාරණයෙන් පසු මෙය සැපයීම සඳහා සෑම දෙයක්ම ප්‍රතිනිර්මාණය කිරීම බූරුවාගේ වේදනාවකි . කල්තියා සැලසුම් කර "යග්නි" නිදහසට කරුණක්
නොකරන්න

11
Lex ඇලෙක්ස් ජී - අහ් ... ප්‍රායෝගිකව, සියලුම අයිඕසී බහාලුම් කර්මාන්තශාලා ලෙස ක්‍රියා කරයි.
ටෙලාස්ටින්

8
Lex ඇලෙක්ස් අයිඕසී හි මූලික අවධානය යොමු වන්නේ වින්‍යාසය / සම්මුතිය මත පදනම්ව වෙනත් වස්තූන් වෙත ගමන් කිරීම සඳහා කොන්ක්‍රීට් වස්තු තැනීම ය. මෙය කර්මාන්තශාලාව භාවිතා කිරීම හා සමානයි. පරීක්ෂණය සඳහා විහිළුවක් නිර්මාණය කිරීමට ඔබට කර්මාන්තශාලාවක් අවශ්‍ය නොවේ. ඔබ ක්ෂණිකව හා සමච්චලයට කෙලින්ම සමත් වන්න. මම පළමු ඡේදයේ කීවාක් මෙන්. කර්මාන්තශාලා ප්‍රයෝජනවත් වන්නේ ඔබට මොඩියුලය භාවිතා කරන්නාට නිදසුනක් නිර්මාණය කිරීමට අවශ්‍ය වූ විට පමණි.
යූෆොරික්

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

5
Re: "තවද ඔබට පරීක්ෂණය සඳහා විහිළුවක් නිර්මාණය කිරීමට කර්මාන්තශාලාවක් අවශ්‍ය නොවේ. ඔබ සමච්චලයට ලක් කර කෙලින්ම සමච්චලයට ලක් කරන්න" - නැවතත්, විවිධ තත්වයන්. උදාහරණයක් ඉල්ලා සිටීමට ඔබ කර්මාන්ත ශාලාවක් භාවිතා කරයි - පාරිභෝගිකයා මෙම අන්තර්ක්‍රියා පාලනය කරයි. ඉදිකිරීම්කරු හරහා ක්‍රමයක් සැපයීම හෝ ක්‍රමයක් ක්‍රියාත්මක නොවේ, එය වෙනස් අවස්ථාවකි.
ඇලෙක්ස්ෆොක්ස්ගිල්

81

කර්මාන්තශාලා රටා ප්‍රචලිත වන්නේ "නව" මූල පදය භාවිතා කිරීම නරක යැයි "සී-ශෛලියේ" භාෂාවල (සී / සී ++, සී #, ජාවා) කෝඩරයන් අතර ඇති පාහේ විශ්වාස කළ හැකි විශ්වාසයකින් ය. අවම වශයෙන් මධ්‍යගත). මෙය අනෙක් අතට තනි වගකීම් මූලධර්මය (SOLID හි "S") සහ පරායත්ත ප්‍රතිලෝම මූලධර්මය ("D") පිළිබඳ අතිශය දැඩි අර්ථ නිරූපණයකින් පැමිණේ. සරලව කිවහොත්, SRP පවසන්නේ ඉතා මැනවින් කේත වස්තුවකට “වෙනස් වීමට එක් හේතුවක්” තිබිය යුතු අතර එකක් පමණක්; “වෙනස් වීමට හේතුව” යනු එම වස්තුවේ කේන්ද්‍රීය අරමුණයි, කේත පදනමේ එහි “වගකීම” සහ කේත වෙනස් කිරීම අවශ්‍ය වෙනත් ඕනෑම දෙයකට එම පන්ති ගොනුව විවෘත කිරීම අවශ්‍ය නොවේ. ඩීඅයිපී ඊටත් වඩා සරල ය; කේත වස්තුවක් කිසි විටෙකත් වෙනත් කොන්ක්‍රීට් වස්තුවක් මත රඳා නොපවතී,

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

එබැවින්, ඒ වෙනුවට, MyFooObject හි සියලුම පාරිභෝගිකයින් කෙලින්ම "IFooObject" මත රඳා පැවතිය යුතුය, එය MyFooObject ඇතුළු පන්ති ක්‍රියාත්මක කිරීමේ හැසිරීම නිර්වචනය කරයි. දැන්, IFooObjects හි පාරිභෝගිකයින්ට IFooObject එකක් සෑදිය නොහැක (විශේෂිත කොන්ක්‍රීට් පංතියක් IFooObject බව ඔවුන්ට දැනුමක් නොමැතිව), එබැවින් ඒ වෙනුවට ඔවුන්ට IFooObject- ක්‍රියාත්මක කිරීමේ පන්තියක් හෝ ක්‍රමයක් පිළිබඳ උදාහරණයක් ලබා දිය යුතුය. අපගේ උපභාෂාවෙන් සාමාන්‍යයෙන් කර්මාන්ත ශාලාවක් ලෙස හැඳින්වෙන තත්වය සඳහා නිවැරදි IFooObject නිර්මාණය කරන්නේ කෙසේදැයි දැන ගැනීමේ වගකීම ඇති වෙනත් වස්තුවකින් පිටතින්.

දැන්, න්‍යාය යථාර්ථය සපුරාලන තැන මෙන්න; වස්තුවක හැකි කිසි සියලු කාලය වෙනස්, සියලුම වර්ගයේ සඳහා වසා. උදාහරණයක් ලෙස, IFooObject දැන් කේත පදනමේ අතිරේක කේත වස්තුවක් වන අතර එය පාරිභෝගිකයින්ට අවශ්‍ය අතුරු මුහුණත හෝ IFooObjects ක්‍රියාත්මක කිරීම වෙනස් වන සෑම විටම වෙනස් විය යුතුය. මෙම සාරාංශය හරහා වස්තූන් එකිනෙකා සමඟ අන්තර්ක්‍රියා කරන ආකාරය වෙනස් කිරීම සඳහා නව මට්ටමේ සංකීර්ණතාවයක් හඳුන්වා දෙයි. ඊට අමතරව, අතුරු මුහුණත නව එකක් මගින් ප්‍රතිස්ථාපනය කළ හොත් පාරිභෝගිකයින්ට තවමත් වෙනස් වීමට සිදුවනු ඇත.

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


21
අනෙක් සියල්ල කියවීමෙන් පසු මෙම පිළිතුරට ආදරය කරන්න. මට සෑම දෙයක්ම පාහේ එකතු කළ හැකිය (හොඳ) නව කෝඩරයන් මූලධර්ම ගැන ඕනෑවට වඩා විශ්වාස කරන අතර ඔවුන් ඇත්තටම හොඳ වීමට කැමති නමුත් දේවල් සරල ලෙස තබා ගැනීමේ වටිනාකම තව දුරටත් ඉගෙන ගෙන නැත.
ජීන්

1
පොදු ඉදිකිරීම්කරුවන්ගේ තවත් ගැටළුවක් නම්, පොදු ඉදිකිරීම්කරුවෙකු Fooනියම කිරීමට පංතියක් සඳහා හොඳ ක්‍රමයක් නොමැති වීම, Fooඅවස්ථා නිර්මාණය කිරීම සඳහා හෝ එකම පැකේජයක් / එකලස් කිරීමක් තුළ වෙනත් වර්ග නිර්මාණය කිරීම සඳහා භාවිතා කළ හැකි නමුත් ඒවා නිර්මාණය කිරීම සඳහා භාවිතා කළ යුතු නොවේ. වෙනත් තැනකින් ලබාගත් වර්ග. භාෂාවක් / රාමුවකට newප්‍රකාශන භාවිතා කිරීම සඳහා වෙනම ඉදිකිරීම්කරුවන් නිර්වචනය කළ නොහැකි අතර, උප වර්ගයේ ඉදිකිරීම්කරුවන්ගේ ආයාචනයට එදිරිව, නමුත් එම වෙනස ඇති කරන භාෂාවන් ගැන මම නොදනිමි.
සුපර් කැට්

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

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

මම කේත පදනමක් මත ක්‍රමලේඛනය කරමින් සිටින අතර, OOP ක්‍රියාත්මක කිරීම මඟින් ඉදිකිරීම්කරුට අධික බර පැටවීමට ඉඩ නොදෙන හෙයින්, පොදු ඉදිකිරීම්කරුවන්ගේ භාවිතය effectively ලදායී ලෙස තහනම් කර ඇත. මෙය දැනටමත් එයට ඉඩ දෙන භාෂාවල සුළු ගැටළුවක්. උෂ්ණත්වය නිර්මාණය කරනවා වගේ. ෆැරන්හයිට් සහ සෙල්සියස් යන දෙකම පාවෙන ය. කෙසේ වෙතත් ඔබට ඒවා කොටු කළ හැකිය, පසුව ගැටළුව විසඳනු ඇත.
jgmjgm

34

කෙටි, සරල කේත අඩංගු වන විට ඉදිකිරීම්කරුවන් හොඳයි.

ක්ෂේත්‍ර සඳහා විචල්‍යයන් කිහිපයක් පැවරීමට වඩා ආරම්භය වැඩි වූ විට, කර්මාන්ත ශාලාවක් අර්ථවත් කරයි. මෙන්න ප්‍රතිලාභ කිහිපයක්:

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

  • සමහර භාෂාවල සහ සමහර අවස්ථාවල, ඉදිකිරීම්කරුවන් තුළ ව්‍යතිරේකයන් විසි කිරීම ඇත්තෙන්ම නරක අදහසකි , එයට දෝෂ හඳුන්වා දිය හැකි බැවිනි.

  • ඔබ ඉදිකිරීම්කරුවකුට ආයාචනා කරන විට, ඔබ, අමතන්නා, ඔබට නිර්මාණය කිරීමට අවශ්‍ය නිශ්චිත වර්ගය දැනගත යුතුය. මෙය සැමවිටම එසේ නොවේ (අ Feeder, Animalඑය පෝෂණය කිරීම සඳහා මට එය සෑදිය යුතුය; එය a Dogහෝ a නම් මට කමක් නැත Cat).


2
තේරීම් "කර්මාන්තශාලාව" හෝ "ඉදිකිරීම්කරු" පමණක් නොවේ. ඒ Feederදෙකම භාවිතා නොකළ හැකි අතර ඒ වෙනුවට එය Kennelවස්තුවේ getHungryAnimalක්‍රමය ලෙස හඳුන්වන්න .
ඩග්එම්

4
+1 ඉදිකිරීම්කරුවෙකු තුළ කිසිදු තර්කනයක නියමය පිළිපැදීම නරක අදහසක් නොවන බව මට පෙනී ගියේය. ඉදිකිරීම්කරුවෙකු භාවිතා කළ යුත්තේ වස්තුවෙහි ආරම්භක තත්වය සැකසීමට පමණි. වඩා සංකීර්ණ යමක් අවශ්‍ය නම්, අවම වශයෙන් උදාහරණය ගොඩනැගීම සඳහා කර්මාන්තශාලා (පන්ති) ක්‍රමයක් සාදන්න.
කප්තාජ්කොල්ඩ්

මා මෙහි දුටු එකම තෘප්තිමත් පිළිතුර මෙයයි, මගේම දෑ ලිවීමෙන් මාව බේරා ගත්තා. අනෙක් පිළිතුරු වියුක්ත සංකල්ප සම්බන්ධයෙන් පමණි.
TheCatWhisperer

නමුත් මෙම තර්කය වලංගු සත්‍යයක් විය Builder Patternහැකිය. එසේ නොවේ ද?
soufrk

ඉදිකිරීම්කරුවන්ගේ පාලනය
බ්‍රෙනෝ සල්ගාඩෝ

11

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

එක් සරල උදාහරණයක්: ඔබට උපාංගයක් සමඟ සන්නිවේදනය කිරීමට අවශ්‍ය නමුත් එය ඊතර්නෙට්, COM හෝ USB හරහා වේ දැයි ඔබ නොදනී. ඔබ එක් අතුරු මුහුණතක් සහ ක්‍රියාත්මක කිරීම් 3 ක් අර්ථ දක්වයි. ධාවන වේලාවේදී ඔබට අවශ්‍ය ක්‍රමය තෝරා ගත හැකි අතර කර්මාන්ත ශාලාව ඔබට සුදුසු ක්‍රියාත්මක කිරීමක් ලබා දෙනු ඇත.

එය නිතර භාවිතා කරන්න ...


5
අතුරු මුහුණතක බහුවිධ ක්‍රියාත්මක කිරීම් ඇති විට එය භාවිතා කිරීම ඉතා සුදුසු බවත් , ඇමතුම් කේතය තෝරාගත යුත්තේ කුමක් දැයි නොදැන හෝ නොදැන සිටිය යුතු බවත් මම එකතු කරමි. එහෙත් කර්මාන්ත ක්රමය ප්රශ්නය, දී මෙන් තනි ඉදිකිරීමටත් පමණ ස්ථිතික දවටනය හුදෙක් බව ප්රති-රටාව වේ. එහි විය යුතුය කර්මාන්ත අපේකෂා හා අනවශ්ය සංකීර්ණත්වය එකතු වේ ගන්න හෝ කරන බහු නිර්මාණයන්.

දැන් ඔබට අමතර නම්යතාවයක් ඇති අතර න්‍යායිකව ඔබේ යෙදුමට ඊතර්නෙට්, COM, USB සහ අනුක්‍රමය භාවිතා කළ හැකිය, ෆයර්ලූප් සඳහා සූදානම් හෝ න්‍යායිකව ඕනෑම දෙයක්. යථාර්ථයේ දී ඔබගේ යෙදුම සන්නිවේදනය කරනු ලබන්නේ ඊතර්නෙට් හරහා පමණි .... සදහටම.
පීටර් බී

7

එය ජාවා / සී # මොඩියුල පද්ධතිවල සීමාවක රෝග ලක්ෂණයකි.

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

වෙනත් ගොනුවකට සිතියම් ගත කිරීම සඳහා ගොනු පද්ධතිය සහ සම්පාදක විකල්ප සමඟ සම්බන්ධ වීමෙන් ඔබට මෙය විසඳා ගත හැකිය com.example.Foo, නමුත් මෙය පුදුම සහගත සහ නොදැනුවත්ව ය. ඔබ එසේ කළත්, ඔබේ කේතය තවමත් පන්තියේ එක් ක්‍රියාත්මක කිරීමකට පමණක් බැඳී ඇත. එනම්, ඔබ පන්තියක් Fooමත රඳා පවතින පන්තියක් ලියන්නේ නම් MySet, ඔබට MySetසම්පාදනය කරන වේලාවක ක්‍රියාත්මක කිරීමක් තෝරා ගත හැකි නමුත් Fooවෙනස් ක්‍රියාත්මක කිරීම් දෙකක් භාවිතා කරමින් ඔබට ක්ෂණිකව ක්ෂණිකව ක්‍රියාත්මක කළ MySetනොහැක.

මෙම අවාසනාවන්ත සැලසුම් තීරණය නිසා මිනිසුන්ට interfaceඔවුන්ගේ කේතය අනාගතයේදී සනාථ කිරීම සඳහා අනවශ්‍ය ලෙස භාවිතා කිරීමට බල කෙරෙන්නේ ඔවුන්ට පසුව වෙනත් දෙයක් ක්‍රියාත්මක කිරීමට අවශ්‍ය වනු ඇති බවට හෝ ඒකක පරීක්ෂාවට පහසුකම් සැලසීමටය. මෙය සැමවිටම කළ නොහැකි ය; පංතියේ අවස්ථා දෙකක පුද්ගලික ක්ෂේත්‍ර දෙස බැලීමේ ක්‍රමවේදයක් ඔබට තිබේ නම්, ඒවා අතුරු මුහුණතක ක්‍රියාත්මක කිරීමට නොහැකි වනු ඇත. උදාහරණයක් ලෙස, ඔබ unionජාවා Setඅතුරුමුහුණතෙහි නොපෙනේ . තවමත්, සංඛ්‍යාත්මක වර්ග සහ එකතු කිරීම් වලින් පිටත, ද්විමය ක්‍රම පොදු නොවේ, එබැවින් ඔබට සාමාන්‍යයෙන් එයින් ගැලවිය හැකිය.

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

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


2
ජාවා සහ .NET වැනි ව්‍යුත්පන්නයන් පන්තියක් නිර්මාණය කිරීම සඳහා විශේෂ වාක්‍ය ඛණ්ඩයක් තිබිය යුතු යැයි මම ප්‍රාර්ථනා කරමි. newඑසේ නොමැතිනම් විෙශේෂෙයන් නම් කරන ලද ස්ථිතික ක්‍රමයක් ඇමතීම සඳහා සින්ටැක්ටික් සීනි විය යුතුය. "නමුත් පැහැදිලිවම ක්‍රමය ඇතුළත් කර නැත). IMHO, කේතයට අවශ්‍ය වන්නේ කම්මැලි සුපුරුදු දෙයක් ක්‍රියාත්මක කිරීමට නම් List, සේවාදායකයා කිසියම් විශේෂිත ක්‍රියාත්මක කිරීමක් ගැන නොදැන (උදා ArrayList) අතුරු මුහුණතට එය ලබා දිය හැකිය .
සුපර් කැට්

2

මගේ මතය අනුව, ඔවුන් හුදෙක් සරල කර්මාන්ත ශාලාවක් භාවිතා කරන අතර එය නිසි සැලසුම් රටාවක් නොවන අතර වියුක්ත කර්මාන්ත ශාලාව හෝ කර්මාන්තශාලා ක්‍රමය සමඟ පටලවා නොගත යුතුය.

ඔවුන් “CreateXXX ස්ථිතික ක්‍රම දහස් ගණනක් සහිත විශාල රෙදි පන්තියක්” නිර්මාණය කර ඇති බැවින්, එය ප්‍රති-රටාවකට (දෙවියන්ගේ පන්තියක් විය හැකිද?) පෙනේ.

සරල කර්මාන්තශාලා සහ ස්ථිතික නිර්මාණ ක්‍රම (බාහිර පන්තියක් අවශ්‍ය නොවන) සමහර අවස්ථාවල ප්‍රයෝජනවත් විය හැකි යැයි මම සිතමි. නිදසුනක් ලෙස, වස්තුවක් තැනීම සඳහා වෙනත් වස්තූන් ස්ථාපනය කිරීම වැනි විවිධ පියවරයන් අවශ්‍ය වූ විට (උදා: සංයුතියට අනුග්‍රහය දැක්වීම).

මම එය කර්මාන්ත ශාලාවක් යැයි නොකියමි, නමුත් සමහර කර්මාන්තශාලා වල අහඹු පංතියක "කර්මාන්තශාලාව" යන උපසර්ගය ඇතුළත් කර ඇත.


1
සරල කර්මාන්ත ශාලාවට එහි ස්ථානයක් තිබේ. යම් ආයතනයක් ඉදිකිරීම් පරාමිතීන් දෙකක් ගනී යැයි සිතන්න, int xසහ IFooService fooService. ඔබට fooServiceසෑම තැනකම ගමන් කිරීමට අවශ්‍ය නැත , එබැවින් ඔබ ක්‍රමවේදයක් සහිත කර්මාන්ත ශාලාවක් නිර්මාණය කර කර්මාන්ත ශාලාව Create(int x)තුළ සේවාව එන්නත් කරයි.
ඇලෙක්ස්ෆොක්ස්ගිල්

4
Lex ඇලෙක්ස්ජී එවිට ඔබට IFactoryඒ වෙනුවට සෑම තැනකම ගමන් කළ යුතුය IFooService.
යූෆොරික්

3
මම යුෆෝරික් සමඟ එකඟ වෙමි; මගේ අත්දැකීම් අනුව, ඉහළ සිට ප්‍රස්ථාරයකට එන්නත් කරන වස්තූන් සියලු පහළ මට්ටමේ වස්තූන් සඳහා අවශ්‍ය වන වර්ගයට නැඹුරු වන අතර එබැවින් IFooServices වටා ගමන් කිරීම ලොකු දෙයක් නොවේ. එක් වියුක්තයක් තවත් එකක් සමඟ ප්‍රතිස්ථාපනය කිරීමෙන් කිසිවක් සිදු නොවන අතර කේත පදනම තවදුරටත් අපැහැදිලි වේ.
කීත්

"සෘජු වස්තු ඉදිකිරීම වෙනුවට කර්මාන්තශාලා පන්තියක් භාවිතා කළ යුත්තේ ඇයි? මම පොදු ඉදිකිරීම්කරුවන් භාවිතා කළ යුත්තේ කවදාද, කර්මාන්තශාලා භාවිතා කළ යුත්තේ කවදාද?" යන ප්‍රශ්නයට මෙය සම්පූර්ණයෙන්ම අදාල නොවේ. පිළිතුරු දෙන්නේ කෙසේදැයි
gnat

1
එය ප්‍රශ්නයේ මාතෘකාව පමණයි, මම හිතන්නේ ඔබට එහි ඉතිරි කොටස මඟ හැරුණි. සබැඳියේ අවසාන ලක්ෂ්‍යය බලන්න;).
ෆ්‍රැන්මොවින්කෙල්

1

පුස්තකාලයක පරිශීලකයා වශයෙන්, පුස්තකාලයට කර්මාන්තශාලා ක්‍රම තිබේ නම්, ඔබ ඒවා භාවිතා කළ යුතුය. කර්මාන්තශාලා ක්‍රමය මඟින් පුස්තකාලයේ කතුවරයාට ඔබේ කේතයට බලපෑමක් නොකර යම් යම් වෙනස්කම් කිරීමට නම්‍යශීලී බවක් ලබා දෙනු ඇතැයි ඔබ සිතනු ඇත. සරල ඉදිකිරීම්කරුවෙකු සමඟ ක්‍රියා නොකරන කර්මාන්තශාලා ක්‍රමයක සමහර උප පංතියේ නිදසුනක් ඔවුන් නැවත ලබා දිය හැකිය.

පුස්තකාලයක නිර්මාතෘවරයා ලෙස, ඔබට එම නම්යතාවය ඔබම භාවිතා කිරීමට අවශ්‍ය නම් කර්මාන්තශාලා ක්‍රම භාවිතා කරනු ඇත.

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


එසේම සටහන් කරන්න; සංවර්ධකයාට ව්‍යුත්පන්න පංතියක් අතිරේක ක්‍රියාකාරීත්වයක් ලබා දීමට අවශ්‍ය නම් (අමතර ගුණාංග, ආරම්භ කිරීම) සංවර්ධකයාට එය කළ හැකිය. (කර්මාන්තශාලා ක්‍රම ඉක්මවා යා හැකි යැයි උපකල්පනය කරමින්). ඒපීඅයි කතුවරයා විශේෂ පාරිභෝගික අවශ්‍යතා සඳහා වැඩක් ද සැපයිය හැකිය.
එරික් ෂ්නයිඩර්

-4

මෙය පරිමාණයේ සහ ක්‍රියාකාරී වැඩසටහන්කරණයේ යල්පැන ඇති බව පෙනේ. ශ්‍රිතවල ශක්තිමත් පදනමක් ගැසිලියන් පන්ති ප්‍රතිස්ථාපනය කරයි.

{{කර්මාන්තශාලාවක් භාවිතා කිරීමේදී ජාවාගේ දෙගුණයක් තවදුරටත් ක්‍රියාත්මක නොවන බව සැලකිල්ලට ගැනීම

someFunction(new someObject() {{
    setSomeParam(...);
    etc..
}})

එමඟින් ඔබට නිර්නාමික පංතියක් නිර්මාණය කර එය රිසිකරණය කළ හැකිය.

කාල අවකාශයේ උභතෝකෝටිකය තුළ වේගවත් සාධකය නිසා කාල සාධකය දැන් හැකිලී ඇත. අවකාශය හැකිලීමට හැකි වන පරිදි ක්‍රමලේඛන ක්‍රමලේඛනය ප්‍රායෝගික වේ.


2
මෙය වඩා පැහැදිලිව පෙනෙන අදහස් දැක්වීමක් සේ පෙනේ ( පිළිතුරු දෙන්නේ කෙසේද යන්න බලන්න ), එය පෙර පිළිතුරු 9 හි දක්වා ඇති සහ පැහැදිලි කර ඇති කරුණු වලට වඩා සැලකිය යුතු කිසිවක් ඉදිරිපත් කරන බවක් නොපෙනේ
gnat
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.