වෙනස් කළ නොහැකි වස්තූන් හොඳ නම්, මිනිසුන් විකෘති වස්තූන් නිර්මාණය කරන්නේ ඇයි? [වසා ඇත]


250

වෙනස් කළ නොහැකි වස්තූන් හොඳ, සරල සහ සමගාමී වැඩසටහන්කරණයේ ප්‍රතිලාභ ලබා දෙන්නේ නම්, ක්‍රමලේඛකයින් විකෘති වස්තූන් නිර්මාණය කරන්නේ ඇයි?

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


Um නිශ්චල නොවන වස්තුව යනු එය නිර්මාණය කිරීමෙන් පසු තත්වය වෙනස් කළ නොහැකි වස්තුවකි.
² Mutable වස්තුව එය නිර්මාණය වූ පසු වෙනස් කළ හැකි වන්නේ, වස්තුවක්.


42
මම සිතන්නේ, නීත්‍යානුකූල හේතූන් හැරුණු විට (පහත පේටර් සඳහන් කළ පරිදි) “කම්මැලි සංවර්ධකයා” යනු “මෝඩ” සංවර්ධකයාට වඩා පොදු හේතුවක් වන අතර “මෝඩ සංවර්ධකයා” ට පෙර “නොදන්නා සංවර්ධකයා” ද සිටී
ජෝකිම් සෝවර්

201
සෑම එවැන්ජලිස්ත ක්‍රමලේඛකයෙකු / බ්ලොග්කරුවෙකු සඳහාම උනන්දුවක් දක්වන බ්ලොග් පා readers කයින් 1000 ක් සිටින අතර ඔවුන් වහාම නැවත ප්‍රතිනිර්මාණය කර නවතම ක්‍රමවේදයන් අනුගමනය කරයි. සෑම අයෙකුටම ක්‍රමලේඛකයින් 10,000 ක් පමණ නාසයෙන් ඇඹරුම් ගලට දිනක් වැඩ කර නිෂ්පාදන පිටතට ගෙන යයි. එම පුද්ගලයින් වසර ගණනාවක් තිස්සේ ඔවුන් වෙනුවෙන් වැඩ කර ඇති අත්හදා බැලූ සහ විශ්වාසදායක ශිල්පීය ක්‍රම භාවිතා කරයි. නව ක්‍රමවේදයන් බහුලව භාවිතා වන තෙක් ඔවුන් බලා සිටින අතර ඒවා ලබා ගැනීමට පෙර සැබෑ ප්‍රතිලාභ පෙන්වයි. ඔවුන් මෝඩයන් ලෙස නොකියන්න, ඔවුන් කම්මැලි මිස අන් කිසිවක් නොව, ඔවුන් වෙනුවට "කාර්යබහුල" යැයි අමතන්න.
ද්විමය වොරියර්

22
Inary ද්විමය වොරියර්: වෙනස් කළ නොහැකි වස්තූන් “අලුත් දෙයක්” නොවේ. වසම් වස්තු සඳහා ඒවා විශාල වශයෙන් භාවිතා නොවන්නට ඇත, නමුත් ජාවා සහ සී # මුල සිටම ඒවා තිබුණි. එසේම: "කම්මැලි" යනු සැමවිටම නරක වචනයක් නොවේ, සමහර ආකාරයේ "කම්මැලි" යනු සංවර්ධකයෙකුට නිරපේක්ෂ වාසියකි.
ජෝකිම් සෝවර්

11
O ජෝකිම්: මම හිතන්නේ “කම්මැලි” යන්න ඉහත අර්ථකථන අර්ථයෙන් භාවිතා කර ඇති බව තරමක් පැහැදිලිය. හදිසියේම මාසයේ රසය බවට පත්වීමට . මම තර්ක කරන්නේ ඔවුන් නරක දෙයක් (ඔවුන් එසේ නොවේ), හෝ ඔවුන්ට ඔවුන්ගේ ස්ථානයක් නොමැති බවයි (ඔවුන් පැහැදිලිවම එසේ කරයි), නවතම යහපත් වචනය අසා නැති නිසා සහ මිනිසුන්ට පහසුවෙන් යන්න. (කම්මැලි) අදහස් දැක්වීම ගැන ඔබට දොස් නොකියමින්, ඔබ එය අවම කිරීමට උත්සාහ කළ බව මම දනිමි).
ද්විමය වොරියර්

116
-1, වෙනස් කළ නොහැකි වස්තූන් 'හොඳ' නොවේ. විශේෂිත අවස්ථාවන් සඳහා වැඩි හෝ අඩු සුදුසු ය. සෑම තත්වයක් සඳහාම ඔබට එක් තාක්‍ෂණයක් හෝ වෙනත් ක්‍රමයක් වෛෂයිකව 'හොඳ' හෝ 'නරක' යැයි පවසන ඕනෑම අයෙක් ඔබට ආගම විකුණයි.
ග්‍රෑන්ඩ් මාස්ටර් බී

Answers:


326

විකෘති හා වෙනස් කළ නොහැකි වස්තූන් දෙකටම ඔවුන්ගේම ප්‍රයෝජන, වාසි සහ අවාසි ඇත.

වෙනස් කළ නොහැකි වස්තූන් බොහෝ විට ජීවිතය සරල කරයි. වටිනාකම් වර්ග සඳහා ඒවා විශේෂයෙන් අදාළ වේ, එහිදී වස්තූන්ට අනන්‍යතාවයක් නොමැති බැවින් ඒවා පහසුවෙන් ප්‍රතිස්ථාපනය කළ හැකිය. ඒවාට සමගාමී ක්‍රමලේඛන ක්‍රමයක් ආරක්ෂිත හා පිරිසිදු කළ හැකිය (සමගාමී දෝෂ සොයා ගැනීම කුප්‍රකට දුෂ්කර බොහෝමයක් අවසානයේ සිදුවන්නේ නූල් අතර හුවමාරු වන විකෘති තත්වයක් නිසාය). කෙසේ වෙතත්, විශාල හා / හෝ සංකීර්ණ වස්තූන් සඳහා, සෑම වෙනස්කමක් සඳහාම වස්තුවේ නව පිටපතක් නිර්මාණය කිරීම ඉතා මිල අධික හා / හෝ වෙහෙසකාරී විය හැකිය. පැහැදිලි අනන්‍යතාවයක් ඇති වස්තූන් සඳහා, පවත්නා වස්තූන් වෙනස් කිරීම නව, නවීකරණය කරන ලද පිටපතක් නිර්මාණය කිරීමට වඩා සරල හා අවබෝධාත්මක ය.

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

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

මේ සියලු නීත්‍යානුකූල හේතූන් හැරුණු විට, අහෝ, මිනිසුන් විකෘති වස්තූන් නිර්මාණය කිරීමට වඩාත්ම හේතු විය හැක්කේ මනසෙහි අවස්ථිති බව, වෙනස් වීමට ප්‍රතිරෝධයයි. අද බොහෝ සංවර්ධකයින් වෙනස් කළ නොහැකි වීමට පෙර හොඳින් පුහුණු කර ඇති බව සලකන්න (සහ එහි අඩංගු පරාමිතිය, ක්‍රියාකාරී ක්‍රමලේඛනය) ඔවුන්ගේ බලපෑම් ක්ෂේත්‍රය තුළ “ප්‍රවණතාවක්” බවට පත්ව ඇති අතර අපගේ වෙළඳාමේ නව මෙවලම් සහ ක්‍රම පිළිබඳව ඔවුන්ගේ දැනුම යාවත්කාලීනව තබා නොගන්න - ඇත්ත වශයෙන්ම, මිනිසුන් වන අපගෙන් බොහෝ දෙනෙක් නව අදහස් හා ක්‍රියාවලීන්ට ධනාත්මකව විරුද්ධ වෙති. "මම මේ වගේ වැඩසටහන් කර ඇත nn වසර සහ මම නවතම මෝඩ ඒව ගැන තැකීමක් කරන්නේ නෑ!"


27
ඒක හරි. විශේෂයෙන් GUI ක්‍රමලේඛනයේදී, විකෘති වස්තුව ඉතා පහසුය.
ෆ්ලෝරියන් සාලිහෝවික්

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

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

4
On කොන්රාඩ් රුඩොල්ෆ්, හොඳ ලකුණු, ස්තූතියි. සංකීර්ණ වස්තූන්හි නිශ්චලතාව භාවිතා කිරීම බැහැර කිරීමට මා අදහස් නොකළ නමුත් එවැනි පංතියක් නිවැරදිව හා කාර්යක්ෂමව ක්‍රියාත්මක කිරීම සුළුපටු කාර්යයක් නොවන අතර අවශ්‍ය අමතර උත්සාහය සැමවිටම යුක්ති සහගත නොවේ.
Péter Török

6
රාජ්ය එදිරිව අනන්යතාවය පිළිබඳව ඔබ හොඳ අදහසක් ඉදිරිපත් කරයි. රිච් හිකී (ක්ලෝජුරේ කතුවරයා) ක්ලෝජුරේහි දී දෙක වෙන් කළේ මේ නිසා ය. කෙනෙකුට තර්ක කළ හැකිය, ඔබ සතුව ගෑස් ටැංකිය 1/2 ක් ඇති මෝටර් රථය 1/4 ගෑස් ටැංකියක් ඇති මෝටර් රථය නොවේ. ඔවුන්ට එකම අනන්‍යතාවයක් ඇත, නමුත් ඒවා සමාන නොවේ, අපගේ යථාර්ථයේ සෑම "ටික්" එකක්ම අපේ ලෝකයේ සෑම වස්තුවකම ක්ලෝනයක් නිර්මාණය කරයි, අපගේ මොළය පසුව පොදු අනන්‍යතාවයක් සමඟ මේවා එකට බැඳ තබයි. ක්ලෝජුර්ට කාලය නිරූපණය කිරීම සඳහා refs, පරමාණු, නියෝජිතයන් යනාදිය ඇත. සහ නියම වේලාවට සිතියම්, දෛශික සහ ලැයිස්තු.
තිමෝති බැල්ඩ්‍රිජ්

130

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


9
මා දන්නා බොහෝ නූතන IDE වල, ලබා ගන්නන් සහ සැකසුම් යන දෙකම උත්පාදනය කිරීම සඳහා, ලබා ගන්නන් පමණක් උත්පාදනය කිරීමට ප්‍රායෝගිකව සමාන උත්සාහයක් අවශ්‍ය වේ. එය එකතු බව සැබෑ වුවත් final, constආදිය අතිරේක ප්රයත්නයක් ටිකක් ගනී ... ඔබ කේතය සැකිලි සකස් මිස :-)
පීටර් Török

10
@ PéterTörök එය අතිරේක උත්සාහය පමණක් නොවේ - ඔබේ කේතීකරණ විලාසය ඔවුන්ගේ අත්දැකීම් වලට වඩා පිටසක්වළ බැවින් ඔබේ සෙසු කෝඩරයන් ඔබව ප්‍රතිමූර්තියක එල්ලා තැබීමට කැමති වනු ඇත. එයද මෙවැනි දේ අධෛර්යමත් කරයි.
ඔනෝරියෝ කැටෙනැචි

5
එය වැඩි සන්නිවේදනයක් සහ අධ්‍යාපනයක් සමඟ ජය ගත හැකිය, උදා: නව කේතීකරණ ශෛලියක් පිළිබඳව දැනට සිටින කේත පදනමක් තුළට හඳුන්වා දීමට පෙර එය කණ්ඩායමේ සාමාජිකයින්ට කථා කිරීම හෝ ඉදිරිපත් කිරීම සුදුසුය. හොඳ ව්‍යාපෘතියකට පොදු කේතීකරණ ශෛලියක් ඇති බව සත්‍යයකි, එය සෑම (අතීත හා වර්තමාන) ව්‍යාපෘති සාමාජිකයෙකුගේම අනුග්‍රහය දක්වන කේතකරණ ශෛලීන්ගේ එකතුවක් පමණක් නොවේ. එබැවින් කේතීකරණ මෝඩයන් හඳුන්වාදීම හෝ වෙනස් කිරීම කණ්ඩායම් තීරණයක් විය යුතුය.
Péter Török

3
@ PéterTörök අත්‍යවශ්‍ය භාෂාවක විකෘති වස්තු යනු පෙරනිමි හැසිරීමයි. ඔබට වෙනස් කළ නොහැකි වස්තූන් පමණක් අවශ්‍ය නම්, ක්‍රියාකාරී භාෂාවකට මාරුවීම වඩාත් සුදුසුය.
emory

3
@ PéterTörök වැඩසටහනකට වෙනස් කළ නොහැකි බව ඇතුළත් කිරීම සියලු සැකසුම් අතහැර දැමීම හැර වෙන කිසිවක් නැතැයි උපකල්පනය කිරීම ටිකක් බොළඳ ය. වැඩසටහනේ තත්වය වැඩිවෙමින් වෙනස් වීමට ඔබට තවමත් ක්‍රමයක් අවශ්‍ය වන අතර, මේ සඳහා ඔබට තනන්නන්, හෝ පොප්සිකල් වෙනස් කළ නොහැකි බව හෝ විකෘති ප්‍රොක්සි අවශ්‍ය වේ.
අසාද් සයීදින්

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

  2. බොහෝ සංවර්ධකයින් කාර්ය සාධන අවශ්‍යතා සැලකිය යුතු තරම් වැදගත් වන තැනක සමපාත මුදල් කෙරෙහි අවධානය යොමු කළ යුතු කිසිවක් නොකරයි (හෝ දැනුවත්ව සිටින අය විසින් හොඳ භාවිතයක් ලෙස විශ්වීය ලෙස සලකනු ලබන වෙනත් ගැටළු රාශියක්).

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

        public class ImmutablePerson { 
    
         public ImmutablePerson(string name, ImmutableEventList eventsToAttend)
         {
              this.name = name;
              this.eventsToAttend = eventsToAttend;
         }
         private string name;
         private ImmutableEventList eventsToAttend;
    
         public string Name { get { return this.name; } }
    
         public ImmutablePerson RSVP(ImmutableEvent immutableEvent){
             // the person is RSVPing an event, thus mutating the state 
             // of the eventsToAttend.  so we need a new person with a reference
             // to the new Event
             ImmutableEvent newEvent = immutableEvent.OnRSVPReceived(this);
             ImmutableEventList newEvents = this.eventsToAttend.Add(newEvent));
             var newSelf = new ImmutablePerson(name, newEvents);
             return newSelf;
         }
        }
    
        public class ImmutableEvent { 
         public ImmutableEvent(DateTime when, ImmutablePersonList peopleAttending, ImmutablePersonList peopleNotAttending){
             this.when = when;     
             this.peopleAttending = peopleAttending;
             this.peopleNotAttending = peopleNotAttending;
         }
         private DateTime when; 
         private ImmutablePersonList peopleAttending;
         private ImmutablePersonList peopleNotAttending;
         public ImmutableEvent OnReschedule(DateTime when){
               return new ImmutableEvent(when,peopleAttending,peopleNotAttending);
         }
         //  notice that this will be an infinite loop, because everytime one counterpart
         //  of the bidirectional relationship is added, its containing object changes
         //  meaning it must re construct a different version of itself to 
         //  represent the mutated state, the other one must update its
         //  reference thereby obsoleting the reference of the first object to it, and 
         //  necessitating recursion
         public ImmutableEvent OnRSVPReceived(ImmutablePerson immutablePerson){
               if(this.peopleAttending.Contains(immutablePerson)) return this;
               ImmutablePersonList attending = this.peopleAttending.Add(immutablePerson);
               ImmutablePersonList notAttending = this.peopleNotAttending.Contains( immutablePerson ) 
                                    ? peopleNotAttending.Remove(immutablePerson)
                                    : peopleNotAttending;
               return new ImmutableEvent(when, attending, notAttending);
         }
        }
        public class ImmutablePersonList
        {
          private ImmutablePerson[] immutablePeople;
          public ImmutablePersonList(ImmutablePerson[] immutablePeople){
              this.immutablePeople = immutablePeople;
          }
          public ImmutablePersonList Add(ImmutablePerson newPerson){
              if(this.Contains(newPerson)) return this;
              ImmutablePerson[] newPeople = new ImmutablePerson[immutablePeople.Length];
              for(var i=0;i<immutablePeople.Length;i++)
                  newPeople[i] = this.immutablePeople[i];
              newPeople[immutablePeople.Length] = newPerson;
          }
          public ImmutablePersonList Remove(ImmutablePerson newPerson){
              if(immutablePeople.IndexOf(newPerson) != -1)
              ImmutablePerson[] newPeople = new ImmutablePerson[immutablePeople.Length-2];
              bool hasPassedRemoval = false;
              for(var i=0;i<immutablePeople.Length;i++)
              {
                 hasPassedRemoval = hasPassedRemoval || immutablePeople[i] == newPerson;
                 newPeople[i] = this.immutablePeople[hasPassedRemoval ? i + 1 : i];
              }
              return new ImmutablePersonList(newPeople);
          }
          public bool Contains(ImmutablePerson immutablePerson){ 
             return this.immutablePeople.IndexOf(immutablePerson) != -1;
          } 
        }
        public class ImmutableEventList
        {
          private ImmutableEvent[] immutableEvents;
          public ImmutableEventList(ImmutableEvent[] immutableEvents){
              this.immutableEvents = immutableEvents;
          }
          public ImmutableEventList Add(ImmutableEvent newEvent){
              if(this.Contains(newEvent)) return this;
              ImmutableEvent[] newEvents= new ImmutableEvent[immutableEvents.Length];
              for(var i=0;i<immutableEvents.Length;i++)
                  newEvents[i] = this.immutableEvents[i];
              newEvents[immutableEvents.Length] = newEvent;
          }
          public ImmutableEventList Remove(ImmutableEvent newEvent){
              if(immutableEvents.IndexOf(newEvent) != -1)
              ImmutableEvent[] newEvents = new ImmutableEvent[immutableEvents.Length-2];
              bool hasPassedRemoval = false;
              for(var i=0;i<immutablePeople.Length;i++)
              {
                 hasPassedRemoval = hasPassedRemoval || immutableEvents[i] == newEvent;
                 newEvents[i] = this.immutableEvents[hasPassedRemoval ? i + 1 : i];
              }
              return new ImmutableEventList(newPeople);
          }
          public bool Contains(ImmutableEvent immutableEvent){ 
             return this.immutableEvent.IndexOf(immutableEvent) != -1;
          } 
        }
    

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

2
Nd ඇන්ඩ්‍රෙස් එෆ්., (1) මගේ පළමු ප්‍රකාශය විශ්වීය නොවූ බැවින් එය අසත්‍ය නොවේ. යෙදුම් සංවර්ධනයේදී ඉතා සුලභ වන ඇතැම් අවස්ථාවලදී එය අත්‍යවශ්‍යයෙන්ම සත්‍ය වන්නේ කෙසේද යන්න පැහැදිලි කිරීමට මම ඇත්ත වශයෙන්ම කේත උදාහරණයක් ලබා දුන්නෙමි. (2) ද්විපාර්ශ්වික සම්බන්ධතාවන්ට පොදුවේ විකෘතිතාව අවශ්‍ය වේ. ජාවා වැරදිකරු යැයි මම විශ්වාස නොකරමි. මා පැවසූ පරිදි, ඔබ යෝජනා කරන ඕනෑම ruc ලදායී විකල්පයක් ඇගයීමට මම සතුටු වෙමි , නමුත් මේ අවස්ථාවේදී ඔබ අදහස් දක්වන්නේ "මම එසේ පැවසූ නිසා ඔබ වැරදියි" වැනි ය.
smartcaveman

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

4
@AndresF., ඒ නිසා, ඔබ කියන දේ මත පදනම්ව, නම් Rතමයි Relationship(a,b)දෙකම aහා bඅණුවල පැවැත්ම වන අතර, හෝ aහෝ bසඳහනක් පවත්වන R. මෙය ක්‍රියාත්මක වීමට නම්, යොමු කිරීම වෙනත් තැනක ගබඩා කළ යුතුය (ස්ථිතික පන්තියක් වැනි). මම ඔබේ අභිප්‍රාය නිවැරදිව තේරුම් ගන්නවාද?
smartcaveman

9
කම්මැලිකම තුළින් චතුල්හු පෙන්වා දෙන පරිදි වෙනස් කළ නොහැකි දත්ත සඳහා ද්විපාර්ශ්වික සම්බන්ධතාවයක් ගබඩා කළ හැකිය. මෙය කළ හැකි එක් ක්‍රමයක් මෙන්න: haskell.org/haskellwiki/Tying_the_Knot
තෝමස් එඩින්ග්

36

මම "තනිකරම ක්‍රියාකාරී දත්ත ව්‍යුහයන්" කියවා ඇති අතර, විකෘති වස්තූන් භාවිතයෙන් ක්‍රියාත්මක කිරීමට වඩා පහසු දත්ත ව්‍යුහයන් කිහිපයක් ඇති බව මට වැටහී ඇත.

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

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


3
මෙය ඔකසාකි පොතද?
යාන්ත්‍රික ගොළුබෙල්ලා

ඔව්. ටිකක් වියළි නමුත් හොඳ තොරතුරු ටොන් එකක් ...
පෝල් සැන්වාල්ඩ්

4
හාස්‍යජනකයි, මම නිතරම සිතුවේ ඔකාසාකිස් රතු / කළු ගස එතරම් සරල බවයි. පේළි 10 ක් හෝ එසේ ය. මම හිතන්නේ ලොකුම වාසිය නම් ඔබට පැරණි අනුවාදය ද තබා ගැනීමට අවශ්‍ය වූ විටය.
තෝමස් අහ්ලේ

අතර පසුගිය දඬුවම බොහෝ විට එය වත්මන් දෘඩාංග ප්රවණතා ආදිය ලබා දී, අනාගතයේ දී සැබෑ පවතිනු ඇත බව එහි පැහැදිලි නොවන පසුගිය තුළ සැබෑ වී ඇත
JK.

29

මගේ දෘෂ්ටි කෝණයෙන්, එය දැනුවත්භාවය අඩු වීමකි. ඔබ දන්නා වෙනත් ජේවීඑම් භාෂා (ස්කලා, ක්ලෝජුරේ) දෙස බැලුවහොත්, විකෘති වස්තූන් කේතයේ කලාතුරකින් දක්නට ලැබෙන අතර තනි නූල් ප්‍රමාණවත් නොවන අවස්ථාවන්හිදී මිනිසුන් ඒවා භාවිතා කිරීමට පටන් ගනී.

මම දැනට ක්ලෝජුර් ඉගෙන ගනිමින් සිටින අතර ස්කලා (ජාවා හි අවුරුදු 4 +) පිළිබඳ කුඩා අත්දැකීමක් ඇති අතර ඔබේ කේතීකරණ විලාසය වෙනස් වන්නේ රාජ්‍යය පිළිබඳ දැනුවත්භාවය හේතුවෙනි.


සමහර විට "ජනප්‍රිය" යන්නට වඩා "දන්නා" වචනය වඩා හොඳ තේරීමක් වනු ඇත.
ඩෙන්

ඔව් ඒක නිවැරදියි.
ෆ්ලෝරියන් සාලිහෝවික්

5
+1: මම එකඟ වෙමි: ස්කලා සහ හැස්කල් කිහිපයක් ඉගෙන ගත් පසු, මම ජාවාහි අවසාන සහ සෑම තැනකම C ++ හි කොන්ස් භාවිතා කිරීමට නැඹුරු වෙමි. හැකි නම් මම ද වෙනස් කළ නොහැකි වස්තූන් භාවිතා කරන අතර, විකෘති වස්තූන් තවමත් බොහෝ විට අවශ්‍ය වන අතර, ඔබට කොපමණ වාර ගණනක් වෙනස් කළ නොහැකි ද යන්න පුදුම සහගත ය.
ජෝර්ජියෝ

5
අවුරුදු දෙකහමාරකට පසු මගේ මෙම ප්‍රකාශය මම කියවූ අතර, මගේ මතය වෙනස් නොවීමට පක්ෂව වෙනස් වී ඇත. මගේ වර්තමාන ව්‍යාපෘතියේ (එය පයිතන්හි ඇත) අපි විකෘති වස්තු භාවිතා කරන්නේ ඉතා කලාතුරකිනි. අපගේ අඛණ්ඩ දත්ත පවා වෙනස් කළ නොහැක: සමහර මෙහෙයුම් වල ප්‍රති result ලයක් ලෙස අපි නව වාර්තා නිර්මාණය කර ඒවා තවදුරටත් අවශ්‍ය නොවන විට පැරණි වාර්තා මකා දමමු, නමුත් අපි කිසි විටෙක තැටියේ කිසිදු වාර්තාවක් යාවත්කාලීන නොකරමු. මෙය අපගේ සමගාමී, බහුකාර්ය යෙදුම මේ දක්වා ක්‍රියාත්මක කිරීමට හා නඩත්තු කිරීමට වඩා පහසු කර ඇති බව අමුතුවෙන් කිව යුතු නැත.
ජෝර්ජියෝ

13

මම හිතන්නේ එක ප්රධාන සාධකය නොතකා හැර ඇත කර: ජාවා බෝංචි වස්තූන් mutating නිශ්චිත ශෛලිය මත දැඩි ලෙස රැඳී, සහ (විශේෂයෙන් මූලාශ්රය සලකා) ඉතා සුළු ජනතාව (හෝ පවා බව ගැනීමට පෙනේ ) කෙසේ කැනෝනිකල් උදාහරණයක් සියලු ජාවා ලිවිය යුතුය.


4
+1, පළමු දත්ත විශ්ලේෂණයෙන් පසුව යම් ආකාරයක පෙරනිමි ක්‍රියාත්මක කිරීමක් ලෙස බොහෝ විට getter / setter රටාව භාවිතා වේ.
ජාප්

මෙය බොහෝ විට විශාල කරුණක් විය හැකිය ... "මන්ද අනෙක් සියල්ලන්ම එසේ කරන්නේ" ... එබැවින් එය නිවැරදි විය යුතුය. "හෙලෝ වර්ල්ඩ්" වැඩසටහනක් සඳහා එය පහසුම වේ. විකෘති ගුණාංග රාශියක් හරහා වස්තු තත්ව වෙනස්වීම් කළමනාකරණය කිරීම ... එය "හෙලෝ වර්ල්ඩ්" අවබෝධයේ ගැඹුරට වඩා ටිකක් උපක්‍රමශීලී ය. අවුරුදු 20 කට පසු 20 වන සියවසේ වැඩසටහන් වල උච්චතම අවස්ථාව වන්නේ කිසිදු ව්‍යුහයක් නොමැති වස්තුවක සෑම ගුණාංගයක් ගැනම getX සහ setX ක්‍රම (කෙතරම් වෙහෙසකර) ලිවීමයි. 100% විකෘතිතාවයකින් යුත් පොදු දේපල වෙත access ජුව පිවිසීමට එය එක් පියවරක් පමණි.
ඩැරල් ටීග්

12

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

නිසැකවම විකෘති වස්තූන් හයිබර්නේට වඩා බොහෝ කාලයක් තිස්සේ පැවතුනි, එබැවින් විකෘති වස්තූන්ගේ ජනප්‍රියතාවයේ මුල් 'හේතුව' හයිබර්නේට් නොවේ. සමහර විට විකෘති වස්තූන්ගේ ජනප්‍රියතාවය හයිබර්නේට් සමෘධිමත් වීමට ඉඩ හැරියේය.

නමුත් අද බොහෝ කනිෂ් program ක්‍රමලේඛකයින් හයිබර්නේට් හෝ වෙනත් ORM භාවිතා කරමින් ව්‍යවසාය පද්ධති මත දත් කපා ගන්නේ නම්, ඔවුන් විකෘති වස්තූන් භාවිතා කිරීමේ පුරුද්ද ඇති කර ගනී. හයිබර්නේට් වැනි රාමු විකෘති වස්තූන්ගේ ජනප්‍රියතාවයට හේතු වේ.


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

9

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

බොහෝ වැඩසටහන් නිර්මාණය කර ඇත්තේ සහජයෙන්ම විකෘති වන තාත්වික දේවල් ආදර්ශනය කිරීම සඳහා ය. අළුයම 12:51 ට, යම් විචල්‍යයක් AllTrucksවස්තුව # 451 වෙත යොමු කරයි යැයි සිතමු , එය දත්ත ව්‍යුහයක මුල වන අතර එය එම මොහොතේ (12:51 පෙ.ව.) නැව් සමූහයක සියලුම ට්‍රක් රථවල අඩංගු භාණ්ඩ මොනවාදැයි දක්වයි. BobsTruckඑම මොහොතේ (12:51 පෙ.ව.) බොබ්ගේ ට්‍රක් රථයේ ඇති භාණ්ඩ මොනවාද යන්න දැක්වෙන වස්තුවකට # 24601 වස්තුව වෙත යොමු කිරීමක් ලබා ගත හැකිය. අළුයම 12:52 ට, සමහර ට්‍රක් රථ (බොබ් ද ඇතුළුව) පටවා බෑමට ලක් කර ඇති අතර, දත්ත ව්‍යුහයන් යාවත්කාලීන වන අතර එමඟින් AllTrucksදත්ත ව්‍යුහයක් වෙත යොමු කිරීමක් සිදු කරනු ඇත.

කුමක් සිදුවිය BobsTruckයුතුද?

එක් එක් ට්‍රක් වස්තුවක 'භාණ්ඩ' දේපල වෙනස් කළ නොහැකි නම්, # 24601 වස්තුව සදාකාලිකවම බොබ්ගේ ට්‍රක් රථය අළුයම 12:51 ට තිබූ තත්වය නිරූපණය කරයි. නම් BobsTruckවස්තුව # 24601 සෘජු යොමු පවත්වයි, එවිට යාවත්කාලීන වන කේතය නම් AllTrucksද ලකුණු යාවත්කාලීන කිරීම සිදු BobsTruck, එය බොබ් ගේ ට්රක් වත්මන් රාජ්ය නියෝජනය කිරීමට නතර කරනු ඇත. BobsTruckකිසියම් ආකාරයක විකෘති වස්තුවක ගබඩා කර නොමැති නම් , යාවත්කාලීන AllTrucksකළ හැකි කේතය යාවත්කාලීන කළ හැකි එකම ක්‍රමය වන්නේ කේතය එසේ කිරීමට පැහැදිලිවම ක්‍රමලේඛනය කර ඇත්නම් පමණි.

BobsTruckසෑම වස්තුවක්ම නිශ්චල නොවී තබා ගනිමින් රාජ්‍ය බොබ්ගේ ට්‍රක් රථය නිරීක්ෂණය කිරීමට යමෙකුට අවශ්‍ය නම් , යමෙකුට BobsTruckවෙනස් කළ නොහැකි කාර්යයක් විය හැකිය, එය AllTrucksකිසියම් නිශ්චිත වේලාවක ඇති හෝ ඇති වටිනාකම අනුව , බොබ්ගේ ට්‍රක් රථයේ තත්වය ලබා දෙනු ඇත. එම අවස්ථාවෙහිදී. කෙනෙකුට එය වෙනස් කළ නොහැකි කාර්යයන් යුගලයක් තබා ගත හැකිය - ඉන් එකක් ඉහත පරිදි වනු ඇති අතර, අනෙක නැව් සමූහයක් සහ නව ට්‍රක් රථ රාජ්‍යයක් පිළිබඳ සඳහනක් පිළිගෙන නව බලඇණි රාජ්‍යයක් වෙත යොමු කිරීමක් ලබා දෙනු ඇත. පැරණි දේට ගැලපේ, බොබ්ගේ ට්‍රක් රථයට නව රාජ්‍යය ලැබෙනු ඇත.

අවාසනාවකට මෙන්, බොබ්ගේ ට්‍රක් රථයේ තත්වයට ප්‍රවේශ වීමට අවශ්‍ය සෑම අවස්ථාවකම එවැනි ක්‍රියාවක් භාවිතා කිරීම තරමක් කරදරකාරී හා කරදරකාරී විය හැකිය. විකල්ප ප්‍රවේශයක් වනුයේ # 24601 වස්තුව සැමවිටම හා සදහටම (ඕනෑම අයෙකු ඒ ගැන සඳහනක් කරන තාක් කල්) බොබ්ගේ ට්‍රක් රථයේ වත්මන් තත්වය නියෝජනය කරන බව පැවසීමයි. බොබ්ගේ ට්‍රක් රථයේ වර්තමාන තත්වයට නැවත නැවත පිවිසීමට අවශ්‍ය කේතය සෑම විටම යම් කාලයක් ගතවන ශ්‍රිතයක් ක්‍රියාත්මක කිරීමට අවශ්‍ය නොවනු ඇත - එම වස්තුව # 24601 බොබ්ගේ ට්‍රක් රථය බව දැන ගැනීමට එක් වරක් බැලීමේ කාර්යයක් කළ හැකිය. බොබ්ගේ ට්‍රක් රථයේ වර්තමාන තත්වය දැකීමට අවශ්‍ය ඕනෑම වේලාවක එම වස්තුවට පිවිසෙන්න.

ක්‍රියාකාරී ප්‍රවේශය තනි නූල් සහිත පරිසරයක හෝ බහු නූල් සහිත පරිසරයක වාසි නොමැතිව නොවන බව සලකන්න. නූල් බොහෝ විට දත්ත වෙනස් කරනවාට වඩා නිරීක්‍ෂණය කරනු ඇත. අඩංගු වස්තු යොමුව පිටපත් කරන ඕනෑම නිරීක්ෂක නූල්AllTrucksඉන්පසු නිරූපණය කරන ලද ට්‍රක් රථ තත්වයන් පරීක්ෂා කිරීමෙන් එමඟින් සියලු ට්‍රක් රථවල තත්වය එම සඳහන අල්ලා ගත් මොහොතේ සිට දැකගත හැකිය. නිරීක්‍ෂක නූලකට නව දත්ත බැලීමට අවශ්‍ය ඕනෑම වේලාවක, එය නැවත යොමු කිරීම ලබා ගත හැකිය. අනෙක් අතට, එක් වෙනස් කළ නොහැකි වස්තුවක් මගින් මුළු නාවික හමුදාවම නිරූපණය කිරීමෙන් නූල් දෙකක් එකවර විවිධ ට්‍රක් රථ යාවත්කාලීන කිරීමේ හැකියාව වළක්වනු ඇත, මන්ද සෑම නූල් එකක්ම තමන්ගේ උපාංගවලට ඉතිරි වුවහොත් නව “බලඇණි තත්වයක්” ඇති වේ. එහි ට්‍රක් රථයේ නව තත්වය සහ අනෙක් සෑම රටකම පැරණි තත්වයන්. සෑම නූල් එකක්ම CompareExchangeයාවත්කාලීන කිරීමට භාවිතා AllTrucksකරන්නේ එය වෙනස් වී නොමැති නම් පමණක් වන අතර නිවැරදි වීමට සහතික විය හැකියCompareExchangeඑහි රාජ්‍ය වස්තුව ප්‍රතිනිර්මාණය කිරීමෙන් සහ මෙහෙයුම නැවත උත්සාහ කිරීමෙන්, නමුත් එකකට වඩා වැඩි ගණනක් එකවර ලිවීමේ ක්‍රියාවලියක් සඳහා උත්සාහ කරන්නේ නම්, කාර්ය සාධනය සාමාන්‍යයෙන් සියලු ලිවීම් තනි නූල් එකකින් සිදු වූවාට වඩා නරක වනු ඇත; වැඩි වැඩියෙන් නූල් එවැනි එකවර මෙහෙයුම් කිරීමට උත්සාහ කරන තරමට කාර්ය සාධනය නරක අතට හැරෙනු ඇත.

තනි ට්රක් රථ වස්තූන් විකෘති නමුත් වෙනස් කළ නොහැකි අනන්යතා තිබේ නම් , බහු-නූල් දර්ශනය පිරිසිදු වේ. ඕනෑම ට්‍රක් රථයක වරකට එක් නූල් එකක් පමණක් ක්‍රියාත්මක වීමට ඉඩ දිය හැකි නමුත් විවිධ ට්‍රක් රථවල ක්‍රියාත්මක වන නූල් වලට බාධාවකින් තොරව එය කළ හැකිය. වෙනස් කළ නොහැකි වස්තූන් භාවිතා කරන විට පවා කෙනෙකුට එවැනි හැසිරීම් අනුකරණය කළ හැකි ක්‍රම තිබේ (උදා: කෙනෙකුට “ඕල් ට්‍රක්ස්” වස්තු නිර්වචනය කළ හැකි අතර එමඟින් XXX ට අයත් ට්‍රක් රථයේ තත්වය එස්එස්එස් වෙත සැකසීමට සරලවම අවශ්‍ය වන්නේ “[කාලය] අනුව, [XXX] ට අයත් ට්‍රක් රථයේ තත්වය දැන් [එස්එස්එස්] ය; අනෙක් සියල්ලේ තත්වය [ඕල් ට්‍රක්ස් වල පැරණි වටිනාකම] වේ. ”එවැනි වස්තුවක් උත්පාදනය කිරීම වේගවත් වනු ඇත.CompareExchangeලූප් වැඩි කාලයක් ගත නොවනු ඇත. අනෙක් අතට, එවැනි දත්ත ව්‍යුහයක් භාවිතා කිරීමෙන් යම් පුද්ගලයෙකුගේ ට්‍රක් රථයක් සොයා ගැනීමට ගතවන කාලය සැලකිය යුතු ලෙස වැඩි වේ. වෙනස් කළ නොහැකි අනන්‍යතා සහිත විකෘති වස්තු භාවිතා කිරීමෙන් එම ගැටළුව මඟහරවා ගත හැකිය.


8

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

ඔබේ ප්‍රශ්නයට පිළිතුරු දිය හැකි හොඳම හා ඉක්මන්ම ක්‍රමය වන්නේ විකෘතිතාවයට එදිරිව විකෘතිතාවයේ වාසි සහ අවාසි පිළිබඳව ඔබ සිතන බවයි.


7

මෙම බ්ලොග් සටහන පරීක්ෂා කරන්න: http://www.yegor256.com/2014/06/09/objects-should-be-immutable.html . වෙනස් කළ නොහැකි වස්තූන් විකෘති වීමට වඩා හොඳ වන්නේ මන්දැයි එය සාරාංශ කරයි. මෙන්න කෙටි තර්ක ලැයිස්තුවක්:

  • වෙනස් කළ නොහැකි වස්තූන් තැනීමට, පරීක්ෂා කිරීමට සහ භාවිතා කිරීමට සරල ය
  • සැබවින්ම වෙනස් කළ නොහැකි වස්තූන් සැමවිටම නූල් ආරක්ෂිතයි
  • ඒවා තාවකාලික සම්බන්ධතාවය වළක්වා ගැනීමට උපකාරී වේ
  • ඒවායේ භාවිතය අතුරු ආබාධ රහිත ය (ආරක්ෂිත පිටපත් නොමැත)
  • අනන්‍යතා විකෘතිතා ගැටළුව වළක්වා ඇත
  • ඔවුන්ට සෑම විටම අසාර්ථක පරමාණුකතාවයක් ඇත
  • ඒවා හැඹිලිගත කිරීමට වඩා පහසුය

මා තේරුම් ගත් පරිදි මිනිසුන් විකෘති වස්තූන් භාවිතා කරයි, මන්ද ඔවුන් තවමත් OOP මිශ්‍ර කරන්නේ අත්‍යවශ්‍ය ක්‍රියා පටිපාටි ක්‍රමලේඛනය සමඟ ය.


5

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

මෙය බොහෝ දුරට දත්ත බන්ධනය සමඟ සම්බන්ධ වීමේ ගැටළු හතරක් ඇත :

  1. ජාවා කන්ස්ට්‍රක්ටර්ස් පරාවර්තන මෙටා-දත්ත තර්ක නාම රඳවා නොගනී.
  2. ජාවා කන්ස්ට්‍රක්ටර්ස් (සහ ක්‍රම) සඳහා පරාමිති (ලේබල් ලෙසද හැඳින්වේ) නොමැත, එබැවින් එය බොහෝ පරාමිතීන් සමඟ ව්‍යාකූල වේ.
  3. වෙනත් වෙනස් කළ නොහැකි වස්තුවක් උරුම කර ගැනීමේදී ඉදිකිරීම්කරුවන්ගේ නිසි අනුපිළිවෙල කැඳවිය යුතුය. එක් ක්ෂේත්‍රයක් අවසන් නොවී අතහැර දැමීම සඳහා මෙය තරමක් උපක්‍රමශීලී විය හැකිය.
  4. බොහෝ බන්ධන තාක්ෂණයන් (ස්ප්‍රින්ග් එම්වීසී දත්ත බන්ධනය, ශිශිරතාරණය වැනි ...) වැඩ කරන්නේ ආර්ග් පෙරනිමි ඉදිකිරීම්කරුවන් සමඟ පමණි (මෙයට හේතුව වූයේ විවරණ සෑම විටම නොතිබීමයි).

@ConstructorPropertiesවෙනස් කළ නොහැකි වස්තුවක් නිර්මාණය කිරීම සඳහා ඔබට වෙනත් විකෘති ගොඩනැඟීමේ වස්තුවක් (සාමාන්‍යයෙන් චතුර ලෙස) වැනි විවරණ භාවිතා කරමින් # 1 සහ # 2 අවම කළ හැකිය .


5

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

එසේම වෙනස් කළ නොහැකි වස්තූන් රාජ්‍ය පන්තියේ සමස්ත පන්තියම පාහේ ඉවත් කරයි.

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

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

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


4

මිනිසුන් ඕනෑම ප්‍රබල අංගයක් භාවිතා කරන්නේ ඇයි? මිනිසුන් මෙටා-ක්‍රමලේඛනය, කම්මැලිකම හෝ ගතික ටයිප් කිරීම භාවිතා කරන්නේ ඇයි? පිළිතුර පහසුවයි. විකෘති තත්වය එතරම් පහසුය. තැනින් තැන යාවත්කාලීන කිරීම එතරම් පහසු වන අතර විකෘති තත්වයට වඩා වෙනස් කළ නොහැකි තත්වයක් සමඟ වැඩ කිරීමට ව්‍යාපෘති ප්‍රමාණයෙන් එළිපත්ත සෑහෙන තරම් ඉහළ මට්ටමක පවතින බැවින් තේරීම ඔබට ටික වේලාවකට පසුබට නොවනු ඇත.


4

ක්‍රමලේඛන භාෂා පරිගණක මඟින් ක්‍රියාත්මක කිරීම සඳහා නිර්මාණය කර ඇත. පරිගණකයේ සියලුම වැදගත් ගොඩනැඟිලි කොටස් - CPU, RAM, හැඹිලි, තැටි - විකෘති වේ. ඒවා (BIOS) නොමැති විට, ඒවා සැබවින්ම වෙනස් නොවන අතර ඔබට නව වෙනස් කළ නොහැකි වස්තූන් නිර්මාණය කළ නොහැක.

එබැවින්, වෙනස් කළ නොහැකි වස්තූන් මත ගොඩනගා ඇති ඕනෑම ක්‍රමලේඛන භාෂාවක් එය ක්‍රියාත්මක කිරීමේදී නිරූපණ පරතරයකින් පීඩා විඳිති. සී වැනි මුල් භාෂාවන් සඳහා එය විශාල බාධාවක් විය.


1

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

පොදුවේ ගත් කල, ඔබට පන්ති වර්ග තුනක් තිබේ: සාමාන්‍ය, නූල් නොවන ආරක්ෂිත පන්ති, ඒවා ප්‍රවේශමෙන් ආරක්ෂා කර ආරක්ෂා කළ යුතුය; නිදහසේ භාවිතා කළ හැකි වෙනස් කළ නොහැකි පන්ති; සහ විකෘති, නූල්-ආරක්ෂිත පංති නිදහසේ භාවිතා කළ හැකි නමුත් ඒවා ඉතා පරිස්සමින් ලිවිය යුතුය. පළමු වර්ගය කරදරකාරී එකක් වන අතර නරකම ඒවා තුන්වන වර්ගයට අයත් යැයි සැලකේ . ඇත්ත වශයෙන්ම, පළමු වර්ගය ලිවීමට පහසු ඒවා වේ.

මම සාමාන්‍යයෙන් අවසන් වන්නේ සාමාන්‍ය, විකෘති පංති රාශියකින් වන අතර එය ඉතා පරිස්සමින් නැරඹිය යුතුය. බහු-නූල් තත්වයක් තුළ, මාරාන්තික වැලඳ ගැනීමක් වළක්වා ගත හැකි වුවද, අවශ්‍ය සමමුහුර්තකරණය සෑම දෙයක්ම මන්දගාමී කරයි. ඒ නිසා මම සාමාන්‍යයෙන් විකෘති පංතියේ වෙනස් කළ නොහැකි පිටපත් සාදමින් ඒවා භාවිතා කළ හැකි ඕනෑම කෙනෙකුට භාර දෙමි. ඔරිජිනල් විකෘති වන සෑම අවස්ථාවකම නව වෙනස් කළ නොහැකි පිටපතක් අවශ්‍ය වේ, එබැවින් ඇතැම් විට එහි මුල් පිටපත් සියයක් එහි තිබිය හැකි යැයි මම සිතමි. මම සම්පූර්ණයෙන්ම රඳා පවතින්නේ කසළ එකතු කිරීම මත ය.

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

ප්‍රා.ලේ. ලෙස, ජාවා ලබා ගන්නන් සහ සැකසුම් කරුවන් අතපසු වන බව මට හැඟේ. මෙය පරීක්ෂා කරන්න .


7
වෙනස් කළ නොහැකි තත්වය තවමත් රාජ්‍යයකි.
ජෙරමි හීලර්

3
@JeremyHeiler: සැබෑ, නමුත් එය දෙයක් රාජ්ය තියෙන්නේ වේ mutable. කිසිවක් විකෘති නොවන්නේ නම්, ඇත්තේ එක් රාජ්‍යයක් පමණි, එය කිසිසේත්ම කිසිදු රාජ්‍යයක් නොවන දෙයකි.
රැල්ෆ්චැපින්

1

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

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

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

බොහෝ පංති නිර්මාණය කිරීමෙන් පසු විකෘති වන අතර එය එහි ගුණාංග කෙලින්ම හසුරුවා නොගත යුතුය - ඒ වෙනුවට එහි ගුණාංග සැබෑ ව්‍යාපාරික තර්කනය සමඟ ක්‍රම ඇමතුම් මගින් හැසිරවීමට ඉල්ලා සිටිය යුතුය (ඔව්, කට්ටලයක් සෑහෙන්න සමානයි දේපල කෙලින්ම හැසිරවීම වැනි දෙයක්)

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


1

විකෘති වස්තූන් භාවිතා කරනුයේ ඔබට වස්තුව ක්ෂණිකව යෙදීමෙන් පසු ගුණක අගයන් සැකසීමට සිදුවන විට ය.

ඔබට පරාමිති හයක් සහිත ඉදිකිරීම්කරුවෙකු නොසිටිය යුතුය. ඒ වෙනුවට ඔබ වස්තුව වෙනස් කිරීමේ ක්‍රම මගින් වෙනස් කරයි.

අකුරු, දිශානතිය යනාදිය සඳහා සැකසුම් සහිත වාර්තා වස්තුවක් මෙයට නිදසුනකි.

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

සංස්කරණය කරන්න: වස්තුවේ සමස්ත තත්වය ගොඩනඟා ගැනීමට බිල්ඩර් රටාව භාවිතා කළ හැකිය.


3
මෙය ඉදිරිපත් කරනුයේ විකෘතිතාව සහ ක්ෂණිකකරණයෙන් පසු වෙනස් වීම බහු අගයන් සැකසීමට ඇති එකම ක්‍රමය ලෙස ය. සම්පුර්ණත්වය සඳහා, බිල්ඩර් රටාව සමාන හෝ ඊටත් වඩා ප්‍රබල හැකියාවන් ලබා දෙන අතර, වෙනස් කළ නොහැකි දේ කැප කිරීමට කෙනෙකුට අවශ්‍ය නොවේ. new ReportBuilder().font("Arial").orientation("landscape").build()
gnat

1
"ඉතා දිගු ඉදිකිරීම්කරුවන්ගේ අත්සනක් තිබීම ප්‍රායෝගික නොවනු ඇත.": ඔබට සෑම විටම පරාමිතීන් කුඩා වස්තූන් වලට කාණ්ඩගත කළ හැකි අතර මෙම වස්තූන් පරාමිතීන් ලෙස ඉදිකිරීම්කරු වෙත යැවිය හැකිය.
ජෝජියෝ

1
HcHao ඔබට ගුණාංග 10 ක් හෝ 15 ක් සැකසීමට අවශ්‍ය නම් කුමක් කළ යුතුද? එසේම නම් කරන ලද ක්‍රමයක් withFontනැවත ලබා දීම හොඳ බවක් නොපෙනේ Report.
ටියුලින්ස් කෝර්ඩෝවා

1
(10) ජාවා එම සියලු අතරමැදි වස්තූන් තැනීම වළක්වා ගන්නේ කෙසේදැයි දැන සිටියේ නම් සහ (2) නම් නම් ප්‍රමිතිගත කර ඇත්නම්, ගුණාංග 10 ක් හෝ 15 ක් සැකසීමේදී, එසේ කිරීමේ කේතය අමුතු නොවේ. එය වෙනස් කළ නොහැකි ගැටළුවක් නොවේ; එය හොඳින් කරන්නේ කෙසේදැයි නොදැන ජාවා සමඟ ගැටළුවක්.
cHao

1
ගුණාංග 20 ක් සඳහා ඇමතුම් දාමයක් සෑදීම කැතයි. කැත කේතය දුර්වල ගුණාත්මක කේතයක් වේ.
ටියුලින්ස් කෝර්ඩෝවා

1

විකෘති වස්තූන් භාවිතා කිරීම අත්‍යවශ්‍ය චින්තනයෙන් ඇති වූවක් යැයි මම සිතමි: ඔබ විකෘති විචල්‍යයන්ගේ අන්තර්ගතය පියවරෙන් පියවර වෙනස් කිරීමෙන් ප්‍රති result ලයක් ගණනය කරයි (අතුරු ප්‍රති by ල අනුව ගණනය කිරීම).

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

ක්‍රියාකාරී ප්‍රවේශය වඩා පිරිසිදු හා වඩා ශක්තිමත් විය හැකි නමුත් පිටපත් කිරීම නිසා එය ඉතා අකාර්යක්ෂම විය හැකි අතර එමඟින් ඔබ වැඩි වැඩියෙන් වෙනස් කරන හවුල් දත්ත ව්‍යුහයකට ආපසු යාමට අවශ්‍ය වේ.

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

ඉතින්, බොහෝ ක්‍රමලේඛකයින් විකෘති වස්තු භාවිතා කරන්නේ ඇයි? IMHO හේතු දෙකක් නිසා:

  1. අත්‍යවශ්‍ය (ක්‍රියාපටිපාටිය හෝ වස්තු-නැඹුරු) උපමා භාවිතයෙන් ක්‍රමලේඛනය කරන්නේ කෙසේදැයි බොහෝ ක්‍රමලේඛකයින් ඉගෙන ගෙන ඇත, එබැවින් විකෘතිතාව යනු ගණනය කිරීම නිර්වචනය කිරීමේ ඔවුන්ගේ මූලික ප්‍රවේශයයි, එනම් ඔවුන් නොදැනුවත්වම වෙනස් නොවන බව භාවිතා කරන්නේ කවදාද සහ කෙසේද යන්න ඔවුන් නොදනිති.
  2. බොහෝ ක්‍රමලේඛකයින් කාර්ය සාධනය ගැන කල්තියා කනස්සල්ලට පත්වන අතර බොහෝ විට ක්‍රියාකාරී ලෙස නිවැරදි වැඩසටහනක් ලිවීම කෙරෙහි වැඩි අවධානයක් යොමු කිරීම වඩාත් effective ලදායී වන අතර පසුව බාධක සොයාගෙන එය ප්‍රශස්ත කිරීමට උත්සාහ කරන්න.

1
ප්‍රශ්නය වේගය පමණක් නොවේ. විකෘති වර්ග භාවිතා නොකර සරලව ක්‍රියාත්මක කළ නොහැකි ප්‍රයෝජනවත් ඉදිකිරීම් වර්ග බොහොමයක් තිබේ. වෙනත් දේ අතර, නූල් දෙකක් අතර සන්නිවේදනය සඳහා අවශ්‍ය වන්නේ, අවම වශයෙන්, දෙකම හවුල් වස්තුවක් පිළිබඳ සඳහනක් තිබිය යුතු අතර එමඟින් කෙනෙකුට දත්ත තැබිය හැකි අතර අනෙකාට එය කියවිය හැකිය. තවද, "මෙම වස්තුව ගන්න, P හි අගය හැර නව වස්තුවක් සාදන්න, ඉන්පසු නව වස්තුවක් සාදන්න" යනුවෙන් පැවසීමට වඩා "මෙම වස්තුවේ P සහ Q ගුණාංග වෙනස් කරන්න" යනුවෙන් පැවසීම බොහෝ විට අර්ථාන්විතව වඩා පැහැදිලි ය. Q හැරෙන්නට එය එසේ ය.
සුපර් කැට්

1
මම එෆ්පී විශේෂ expert යෙක් නොව නමුත් AFAIK (1) නූල් සන්නිවේදනය එක් නූල් එකක වෙනස් කළ නොහැකි අගයක් නිර්මාණය කර එය තවත් එකකින් කියවීමෙන් ලබා ගත හැකිය (නැවතත්, AFAIK, මෙය එර්ලැන්ග් ප්‍රවේශයයි) (2) දේපළක් සැකසීමේ අංකනය AFAIK බොහෝ දේ වෙනස් නොවේ (උදා: හස්කල් සෙට් ප්‍රොපර්ටි වාර්තා වටිනාකම ජාවා රෙකෝඩ්.සෙට් ප්‍රොපර්ටි (අගය) ට අනුරූප වේ), අර්ථකථනය පමණක් වෙනස් වන්නේ දේපලක් සැකසීමේ ප්‍රති result ලය නව වෙනස් කළ නොහැකි වාර්තාවක් වන බැවිනි.
ජෝජියෝ

1
"දෙදෙනාම හවුල් වස්තුවක් පිළිබඳ සඳහනක් තිබිය යුතු අතර එය කෙනෙකුට දත්ත තැබිය හැකි අතර අනෙකාට එය කියවිය හැකිය": වඩාත් නිවැරදිව, ඔබට වස්තුවක් වෙනස් කළ නොහැකි බවට පත් කළ හැකිය (සියලුම සාමාජිකයන් සී ++ හෝ ජාවාහි අවසාන) සහ සියලු අන්තර්ගතයන් අන්තර්ගතය ඉදිකිරීම්කරු. එවිට මෙම වෙනස් කළ නොහැකි වස්තුව නිෂ්පාදක නූල් සිට පාරිභෝගික නූල් වෙත භාර දෙනු ලැබේ.
ජෝජියෝ

1
(2) වෙනස් කළ නොහැකි තත්වයක් භාවිතා නොකිරීමට හේතුවක් ලෙස මම දැනටමත් කාර්ය සාධනය ලැයිස්තුගත කර ඇත්තෙමි. (1) සම්බන්ධයෙන්, ඇත්ත වශයෙන්ම නූල් අතර සන්නිවේදනය ක්‍රියාත්මක කරන යාන්ත්‍රණයට යම් විකෘති තත්වයක් අවශ්‍ය වේ, නමුත් ඔබට මෙය ඔබේ ක්‍රමලේඛන ආකෘතියෙන් සැඟවිය හැක, උදා: නළුවාගේ ආකෘතිය ( en.wikipedia.org/wiki/Actor_model ) බලන්න. එබැවින් පහළ මට්ටමින් ඔබට සන්නිවේදනය ක්‍රියාත්මක කිරීම සඳහා විකෘතිතාවයක් අවශ්‍ය වුවද, වෙනස් කළ නොහැකි වස්තූන් ඉදිරියට සහ පසුපසට යවන නූල් අතර සන්නිවේදනය කරන ඉහළ වියුක්ත මට්ටමක් ඔබට තිබිය හැකිය.
ජෝජියෝ

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

1

ඔබ ජාවා ගැන විමසන බව මම දනිමි, නමුත් මම සෑම විටම වෛෂයික-ඇ. වෙනස් කළ නොහැකි අරා NSArray සහ විකෘති අරා NSMutableArray ඇත. මේවා එකිනෙකට වෙනස් පංති දෙකකි. මට අරාව සෑදීමට අවශ්‍ය නම් සහ එහි අන්තර්ගතය කිසි විටෙකත් වෙනස් නොකරන්නේ නම්, මම එන්එස්ආරේ භාවිතා කරමි, එය කුඩා වස්තුවක් වන අතර එය විකෘති කළ අරාවකට සාපේක්ෂව එය කරන දෙයට වඩා වේගවත් වේ.

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

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


1

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

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

case class Person(id: String, firstName: String, lastName: String)

val joe = Person("123", "Joe", "Doe")
val spouse = Person(id = "124", firstName = "Mary", lastName = "Moe")
val joeMarried = joe.copy(lastName = "Doe-Moe")

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


මෙම කිසිවක් සැලකිය යුතු වැඩි ලකුණු එකතු කිරීමට බවක් පෙනෙන්නට නැත කළ අතර ඊට පෙර පිළිතුරු 24 මෙසේ පැහැදිලි කලේ
ඔටුවා

@gnat බොහෝ ප්‍රධාන ධාරාවේ භාෂාවන් නිශ්චලතාවයට නිසි ලෙස සහාය නොදක්වන බවට පෙර සඳහන් කළ පිළිතුරු වලින් කවරේද? මම හිතන්නේ එම කරුණ සරලවම කර නැත (මම පරීක්ෂා කර බැලුවෙමි), නමුත් මෙය IMHO තරමක් වැදගත් බාධකයකි.
හාන්ස්-පීටර් ස්ටෝර්

මේ එක උදාහරණයක් ජාවා මේ ප්රශ්නය පැහැදිලි ගැඹුර යයි. සහ අනෙකුත් පිළිතුරු අවම වශයෙන් 3 වක්රව එය සම්බන්ධ
ඔටුවා

0

වෙනස් කළ නොහැකි යන්නෙන් ඔබට අගය වෙනස් කළ නොහැකි අතර විකෘති යන්නෙන් අදහස් කරන්නේ ඔබ ප්‍රාථමික හා වස්තූන් අනුව සිතන්නේ නම් අගය වෙනස් කළ හැකි බවයි. ජාවාහි ප්‍රාථමිකයන්ට වඩා වස්තූන් වෙනස් වන අතර ඒවා වර්ග වලින් සාදා ඇත. ප්‍රාථමිකයන් ඉන්ටර්, බූලියන් සහ අවලංගු වැනි ආකාරවලින් සාදා ඇත.

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

public abstract class FinalBase {

    private final int variable; // Unset

    /* if final really means immutable than
     * I shouldn't be able to set the variable
     * but I can.
     */
    public FinalBase(int variable) { 
        this.variable = variable;
    }

    public int getVariable() {
        return variable;
    }

    public abstract void method();
}

// This is not fully necessary for this example
// but helps you see how to set the final value 
// in a sub class.
public class FinalSubclass extends FinalBase {

    public FinalSubclass(int variable) {
        super(variable);
    }

    @Override
    public void method() {
        System.out.println( getVariable() );
    }

    @Override
    public int getVariable() {

        return super.getVariable();
    }

    public static void main(String[] args) {
        FinalSubclass subclass = new FinalSubclass(10);
        subclass.method();
    }
}

-1

මම හිතන්නේ හොඳ හේතුවක් වනුයේ අතුරුමුහුණත් කවුළු වැනි “සැබෑ ජීවිත” විකෘති “වස්තු” ආකෘතිගත කිරීමයි. යම් භාණ්ඩ තොටුපල මෙහෙයුමක් පාලනය කිරීම සඳහා යමෙකු මෘදුකාංග ලිවීමට උත්සාහ කරන විට OOP නිර්මාණය කරන ලද බව කියවීම මට නොපැහැදිලි මතකයි.


1
ඕඕපී හි මූලාරම්භය ගැන මා මෙය කියවා ඇත්තේ කොහෙන්දැයි මට තවම සොයාගත නොහැකි නමුත් විකිපීඩියාවට අනුව , විශාල බහාලුම් නැව් සමාගමක ඕඕසීඑල් හි සමහර ඒකාබද්ධ කලාපීය තොරතුරු පද්ධතියක් ස්මාල්ටෝක් හි ලියා ඇත.
ඇලෙක්සි

-2

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


5
finalඇත්ත වශයෙන්ම වෙනස් කළ නොහැකි දෙසට පියවරෙන් 1/4 ක් පමණ වේ. ඔබ එය සඳහන් කරන්නේ ඇයි දැයි නොපෙනේ.
cHao

ඔබ ඇත්තටම මගේ ලිපිය කියෙව්වාද?
රැල්ෆ් එච්

ඔබ ඇත්තටම ප්‍රශ්නය කියෙව්වාද? :) එයට කිසිම සම්බන්ධයක් නැත final. මෙම සන්දර්භය තුළ එය රැගෙන ඒම සඳහා ඇත්තටම අමුතු යනු සිනමාත්මක වීම සමහරුන්ගේ මනසේ මැවෙන්න පුළුවන් final, "mutable" සමග ඉතා ගන්න විට finalවැළැක්වීම විකෘති ඇතැම් වර්ගවල. (BTW, මගේ පහත් අගය නොවේ.)
cHao

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

1
විකෘති වස්තුවක් අවශ්‍ය වන අවස්ථා ඉතා අල්පය . විකෘති වස්තූන් භාවිතා කිරීමෙන් කේතය වඩාත් පැහැදිලි හෝ සමහර අවස්ථාවල වේගවත් වන අවස්ථා තිබේ. එහෙත්, මෝස්තර රටාවන්ගෙන් බහුතරයක් මූලික වශයෙන් එයට ස්වදේශීයව සහාය නොදක්වන භාෂා සඳහා ක්‍රියාකාරී ක්‍රමලේඛනයේ අඩක් තක්සේරු කිරීමක් පමණක් බව සලකන්න. එහි විනෝදජනක කොටස නම්, එෆ්පීයට අවශ්‍ය වන්නේ තෝරාගත් ස්ථානවල විකෘතිතාව පමණි (එනම් අතුරු ආබාධ සිදුවිය යුතු තැන), එම ස්ථාන සාමාන්‍යයෙන් සංඛ්‍යාව, ප්‍රමාණය සහ විෂය පථය තුළ තදින් සීමා වේ.
cHao
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.