ජාවා සංස්කෘතිය වැඩීම - දේවල් එතරම් බර වන්නේ ඇයි? එය ප්‍රශස්ත කරන්නේ කුමක් සඳහා ද? [වසා ඇත]


291

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

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

මා ආරම්භ කළ ස්ටැක් පිටාර ගැලීමේ ප්‍රශ්නයකින් අවම සම්පූර්ණ උදාහරණයක් ලබා ගත හැකිය: /programming/43619566/returning-a-result-with-severa-values-the-java-way/43620339

මට කාර්යයක් ඇත - විග්‍රහ කරන්න (තනි නූලකින්) සහ අගයන් තුනක කට්ටලයක් හසුරුවන්න. පයිතන්හි එය පැස්කල් හෝ සී 5-ලයිනර් වාර්තාවක් / ව්‍යුහයක් තුළ එක් ලයිනර් (ටුපල්) වේ.

පිළිතුරු වලට අනුව, ව්‍යුහයකට සමාන ප්‍රමාණයක් ජාවා සින්ටැක්ස් වලින් ලබා ගත හැකි අතර ත්‍රිත්වයක් පුළුල් ලෙස භාවිතා වන අපාචී පුස්තකාලයකින් ලබා ගත හැකිය - එහෙත් එය සිදු කිරීමේ “නිවැරදි” ක්‍රමය ඇත්ත වශයෙන්ම අගය සඳහා වෙනම පන්තියක් නිර්මාණය කිරීමෙනි. getters සහ setters. කවුරුහරි සම්පූර්ණ උදාහරණයක් දීමට ඉතා කාරුණික විය. එය කේත පේළි 47 ක් විය (හොඳයි, මෙම රේඛා සමහරක් හිස් විය).

විශාල සංවර්ධන ප්‍රජාවක් "වැරදි" නොවන බව මම තේරුම් ගතිමි. ඉතින් මෙය මගේ අවබෝධයේ ගැටලුවක්.

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


1
ප්‍රශ්නයේ තාක්ෂණික අංශවලට පිළිතුරු
නොදෙන



3
මෙන්න මම හිතන්නේ නිවැරදි පිළිතුරයි. ඔබ ජාවා ග්‍රහණය කරගන්නේ නැත, මන්ද ඔබ සිසැඩ්මින් වැනි ක්‍රමලේඛනය ගැන සිතනවා මිස ක්‍රමලේඛකයෙකු නොවේ. ඔබට, මෘදුකාංග යනු කිසියම් කාර්යයක් වඩාත් කඩිනමින් ඉටු කර ගැනීම සඳහා ඔබ භාවිතා කරන දෙයකි. මම අවුරුදු 20 ක් තිස්සේ ජාවා කේතය ලියමින් සිටිමි. මා විසින් වැඩ කරන ලද සමහර ව්‍යාපෘති සඳහා වසර 20, 2 ක කණ්ඩායමක් ගත වේ. ජාවා යනු පයිතන් වෙනුවට ආදේශකයක් නොවේ. ඔවුන් දෙදෙනාම ඔවුන්ගේ රැකියාවන් කළත් ඔවුන්ගේ රැකියා සම්පූර්ණයෙන්ම වෙනස් ය.
රිචඩ්

1
ජාවා තථ්‍ය ප්‍රමිතිය වීමට හේතුව එය සරලවම නිවැරදි බැවිනි. රැවුල මෝස්තරයට පෙර රැවුල වවාගත් බැරෑරුම් පුද්ගලයින් විසින් එය නිවැරදිව නිර්මාණය කරන ලදී. ලිපිගොනු හැසිරවීම සඳහා ඔබ ෂෙල් ස්ක්‍රිප්ට් තට්ටු කිරීමට පුරුදු වී සිටින්නේ නම්, ජාවා නොඉවසිය හැකි ලෙස පිපිරී ඇති බවක් පෙනේ. නමුත් ඔබට දිනකට 50M දෙනෙකුට සේවය කළ හැකි ද්විත්ව අතිරික්ත සේවාදායක පොකුරක් නිර්මාණය කිරීමට අවශ්‍ය නම්, පොකුරු රෙඩිස් හැඹිලි, බිල්කරණ පද්ධති 3 ක් සහ පවුම් 20 ක ඔරකල් දත්ත සමුදා පොකුරක් ආධාරයෙන් .. ඔබ පයිතන් භාවිතා නොකරනු ඇත. පයිතන්හි දත්ත සමුදාය පේළි 25 කින් අඩු කේතයකි.
රිචඩ්

Answers:


237

ජාවා භාෂාව

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

ජාවා මුලින් නිර්මාණය කරන ලද්දේ ඕඕ සමඟ තරමක් වැඩිදියුණු කළ සී ලෙස ය. ජාවා 70 දශකයේ වාක්‍ය ඛණ්ඩයක් ඇත. තවද, පසුගාමී ගැළපුම රඳවා තබා ගැනීම සඳහාත්, කාලය පිළිබඳ පරීක්ෂණයට මුහුණ දීමට ඉඩ දීම සඳහාත් විශේෂාංග එකතු කිරීම පිළිබඳව ජාවා ඉතා සාම්ප්‍රදායික ය. ජාවා 2005 දී එක්ස්එම්එල් ලිටරල් වැනි නවීන පන්නයේ අංග එකතු කළේ නම්, එක්ස්එම්එල් සියලු කෝපයට පත් වූ විට භාෂාව කිසිවෙකු නොසැලකෙන සහ වසර 10 කට පසුව එහි පරිණාමය සීමා කරන අවතාර ලක්ෂණ වලින් පිරී ඉතිරී යනු ඇත. එබැවින් ජාවාහි සංකල්ප දැඩි ලෙස ප්‍රකාශ කිරීමට නවීන වාක්‍ය ඛණ්ඩයක් නොමැත.

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


ජාවා සංස්කෘතිය

ව්‍යවසාය ජාවා සංවර්ධනයේ ඉතිහාසය බොහෝ දුරට අද අප දකින සංස්කෘතියට අපව යොමු කර ඇත. 90 දශකයේ අග භාගයේ / 00 දශකයේ මුල් භාගයේදී, ජාවා සේවාදායක පාර්ශවීය ව්‍යාපාරික යෙදුම් සඳහා අතිශයින් ජනප්‍රිය භාෂාවක් බවට පත්විය. එවකට එම යෙදුම් බොහෝ දුරට තාවකාලිකව ලියා ඇති අතර HTTP API, දත්ත සමුදායන් සහ XML සංග්‍රහ සැකසීම වැනි සංකීර්ණ කරුණු රාශියක් ඇතුළත් විය.

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

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

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


15
හාස්‍යජනක දෙය නම් වෙනත් භාෂාවන් සමහර “ජාවා-ඉස්ම්” ලබා ගන්නා බව පෙනේ. PHP OO විශේෂාංග ජාවා වෙතින් දැඩි ලෙස ආනුභාව ලත් අතර වර්තමානයේ ජාවාස්ක්‍රිප්ට් එහි විශාල රාමු ප්‍රමාණයක් නිසා විවේචනයට ලක්ව ඇති අතර සියලු පරායත්තයන් එක්රැස් කර නව යෙදුමක් ආරම්භ කිරීම කෙතරම් දුෂ්කර ද?
මාකස්

14
සමහර විට "රෝදය ප්‍රතිනිර්මාණය නොකරන්න" යන කාරණය සමහර අය ඉගෙන ගත් නිසා?
පරායත්තතාව

9
"ටර්සේ" බොහෝ විට චාප , "දක්ෂ" , කේත-ගොල්ෆ්-ඊෂ් එක්-ලයිනර් බවට පරිවර්තනය කරයි .
ටියුලින්ස් කෝර්ඩෝවා

7
කල්පනාකාරී, හොඳින් ලියා ඇති පිළිතුර. Context තිහාසික සන්දර්භය. සාපේක්ෂව විවෘත නොවූ. හොඳට කලා.
Cheezmeister

11
Ula ටියුලින්ස් කෝර්ඩෝවා මම එකඟ වන්නේ “වසංගතය වැනි දක්ෂ උපක්‍රම වලින් වැළකී සිටිය යුතු” බවයි (ඩොනල්ඩ් නුත්), නමුත් එයින් අදහස් කරන්නේ වඩා සුදුසු (හා කියවිය හැකි) forවිට ලූපයක් ලිවීම නොවේ map. ප්‍රීතිමත් මාධ්‍යයක් තිබේ.
බ්‍රයන් මැකට්චොන්

74

ඔබ මතු කරන එක් කරුණක් සඳහා අන් අය විසින් මතු නොකළ පිළිතුරක් මා සතුව ඇතැයි මම විශ්වාස කරමි.

කිසි විටෙකත් උපකල්පන නොකර ජාවා සම්පාදක-කාලීන ක්‍රමලේඛක දෝෂ හඳුනාගැනීම සඳහා ප්‍රශස්තිකරණය කරයි

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

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

තවත් සමහර භාෂාවන් පූර්ව කොන්දේසි, පශ්චාත්-කොන්දේසි සහ ආක්‍රමණ පරීක්ෂා කිරීමෙන් එම තර්කනය තව දුරටත් තල්ලු කරයි (ඒවා සම්පාදනය කරන වේලාවේදී ඒවා කරන බව මට විශ්වාස නැත). මෙය සම්පාදකයාට තමාගේම කෘතියක් දෙවරක් පරීක්ෂා කර බැලීමට ක්‍රමලේඛකයාට ඊටත් වඩා ආන්තික ක්‍රම වේ.

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

ජාවා හි එය කිරීමට ක්‍රම දෙකක් තිබේ:

  1. භාවිතය Triplet<A, B, C>නැවත වර්ගය (ඇත්තටම විය කරන යුතු ලෙස java.util, සහ එය එසේ නොවේ ඇයි මම ඇත්තටම පැහැදිලි කළ නොහැක. JDK8 හඳුන්වා විශේෂයෙන්ම සිට Function, BiFunction, Consumer, BiConsumer, ආදිය ... එය හුදෙක් බව පෙනේ Pairසහ Tripletතේරුමක් ඇත අවම වශයෙන්. නමුත් මම digress )

  2. ඒ සඳහා ඔබේම වටිනාකම් වර්ගයක් සාදන්න, එහිදී සෑම ක්ෂේත්‍රයක්ම නම් කර නිසි ලෙස ටයිප් කරන්න.

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

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

ටයිප්ස්ක්‍රිප්ට් (හෝ ප්‍රවාහ වර්ගය) තුළ මෙවැනි දෙයක් සලකා බලන්න.

function parseDurationInMillis(csvLine){
    // here the developer intends to return a Number, 
    // but actually it's a String
    return csv.firstField();
}

// Compiler infers that parseDurationInMillis is String, so it does
// string concatenation and infers that plusTwoSeconds is String
// Developer actually intended Number
var plusTwoSeconds = 2000 + parseDurationInMillis(csvLine);

ඇත්ත වශයෙන්ම මෙය මෝඩ සුළු කාරණයක් වන නමුත් කේතය නිවැරදිව පෙනෙන නිසා එය වඩාත් සියුම් විය හැකි අතර ගැටළු නිරාකරණය කිරීමට අපහසු වේ . ජාවා හි මේ ආකාරයේ ගැටළු මුළුමනින්ම මග හැරී ඇති අතර, මුළු භාෂාවම නිර්මාණය කර ඇත්තේ එයයි.


නිසි වස්තු දිශානත මූලධර්ම සහ වසම් මත පදනම් වූ ආකෘති නිර්මාණය අනුගමනය කිරීමෙන්, සම්බන්ධිත ප්‍රශ්නයේ කාල විග්‍රහ කිරීමේ අවස්ථාව ද java.time.Durationවස්තුවක් ලෙස ආපසු ලබා දිය හැකි බව සලකන්න , එය ඉහත අවස්ථා දෙකම වඩා පැහැදිලි වනු ඇත.


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

8
ගතික භාෂාවක ව්‍යංග පරිවර්තනයට ඉඩ දීමට ජාවාස්ක්‍රිප්ට් ගත් තීරණය මෝඩකමක් බව එම නියැදිය නිරූපණය නොකරයි. ඕනෑම අනුමාන ගතික භාෂාවක් හෝ වර්ග අනුමාන කිරීම් සහිත සංඛ්‍යානමය භාෂාවක් මෙයට ඉඩ නොදේ. මෙම වර්ග දෙකටම නිදසුනක් ලෙස: පයිතන් හැර ධාවන වේලාවක් හැර, හැස්කෙල් සම්පාදනය නොකරයි.
Voo

39
omstomsmeding මෙම තර්කය විශේෂයෙන් මෝඩ බව සඳහන් කිරීම වටී, මන්ද හස්කල් ජාවා වලට වඩා වසර 5 ක් පමණ දිගු කාලයක් ගත වී ඇති බැවිනි . ජාවා වර්ගයේ පද්ධතියක් තිබිය හැකි නමුත් එය නිකුත් කරන විට එහි නවීන නිරවද්‍යතාව තහවුරු කිරීමේ තත්වයක් පවා නොතිබුණි.
ඇලෙක්සිස් කිං

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

19
On කොන්රාඩ් රුඩොල්ෆ් ඔව්, මෙම පිළිතුර චිත්තවේගීය වශයෙන් සිත් ඇදගන්නා සුළු යැයි මම සිතුවත්, එය සම්පූර්ණයෙන්ම විකාරයකි. එයට මෙතරම් ඡන්ද ප්‍රමාණයක් ඇත්තේ මන්දැයි මට විශ්වාස නැත. හැස්කෙල් (හෝ සමහර විට ඊටත් වඩා සැලකිය යුතු ලෙස අයිඩ්‍රිස්) ජාවා වලට වඩා නිවැරදි බව සඳහා ප්‍රශස්තිකරණය කරයි, තවද එය සැහැල්ලු සින්ටැක්ස් සහිත ටුපල් ඇත. එපමණක්ද නොව, දත්ත වර්ගයක් නිර්වචනය කිරීම එක් ලයිනර් එකක් වන අතර ජාවා අනුවාදයට ලැබෙන සෑම දෙයක්ම ඔබට ලැබේ. මේ පිළිතුර දුප්පත් භාෂාව නිර්මාණය හා අනවශ්ය verbosity සඳහා නිදහසට කරුණක් වේ, නමුත් එය ශබ්ද ඔබ ජාවා කැමති සහ වෙනත් භාෂා හුරුවක් නැති නම් හොඳයි.
ඇලෙක්සිස් කිං

50

ජාවා සහ පයිතන් යනු මම වැඩිපුරම භාවිතා කරන භාෂා දෙක වන නමුත් මම පැමිණෙන්නේ අනෙක් දිශාවෙන්. එනම්, මම පයිතන් භාවිතා කිරීමට පෙර ජාවා ලෝකයේ ගැඹුරු වූ නිසා මට උදව් කිරීමට හැකි වනු ඇත. "දේවල් මෙතරම් බර වන්නේ ඇයි" යන විශාල ප්‍රශ්නයට පිළිතුර කරුණු 2 ක් දක්වා පහත වැටෙනු ඇතැයි මම සිතමි.

  • මේ දෙක අතර සංවර්ධනය සඳහා වන පිරිවැය දිගු බැලූන් සත්ව බැලූනයක වාතය හා සමාන ය. ඔබට බැලූනයේ එක් කොටසක් මිරිකා ගත හැකි අතර තවත් කොටසක් ඉදිමෙයි. පයිතන් මුල් කොටස මිරිකීමට නැඹුරු වේ. ජාවා පසු කොටස මිරිකයි.
  • මෙම බරින් සමහරක් ඉවත් කරන විශේෂාංග ජාවා හි තවමත් නොමැත. ජාවා 8 මේ සඳහා විශාල දන්තාලේපයක් සාදා ඇති නමුත් සංස්කෘතිය විසින් වෙනස්කම් සම්පූර්ණයෙන්ම ජීර්ණය කර නොමැත. ජාවා වැනි තවත් දේවල් කිහිපයක් භාවිතා කළ හැකිය yield.

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

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

මේ වටා නරක පුරුදු (IMO) ඇත. මෙම අවස්ථාවේ දී ඔබට ටුපල් එකක් අවශ්‍ය නම්, ඔබ එය විකෘති වස්තුවක් කරන්නේ මන්දැයි මම ප්‍රශ්න කරමි. ඔබට අවශ්‍ය වන්නේ ලබා ගන්නන් පමණි (පැති සටහනක, මම ලබා ගැනීමේ / සැකසීමේ සම්මුතියට වෛර කරමි, නමුත් එය එයයි.) ජාවා හි පුද්ගලික හෝ පැකේජ-පෞද්ගලික සන්දර්භයක් තුළ හිස් පන්තියක් (විකෘති හෝ නොවේ) ප්‍රයෝජනවත් විය හැකි යැයි මම සිතමි. . එනම්, ව්‍යාපෘතියේ ඇති යොමු කිරීම් පන්තියට සීමා කිරීමෙන්, පන්තියේ පොදු අතුරුමුහුණත වෙනස් නොකර ඔබට අවශ්‍ය පරිදි පසුව ප්‍රතික්‍රියා කළ හැකිය. සරල වෙනස් කළ නොහැකි වස්තුවක් ඔබට නිර්මාණය කළ හැකි ආකාරය පිළිබඳ උදාහරණයක් මෙන්න:

public class Blah 
{
  public static Blah blah(long number, boolean isInSeconds, boolean lessThanOneMillis)
  {
    return new Blah(number, isInSeconds, lessThanOneMillis);
  }

  private final long number;
  private final boolean isInSeconds;
  private final boolean lessThanOneMillis;

  public Blah(long number, boolean isInSeconds, boolean lessThanOneMillis)
  {
    this.number = number;
    this.isInSeconds = isInSeconds;
    this.lessThanOneMillis = lessThanOneMillis;
  }

  public long getNumber()
  {
    return number;
  }

  public boolean isInSeconds()
  {
    return isInSeconds;
  }

  public boolean isLessThanOneMillis()
  {
    return lessThanOneMillis;
  }
}

මෙය මා භාවිතා කරන රටාවකි. ඔබ IDE භාවිතා නොකරන්නේ නම්, ඔබ ආරම්භ කළ යුතුය. එය ඔබ වෙනුවෙන් ලබා ගන්නන් (සහ ඔබට අවශ්‍ය නම් සැකසුම් කරන්නන්) ජනනය කරනු ඇත, එබැවින් මෙය එතරම් වේදනාකාරී නොවේ.

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

public class Blah 
{
  public static Blah fromSeconds(long number)
  {
    return new Blah(number * 1000_000);
  }

  public static Blah fromMills(long number)
  {
    return new Blah(number * 1000);
  }

  public static Blah fromNanos(long number)
  {
    return new Blah(number);
  }

  private final long nanos;

  private Blah(long nanos)
  {
    this.nanos = nanos;
  }

  public long getNanos()
  {
    return nanos;
  }

  public long getMillis()
  {
    return getNanos() / 1000; // or round, whatever your logic is
  }

  public long getSeconds()
  {
    return getMillis() / 1000; // or round, whatever your logic is
  }

  /* I don't really know what this is about but I hope you get the idea */
  public boolean isLessThanOneMillis()
  {
    return getMillis() < 1;
  }
}

අදහස් දීර් discussion සාකච්ඡාවක් සඳහා නොවේ; මෙම සංවාදය චැට් කිරීමට ගෙන ගොස් ඇත .
maple_shaft

2
"වඩාත් නවීන" ජාවා විශේෂාංග සම්බන්ධයෙන් ස්කලා දෙස බැලීමට මම ඔබට යෝජනා කරමි ...
මයික් ඩබ්ලිව්

1
Ike මයික් ඩබ්ලිව් මම සැබවින්ම මුල් නිකුතුවලදී ස්කලා සමඟ ආරම්භ කළ අතර ටික කලක් පරිමාණ සංසදවල ක්‍රියාකාරී විය. මම හිතන්නේ එය භාෂා නිර්මාණයේ විශාල ජයග්‍රහණයක් නමුත් මම නිගමනය කළේ එය ඇත්ත වශයෙන්ම මා සොයන දේ නොවන බවත් මම එම ප්‍රජාවේ හතරැස් කොටුවක් බවත් ය. මම නැවත එය දෙස බැලිය යුත්තේ එය එතැන් පටන් සැලකිය යුතු ලෙස වෙනස් වී ඇති බැවිනි.
ජිමී ජේම්ස්

මෙම පිළිතුර OP විසින් මතු කරන ලද ආසන්න අගය අගය ආමන්ත්‍රණය නොකරයි.
එරික්

@ErikE "ආසන්න වටිනාකම" යන වචන ප්‍රශ්න පෙළෙහි නොපෙන්වයි. මා ආමන්ත්‍රණය නොකළ ප්‍රශ්නයේ නිශ්චිත කොටස වෙත මා යොමු කළ හැකි නම්, මට එසේ කිරීමට උත්සාහ කළ හැකිය.
ජිමී ජේම්ස්

41

ඔබට ජාවා ගැන පිස්සු වැටීමට පෙර, කරුණාකර මගේ පිළිතුර ඔබගේ අනෙක් ලිපියෙන් කියවන්න .

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

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

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

නිදසුනක් ලෙස, නිවැරදිව වැඩ කිරීම සඳහා ඔබේ කාල සාරාංශය හා සංසන්දනය සඳහා සත්‍ය වශයෙන්ම අවශ්‍ය වන්නේ කුමක්ද යන්න පිළිබඳව ඔබ තව දුරටත් ඉගෙන ගන්නා බව කියමු, තවද "දළ වශයෙන් මිලි තත්පර 32 ක දෝෂයක්" (වර්ගයට ආසන්නව) දැක්වීමට ඔබට අතරමැදි ධජයක් අවශ්‍ය බව ඔබ සොයා ගනී. 1000 හි මූල, එබැවින් ල ar ු ගණකයේ 1 සිට 1000 දක්වා අඩක්). මෙය නිරූපණය කිරීම සඳහා ප්‍රාථමිකයන් භාවිතා කරන කේතයට ඔබ බැඳී සිටී නම්, ඔබ සතුව ඇති කේතයේ සෑම ස්ථානයක්ම සොයා ගෙන is_in_seconds,is_under_1msඑය වෙනස් කළ යුතුයis_in_seconds,is_about_32_ms,is_under_1ms. සෑම තැනකම සෑම දෙයක්ම වෙනස් කිරීමට සිදුවනු ඇත! වෙනත් තැනක පරිභෝජනය කළ හැකි වන පරිදි දෝෂයේ ආන්තිකය සටහන් කිරීම වගකිව යුතු පන්තියක් බවට පත් කිරීම ඔබේ පාරිභෝගිකයින්ට දෝෂ කාරණයේ ආන්තිකයන් හෝ ඒවා ඒකාබද්ධ වන ආකාරය පිළිබඳ තොරතුරු දැන ගැනීමෙන් නිදහස් වන අතර අදාළ දෝෂයේ ආන්තිකය සඳහන් කිරීමට ඔවුන්ට ඉඩ දෙයි. මෙම මොහොතේ දී. .

සංවෘත ප්‍රකාශය

ඔබ SOLID සහ GRASP මූලධර්ම හා වඩාත් දියුණු මෘදුකාංග ඉංජිනේරු විද්‍යාව වෙත සමීප වන විට ජාවාහි බර පිළිබඳ පැමිණිල්ල පහව යන බවක් පෙනේ.

අතිරේක

C # හි ස්වයංක්‍රීය ගුණාංග සහ ඉදිකිරීම්කරුවන්ට ලබා ගත හැකි දේපල පැවරීමේ හැකියාව "ජාවා මාර්ගය" සඳහා අවශ්‍ය වන තරමක් අවුල් සහගත කේතය තවදුරටත් පිරිසිදු කිරීමට උපකාරී වන බව මම සම්පූර්ණයෙන්ම අනවශ්‍ය ලෙස හා අසාධාරණ ලෙස එකතු කරමි. :

// Warning: C# code!
public sealed class ApproximateDuration {
   public ApproximateDuration(int lowMilliseconds, int highMilliseconds) {
      LowMilliseconds = lowMilliseconds;
      HighMilliseconds = highMilliseconds;
   }
   public int LowMilliseconds { get; }
   public int HighMilliseconds { get; }
}

ඉහත ජාවා ක්‍රියාත්මක කිරීම මෙන්න:

public final class ApproximateDuration {
  private final int lowMilliseconds;
  private final int highMilliseconds;

  public ApproximateDuration(int lowMilliseconds, int highMilliseconds) {
    this.lowMilliseconds = lowMilliseconds;
    this.highMilliseconds = highMilliseconds;
  }

  public int getLowMilliseconds() {
    return lowMilliseconds;
  }

  public int getHighMilliseconds() {
    return highMilliseconds;
  }
}

දැන් ඒක හරිම පිරිසිදුයි. වෙනස් කළ නොහැකි බව ඉතා වැදගත් හා හිතාමතාම භාවිතා කිරීම සැලකිල්ලට ගන්න - මෙම විශේෂිත වටිනාකම් දරණ පන්තිය සඳහා මෙය ඉතා වැදගත් බව පෙනේ.

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


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

2
ඔබ මෙම පිළිතුරට කැමති නම්, වසම්-ධාවනය කළ සැලසුම කියවන්න. කේතයේ වසම් සංකල්ප නිරූපණය කිරීමේ මෙම මාතෘකාව පිළිබඳව එය කීමට බොහෝ දේ ඇත.
neontapir

@neontapir ඔව්, ස්තූතියි! මම දැනගෙන හිටියා ඒකට නමක් තියෙනවා කියලා! :-) ඩොමේන් සංකල්පයක් දේවානුභාවයෙන් ප්‍රතිනිර්මාණය කිරීමෙන් (මේ වගේ!) Organ න්ද්‍රීයව දිස්වන විට මම එයට වැඩි කැමැත්තක් දක්වන බව පැවසිය යුතු වුවද ... එය නෙප්චූන් සොයා ගැනීමෙන් ඔබේ 19 වන සියවසේ ගුරුත්වාකර්ෂණ ගැටලුව විසඳීමට පැමිණි විට එය ටිකක් සමාන වේ .. .
සුසාන් ඩබ්ලිව්

Us සුසාන් ඩබ්ලිව්. ප්‍රාථමික ඇබ්බැහි වීම ඉවත් කිරීම සඳහා ප්‍රතික්‍රියා කිරීම වසම් සංකල්ප අනාවරණය කර ගැනීම සඳහා විශිෂ්ට ක්‍රමයක් විය හැකිය!
neontapir

සාකච්ඡා කළ පරිදි මම උදාහරණයේ ජාවා අනුවාදයක් එක් කළෙමි. මම සී # හි ඇති සියලුම මැජික් සින්ටැක්ටිකල් සීනි ගැන නොසිතමි, එබැවින් යමක් නැතිවී ඇත්නම්, මට දන්වන්න.
ජිමී ජේම්ස්

24

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

පයිතන් යනු කේතයේ පැහැදිලි බව සහ සරල බව (කියවීමට හා ලිවීමට පහසු) සඳහා ප්‍රශස්තිකරණය කරන බහු-පරමාදර්ශී භාෂාවකි .

ජාවා (සාම්ප්‍රදායිකව) තනි-පරමාදර්ශී පංති පාදක OO භාෂාවක් වන අතර එය පැහැදිලි බව සහ අනුකූලතාව සඳහා ප්‍රශස්තිකරණය කරයි - වැඩි වාචික කේතයක පිරිවැය යටතේ වුවද.

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

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

අවම විශේෂ අවස්ථා සින්ටැක්ටික් සීනි සමඟ නිරන්තරයෙන් යෙදෙන තනි සංකල්පයකට (පංති) ජාවා කැමති වන අතර, ඕනෑම විශේෂිත කටයුත්තක් සඳහා වඩාත් පහසු තෝරා ගැනීමට ඔබට ඉඩ සලසමින් පයිතන් විවිධ මෙවලම් සහ සින්ටැක්ටික් සීනි ගොඩක් සපයයි.


+1, නමුත් ස්ටුලා වැනි පංති සමඟ සංඛ්‍යාත්මකව ටයිප් කළ භාෂාවන්ගෙන් යුත් මෙම දැල කෙසේ වෙතත්, ටුපල් හඳුන්වා දීමේ අවශ්‍යතාවය සොයාගත්තේ කෙසේද? පංති සහිත භාෂා සඳහා පවා සමහර අවස්ථාවලදී ටුපල් යනු ඉතා හොඳ විසඳුමක් යැයි මම සිතමි.
ඇන්ඩ්‍රස් එෆ්.

Nd ඇන්ඩ්‍රෙස්: ඔබ දැලක් යන්නෙන් අදහස් කරන්නේ කුමක්ද? ස්කලා යනු ජාවාට වඩා වෙනස් භාෂාවක් වන අතර විවිධ සැලසුම් මූලධර්ම හා මුග්ධයන් ඇත.
ජැක් බී

මම එය අදහස් කළේ ඔබේ 5 වන ඡේදයට පිළිතුරු වශයෙනි, එය ආරම්භ වන්නේ "නමුත් මෙය සැබවින්ම ජාවා සංස්කෘතියට නොගැලපේ [...]". ඇත්ත වශයෙන්ම, වාචිකත්වය ජාවා සංස්කෘතියේ කොටසක් බව මම එකඟ වෙමි, නමුත් ටුපල් හිඟය එසේ නොවිය හැක්කේ ඔවුන් “දැනටමත් පැහැදිලිව ප්‍රකාශිත පන්ති භාවිතා කරන” බැවිනි - සියල්ලට පසු, ස්කලාට ද පැහැදිලි පන්ති ඇත (සහ වඩාත් සංක්ෂිප්ත සිද්ධි පන්ති හඳුන්වා දෙයි ), නමුත් එය ටුපල් වලටද ඉඩ දෙයි! අන්තිමේදී, මම සිතන්නේ ජාවා විසින් ටුපල් හඳුන්වා නොදුන්නේ පංතිවලට එය සාක්ෂාත් කරගත හැකි නිසා (වැඩි අවුල් ජාලයකින්) පමණක් නොව, එහි වාක්‍ය ඛණ්ඩය සී ක්‍රමලේඛකයින්ට හුරුපුරුදු විය යුතු නිසාත්, සී ටුපල් නොමැති නිසාත් ය.
ඇන්ඩ්‍රස් එෆ්.

Nd ඇන්ඩ්‍රෙස්එෆ් .: ස්කලාට විවිධ දේ කිරීමේ ක්‍රමවලට එරෙහි වීමක් නැත, එය ක්‍රියාකාරී සුසමාදර්ශයෙන් සහ සම්භාව්‍ය OO වෙතින් විශේෂාංග ඒකාබද්ධ කරයි. එය ඒ ආකාරයෙන් පයිතන් දර්ශනයට වඩා සමීප ය.
JacquesB

Nd ඇන්ඩ්‍රෙස්: ඔව්, ජාවා සී / සී ++ ට ආසන්න සින්ටැක්ස් සමඟ ආරම්භ කළ නමුත් බොහෝ දේ සරල කළේය. සී # ජාවාහි හරියටම පිටපතක් ලෙස ආරම්භ වූ නමුත් වසර ගණනාවක් පුරා ටුපල් ඇතුළු විශේෂාංග රැසක් එකතු කර ඇත. එබැවින් එය සැබවින්ම භාෂා නිර්මාණ දර්ශනයේ වෙනසක් වේ. (ජාවා අනුවාදයක් අඩු වචනයේ පරිසමාප්තාර්ථයෙන්ම නමුත් විය පෙනේ ඇත ඔබ එකම වන පන්ති කරන්න පුළුවන් නිසා උසස් පෙළ උත්සවය මුලදී ප්රතික්ෂේප කරන ලදී, නමුත් දැන් ඔවුන් හඳුන්වා දී ඇති නිසා සමහර විට අපි දර්ශනය වෙනස් දුටු ඇත...)
JacquesB

16

භාවිතයන් සොයන්න එපා; එය සාමාන්‍යයෙන් නරක අදහසක්, හොඳම භාවිතයන් BAD හි සඳහන් පරිදි, හොඳ රටා? . ඔබ හොඳ පුරුදු ඉල්ලන්නේ නැති බව මම දනිමි, නමුත් මම තවමත් සිතන්නේ ඔබට අදාළ අංග කිහිපයක් සොයාගත හැකි බවයි.

ඔබගේ ගැටළුවට විසඳුමක් සෙවීම පුහුණුවකට වඩා හොඳ වන අතර, ජාවා හි අගයන් තුනක් වේගයෙන් ආපසු ලබා දීමට ඔබේ ගැටළුව උපකාරී නොවේ:

  • අරා ඇත
  • ඔබට එක්-ලයිනර් එකක ලැයිස්තුවක් ලෙස අරාවක් ලබා දිය හැකිය: Arrays.asList (...)
  • ඔබට හැකි තරම් අඩු බොයිලේරු තහඩුව සමඟ වස්තුව පැත්ත තබා ගැනීමට අවශ්‍ය නම් (සහ ලොම්බොක් නැත):

class MyTuple {
    public final long value_in_milliseconds;
    public final boolean is_in_seconds;
    public final boolean is_under_1ms;
    public MyTuple(long value_in_milliseconds,....){
        ...
    }
 }

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

අවසාන වශයෙන්: මම අනුක්‍රමිකකරණ මෙවලම් විශාල ප්‍රමාණයක් භාවිතා කරන නිසා මම ලබා ගන්නන් භාවිතා කරමි, නමුත් මම ඒවා ලියන්නේද නැත; මම ලොම්බොක් භාවිතා කරමි: මගේ IDE විසින් සපයන කෙටිමං භාවිතා කරමි.


9
විවිධ භාෂාවලින් ඔබට හමු වන පොදු මෝඩයන් වඩාත් පහසුවෙන් ප්‍රවේශ විය හැකි තථ්‍ය ප්‍රමිතියක් බවට පත්වීමේ අවබෝධය තවමත් පවතී. එම මෝඩයන් කුමන හේතුවක් නිසා හෝ “හොඳ පුරුදු” යන මාතෘකාවට යටත් වේ.
බෙරින් ලොරිට්ස්

3
හේයි, ගැටලුවට සංවේදී විසඳුමක්. [Gs] etters සමඟ පූර්ණ ලෙස නිර්මාණය කරන ලද OOP විසඳුමක් වෙනුවට මහජන සාමාජිකයන් කිහිප දෙනෙකු සමඟ පන්තියක් (/ struct) ලිවීම තරමක් සාධාරණ බව පෙනේ.
ටොම්ස්මිං

3
පයිතන් මෙන් නොව, සෙවීම හෝ කෙටි හා වඩා අලංකාර විසඳුමක් දිරිමත් නොකිරීම නිසා මෙය පුපුරා යාමට හේතු වේ. නමුත් උඩු යටිකුරු වන්නේ ඕනෑම ජාවා සංවර්ධකයෙකුට මෙම පිපිරුම අඩු හෝ වැඩි වශයෙන් සමාන වනු ඇත. එබැවින් සංවර්ධකයින් වඩා හුවමාරු කර ගත හැකි නිසා ඉහළ නඩත්තු කිරීමේ මට්ටමක් ඇති අතර ව්‍යාපෘති දෙකක් සම්බන්ධ වුවහොත් හෝ කණ්ඩායම් දෙකක් නොදැනුවත්ව වෙනස් වුවහොත් සටන් කිරීමට අඩු ශෛලීය වෙනසක් ඇත.
මිහායිල් රමෙන්ඩික්

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

2
EtPeterMortensen එය තරමක් සම්බන්ධයක් නැති බොහෝ දේ කරන ජාවා පුස්තකාලයකි. එය ඉතා හොඳයි. මෙන්න විශේෂාංග
මයිකල්

11

පොදුවේ ජාවා මෝඩයන් ගැන:

ජාවා සෑම දෙයක් සඳහාම පන්ති පැවැත්වීමට විවිධ හේතු තිබේ. මගේ දැනුම අනුව, ප්‍රධාන හේතුව:

ජාවා ආරම්භකයින් සඳහා ඉගෙන ගැනීමට පහසු විය යුතුය. වඩාත් පැහැදිලිව පෙනෙන දේ නම්, වැදගත් තොරතුරු මග හැරීම දුෂ්කර ය. අඩු මැජික් සිදු වන අතර එය ආරම්භකයින්ට ග්‍රහණය කර ගැනීමට අපහසු වනු ඇත.


ඔබේ නිශ්චිත උදාහරණයට අනුව: වෙනම පංතියක් සඳහා වන තර්ක රේඛාව මෙයයි: එම කරුණු තුන එකිනෙකට තදින් සම්බන්ධ වී තිබේ නම් ඒවා එක අගයක් ලෙස ආපසු ලබා දෙනු ලැබේ නම්, එම “දෙය” ලෙස නම් කිරීම වටී. පොදු ආකාරයකින් ව්‍යුහගත කර ඇති දේවල් සමූහයක් සඳහා නමක් හඳුන්වා දීම යන්නෙන් අදහස් කරන්නේ පන්තියක් නිර්වචනය කිරීමයි.

ලොම්බොක් වැනි මෙවලම් සමඟ ඔබට බොයිලේරු පුවරුව අඩු කළ හැකිය:

@Value
class MyTuple {
    long value_in_milliseconds;
    boolean is_in_seconds;
    boolean is_under_1ms;
}

5
මෙය ගූගල් හි ස්වයංක්‍රීය අගය ව්‍යාපෘතිය ද වේ: github.com/google/auto/blob/master/value/userguide/index.md
අයිවන්

ජාවා වැඩසටහන් සාපේක්ෂව පහසුවෙන් නඩත්තු
Thorbjørn Ravn Andersen

7

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

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

ක්ෂේත්ර සහිත "ව්යුහය" පන්ති

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

   class ParseResult0 {
      public final long millis;
      public final boolean isSeconds;
      public final boolean isLessThanOneMilli;

      public ParseResult0(long millis, boolean isSeconds, boolean isLessThanOneMilli) {
         this.millis = millis;
         this.isSeconds = isSeconds;
         this.isLessThanOneMilli = isLessThanOneMilli;
      }
   }

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

තවත් අවාසියක් නම් පන්ති පදනම් කරගත් ප්‍රවේශයකින් ඔබ ක්ෂේත්‍ර නිරාවරණය කරන අතර එම ක්ෂේත්‍ර සියල්ලටම අගයන් තිබිය යුතුය . උදා: isSeconds සහ මිලි වලට සෑම විටම යම් අගයක් තිබිය යුතුය, isLessThanOneMilli සත්‍ය වුවද. LessThanOneMilli සත්‍ය වන විට මිලි ක්ෂේත්‍රයේ වටිනාකම පිළිබඳ අර්ථ නිරූපණය කුමක් විය යුතුද?

"ව්‍යුහයන්" අතුරුමුහුණත් ලෙස

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

   interface ParseResult {
      long getMillis();

      boolean isSeconds();

      boolean isLessThanOneMilli();

      static ParseResult from(long millis, boolean isSeconds, boolean isLessThanOneMill) {
         return new ParseResult() {
            @Override
            public boolean isSeconds() {
               return isSeconds;
            }

            @Override
            public boolean isLessThanOneMilli() {
               return isLessThanOneMill;
            }

            @Override
            public long getMillis() {
               return millis;
            }
         };
      }
   }

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

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

return (true, 500, false)

ඔබ අදහස් කළ විට:

return (500, true, false)

මේ ආකාරයේ ජාවා අතුරුමුහුණත සමඟ, ඔබට සම්පාදනය කළ නොහැක:

return ParseResult.from(true, 500, false);

කොහෙත්ම නැහැ. ඔබ කළ යුත්තේ:

return ParseResult.from(500, true, false);

එය සාමාන්‍යයෙන් සංඛ්‍යාත්මකව ටයිප් කළ භාෂාවල වාසියකි.

මෙම ප්‍රවේශය මඟින් ඔබට ලබා ගත හැකි අගයන් සීමා කිරීමේ හැකියාව ද ලබා දේ. උදාහරණයක් ලෙස, getMillis () අමතන විට, ඔබට LessThanOneMilli () සත්‍ය දැයි පරීක්ෂා කර බැලිය හැකි අතර, එසේ නම්, නීතිවිරෝධී ස්ටේට් එක්සෙප්ෂන් එකක් විසි කරන්න (නිදසුනක් ලෙස), එම අවස්ථාවේ දී මිලි වල අර්ථවත් වටිනාකමක් නොමැති නිසා.

වැරදි දේ කිරීම දුෂ්කර කිරීම

ඉහත අතුරුමුහුණත් උදාහරණයේ දී, ඔබට තවමත් ගැටළුවක් ඇත්තේ අහම්බෙන් isSeconds සහ isLessThanOneMilli තර්ක මාරු කළ හැකි නමුත් ඒවා එකම වර්ගයේ බැවින්.

ප්‍රායෝගිකව, ඔබට ටයිම් යුනිට් සහ කාලසීමාව භාවිතා කිරීමට අවශ්‍ය විය හැකිය, එවිට ඔබට මෙවැනි ප්‍රති result ලයක් ලැබෙනු ඇත:

   interface Duration {
      TimeUnit getTimeUnit();

      long getDuration();

      static Duration from(TimeUnit unit, long duration) {
         return new Duration() {
            @Override
            public TimeUnit getTimeUnit() {
               return unit;
            }

            @Override
            public long getDuration() {
               return duration;
            }
         };
      }
   }

   interface ParseResult2 {

      boolean isLessThanOneMilli();

      Duration getDuration();

      static ParseResult2 from(TimeUnit unit, long duration) {
         Duration d = Duration.from(unit, duration);
         return new ParseResult2() {
            @Override
            public boolean isLessThanOneMilli() {
               return false;
            }

            @Override
            public Duration getDuration() {
               return d;
            }
         };
      }

      static ParseResult2 lessThanOneMilli() {
         return new ParseResult2() {
            @Override
            public boolean isLessThanOneMilli() {
               return true;
            }

            @Override
            public Duration getDuration() {
               throw new IllegalStateException();
            }
         };
      }
   }

ඒක වෙන්න වෙනවා ගොඩක් වැඩි කේතය, එහෙත් ඔබ එක් වරක් පමණක් එය ලිවීමට අවශ්ය, සහ (ඔබ නිසි දේවල් ලේඛනගත තියෙනවා උපකල්පනය කරමින්), අවසන් වූ ජනතාව භාවිතා ඔබගේ කේතය කුමක් නිසා මාර්ගයෙන් අනුමාන කිරීමට නැති බවත්, අහම්බෙන් result[0]ඔවුන් අදහස් කරන විට වැනි දේවල් කළ නොහැක result[1]. ඔබට තවමත් සංක්ෂිප්තව අවස්ථා නිර්මාණය කළ හැකි අතර, ඒවායින් දත්ත ලබා ගැනීම එතරම් අපහසු නොවේ:

  ParseResult2 x = ParseResult2.from(TimeUnit.MILLISECONDS, 32);
  ParseResult2 y = ParseResult2.lessThanOneMilli();

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

තවත් පිළිතුරක සඳහන් වූයේ ජාවාහි ව්‍යවසාය ආකාරයේ ස්වභාවය බොහෝ විට ඔබ දැනටමත් පවතින වෙනත් පුස්තකාල රචනා කරන බවයි, නැතහොත් වෙනත් පුද්ගලයින්ට භාවිතා කිරීමට පුස්තකාල ලිවීමයි. ඔබේ පොදු API මඟින් මඟ හැරිය හැකි නම් ප්‍රති result ල වර්ග තේරුම් ගැනීමට ප්‍රලේඛනය විමසීමට බොහෝ කාලයක් අවශ්‍ය නොවිය යුතුය.

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

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


මම අවසානයේ ටයිම් යුනිට් වෙනුවට මගේම එනුම් භාවිතා කර ඇත්තෙමි, මන්ද මම නියම කාල ඒකක සමඟ UNDER1MS එකතු කළෙමි. දැන් මට ඇත්තේ ක්ෂේත්‍ර දෙකක් මිස තුනක් නොවේ. (න්‍යායට අනුව, මට TimeUnit.NANOSECONDS අනිසි ලෙස භාවිතා කළ හැකිය, නමුත් එය ඉතා ව්‍යාකූල වනු ඇත.)
මිහායිල් රමෙන්ඩික්

මම ලබා ගන්නෙකු නිර්මාණය කළේ නැත, නමුත් දැන් මම දකිමි originalTimeUnit=DurationTimeUnit.UNDER1MS, ඇමතුම්කරු මිලි තත්පර අගය කියවීමට උත්සාහ කළහොත්, ව්‍යතිරේකයක් විසි කිරීමට මට හැකි වන්නේ කෙසේද?
මිහායිල් රමෙන්ඩික්

ඔබ එය සඳහන් කළ බව මම දනිමි, නමුත් පයිතන් ටුපල් සමඟ ඔබේ උදාහරණය මතක තබා ගන්න ඇත්ත වශයෙන්ම ගතික එදිරිව සංඛ්‍යාත්මකව ටයිප් කළ ටුපල්; එය ඇත්ත වශයෙන්ම ටුපල් ගැන වැඩි යමක් නොකියයි. ඔබට ස්ථිතිකව ටයිප් කළ ටුපල් තිබිය හැකි අතර එය සම්පාදනය කිරීමට අසමත් වනු ඇත, ඔබ දන්නා බව මට විශ්වාසයි :)
ඇන්ඩ්‍රෙස් එෆ්.

1
Eed වීඩ්‍රැක් ඔබ අදහස් කරන්නේ කුමක්දැයි මට විශ්වාස නැත. මගේ අදහස වූයේ පුස්තකාල කේතය මේ ආකාරයට වඩා වාචිකව ලිවීම හරි (වැඩි කාලයක් ගත වුවද), එය ලිවීමට වඩා කේතය භාවිතා කිරීමට වැඩි කාලයක් ගත වන බැවිනි.
ජෝෂුවා ටේලර්

1
Eed වීඩ්‍රැක් ඔව්, ඒක ඇත්ත. නමුත් මා එහි පවත්වාගෙන කැමතියි වේ නොවන කිසි අර්ථාන්විතව නැවත භාවිත කරන බව කේතය අතර වෙනසක්, සහ කේතය. උදා: ජාවා පැකේජයක, සමහර පන්ති පොදු වන අතර වෙනත් ස්ථාන වලින් භාවිතා කරන්න. එම ඒපීඅයි හොඳින් සිතා බැලිය යුතුය. අභ්‍යන්තරව, එකිනෙකා සමඟ පමණක් කතා කිරීමට අවශ්‍ය විය හැකි පන්ති තිබේ. එම අභ්‍යන්තර කප්ලිං යනු ඉක්මන් හා අපිරිසිදු ව්‍යුහයන් (උදා: මූලද්‍රව්‍ය තුනක් ඇතැයි අපේක්ෂා කරන වස්තුවක්) හොඳින් විය හැකි ස්ථාන වේ. පොදු API සඳහා, වඩා අර්ථවත් හා පැහැදිලි යමක් සාමාන්‍යයෙන් කැමති විය යුතුය.
ජෝෂුවා ටේලර්

7

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

පිළිගත් පිළිතුර නිවැරදි ව්‍යාපාරික විසඳුමක් සපයයි. ආපසු ලබා දුන් අගය සමඟ ප්‍රායෝගිකව යමක් කිරීමට ඔබට අවශ්‍ය වූ විට පළමු වරට ඉවත දමා නිවැරදිව ක්‍රියාවට නැංවිය යුතු ඉක්මන් තාවකාලික ක්‍රියාමාර්ගයක් නැත, නමුත් POJO පන්තියක්, පුස්තකාල විශාල ප්‍රමාණයක් සමඟ අනුකූල වන අතර, නොනැසී පැවතීම, අනුක්‍රමිකකරණය / ඩෙසරීකරණය, උපකරණ සහ හැකි ඕනෑම දෙයක්.

මෙය ද දිගු කලක් නොවේ. ඔබට ලිවීමට අවශ්‍ය එකම දෙය ක්ෂේත්‍ර අර්ථ දැක්වීම් පමණි. Setters, getters, hashCode සහ equals ජනනය කළ හැකිය. එබැවින් ඔබේ සැබෑ ප්‍රශ්නය විය යුත්තේ, ලබා ගන්නන් සහ සැකසුම් කරන්නන් ස්වයංක්‍රීයව ජනනය නොවන්නේ මන්ද යන්නයි. නමුත් එය සින්ටැක්ස් ප්‍රශ්නයක් (සින්ටැක්ටික් සීනි ප්‍රශ්නය, සමහරු කියනු ඇත) මිස සංස්කෘතික ප්‍රශ්නය නොවේ.

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


2
"කිසිවෙකු" ඇත්ත වශයෙන්ම වැරදියි - අඩු වාචිකතාව සඳහා ප්‍රශස්තිකරණය කරන මෙවලම් රාශියක් ඇත, නිත්‍ය ප්‍රකාශන අන්ත උදාහරණයකි. නමුත් ඔබ අදහස් කළේ "ප්‍රධාන ධාරාවේ ජාවා ලෝකයේ කිසිවෙකු" නොවන අතර, එම කියවීමේදී පිළිතුර බොහෝ අර්ථවත් කරයි, ස්තූතියි. වාචික භාවය පිළිබඳ මගේම කනස්සල්ල වන්නේ කේතය ලිවීමට ගත කළ කාලය නොව එය කියවීමට ගත කළ කාලයයි; IDE කියවීමේ කාලය ඉතිරි නොකරයි; නමුත් අදහස වන්නේ 99% ක් පමණක් අතුරු මුහුණතේ අර්ථ දැක්වීම පමණක් කියවන බැවින් එය සංක්ෂිප්ත විය යුතුද?
මිහායිල් රමෙන්ඩික්

5

ඔබ නිරීක්ෂණය කරන දෙයට දායක වන වෙනස් සාධක තුනකි.

ටුපල්ස් එදිරිව නම් කරන ලද ක්ෂේත්‍ර

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

භාෂා වාක්‍ය ඛණ්ඩය

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

case class Foo(duration: Int, unit: String, tooShort: Boolean)

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

භාෂා දර්ශනය

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

භාෂාවේ දර්ශනයට පටහැනි කේත ලිවීමට ඇත්ත වශයෙන්ම හැකි අතර, ඔබ නිරීක්ෂණය කළ පරිදි, ප්‍රති results ල බොහෝ විට කැතයි. ජාවා හි ක්ෂේත්‍ර කිහිපයක් පමණක් ඇති පංතියක් තිබීම ස්කලා හි var භාවිතා කිරීම හා සමාන වේ, පරිහානියට ලක්වන ප්‍රොග්ලොග් කාර්යයන් වලට පුරෝකථනය කරයි, හැස්කල් වල අනාරක්ෂිත කාර්ය සාධනයක් කිරීම යනාදිය. ජාවා පන්ති සැහැල්ලු වීමට අදහස් නොකෙරේ - ඒවා වටා දත්ත යැවීමට නොමැත . යමක් අමාරු යැයි පෙනෙන විට, ආපසු හැරී වෙනත් ක්‍රමයක් තිබේදැයි බැලීම බොහෝ විට ful ලදායී වේ. ඔබේ උදාහරණයේ:

කාල සීමාව ඒකක වලින් වෙන් කර ඇත්තේ ඇයි? කාල සීමාවක් ප්‍රකාශ කිරීමට ඔබට ඉඩ දෙන කාල පුස්තකාල ඕනෑ තරම් තිබේ - කාලය (තත්පර 5, තත්පර) (සින්ටැක්ස් වෙනස් වේ) වැනි දෙයක්, එවිට ඔබට අවශ්‍ය ඕනෑම දෙයක් වඩාත් ශක්තිමත් ආකාරයකින් කිරීමට ඔබට ඉඩ සලසයි. සමහර විට ඔබට එය පරිවර්තනය කිරීමට අවශ්‍ය විය හැකිය - ප්‍රති result ලය [1] (හෝ [2]?) 'පැයක්' ද යන්න සහ 3600 න් ගුණ කිරීම දැයි පරීක්ෂා කළ යුත්තේ ඇයි? තෙවන තර්කය සඳහා - එහි අරමුණ කුමක්ද? මම හිතන්නේ යම් අවස්ථාවක දී ඔබට "1ms ට වඩා අඩු" හෝ නියම වේලාව මුද්‍රණය කිරීමට සිදුවනු ඇත - එය ස්වභාවිකවම කාල දත්ත සමඟ අයත් වන තර්කනයකි. ඔබට මේ වගේ පන්තියක් තිබිය යුතුයි:

class TimeResult {
    public TimeResult(duration, unit, tooShort)
    public String getResult() {
        if tooShort:
           return "too short"
        else:
           return format(duration)
}

}

හෝ ඔබට ඇත්ත වශයෙන්ම දත්ත සමඟ කිරීමට අවශ්‍ය ඕනෑම දෙයක්, එබැවින් තර්කනය සංයුක්ත කරයි.

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

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


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

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

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

Ik මිහායිල් රමෙන්ඩික් සමහර විට සමුච්චය කිරීම විකල්පයක් වනු ඇත - නමුත් ඔබ ගැටලුව වඩා හොඳින් දනී. ඇත්ත වශයෙන්ම එය මෙම විශේෂිත ගැටළුව විසඳීම ගැන නොවේ, මට ටිකක් පැත්තකට වී ඇත්නම් කණගාටුයි - මගේ ප්‍රධාන කාරණය වන්නේ භාෂාව “සරල” දත්ත භාවිතය අධෛර්යමත් කිරීමයි. සමහර විට, මෙය ඔබගේ ප්‍රවේශය ගැන නැවත සිතා බැලීමට උපකාරී වේ - තවත් විටෙක int යනු int එකක් පමණි
තැනෝස් ටින්ටිනිඩිස්

IkMikhailRamendik බොයිලර් ප්ලේටි ක්‍රමයේ ඇති හොඳ දෙය නම් ඔබට පංතියක් ලැබුණු පසු ඔබට එයට හැසිරීම එකතු කළ හැකිය. සහ / හෝ ඔබ කළ පරිදි එය වෙනස් කළ නොහැක (මෙය බොහෝ විට හොඳ අදහසකි; ඔබට සෑම විටම නව වස්තුවක් එකතුව ලෙස ආපසු ලබා දිය හැකිය). අවසානයේදී, ඔබේ “අතිරික්ත” පන්තිය ඔබට අවශ්‍ය සියලුම හැසිරීම් රටා වටහා ගත හැකි අතර පසුව ලබා ගන්නන් සඳහා වන පිරිවැය නොසැලකිලිමත් වේ. එපමණක්ද නොව, ඔබට ඒවා අවශ්‍ය විය හැකිය. භාවිතා කිරීම සලකා බලන්න ලැම්බ්රොක් හෝ autovalue .
maaartinus

5

මගේ අවබෝධයට අනුව, මූලික හේතු වේ

  1. පංති වියුක්ත කිරීම සඳහා මූලික ජාවා ක්‍රමය අතුරුමුහුණත් වේ.
  2. ජාවාට ලබා දිය හැක්කේ ක්‍රමයකින් එක් අගයක් පමණි - වස්තුවක් හෝ අරාවක් හෝ දේශීය අගයක් (int / long / double / float / boolean).
  3. අතුරුමුහුණත් වල ක්ෂේත්‍ර අඩංගු විය නොහැක, ක්‍රම පමණි. ඔබට ක්ෂේත්‍රයකට ප්‍රවේශ වීමට අවශ්‍ය නම්, ඔබ ක්‍රමවේදයක් අනුගමනය කළ යුතුය - එබැවින් ලබා ගන්නන් සහ සැකසුම් කරන්නන්.
  4. ක්‍රමයක් අතුරු මුහුණතක් ලබා දෙන්නේ නම්, ඇත්ත වශයෙන්ම නැවත පැමිණීමට ඔබට ක්‍රියාත්මක කිරීමේ පන්තියක් තිබිය යුතුය.

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


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

තවද "ජාවා හි ටුපල්ස් හොඳින් ක්‍රියා නොකරයි" -වීව් සමඟ මම එකඟ වෙමි. ඔබ ජනක විද්‍යාව භාවිතා කරන්නේ නම් මෙය ඉතා ඉක්මනින් අප්රසන්න වනු ඇත.
Thorbjørn Ravn Andersen

Or ThorbjørnRavnAndersen ඔවුන් ජනවාර්ගික හා ටුපල් සහිත සංඛ්‍යානමය වශයෙන් ටයිප් කරන ලද භාෂාවක් වන ස්කාලා හි ඉතා හොඳින් ක්‍රියා කරයි. ඉතින් සමහර විට මෙය ජාවාගේ වරදක්ද?
ඇන්ඩ්‍රස් එෆ්.

Nd ඇන්ඩ්‍රෙස් එෆ්. කරුණාකර "ඔබ ජනක විද්‍යාව භාවිතා කරන්නේ නම්" - කොටස සටහන් කරන්න. ජාවා මෙය කරන ආකාරය උදා: හස්කල්ට වඩා සංකීර්ණ ඉදිකිරීම් සඳහා ණයට දෙන්නේ නැත. සැසඳීමක් කිරීමට තරම් ස්කලා මම නොදනිමි, නමුත් ස්කලා බහු ප්‍රතිලාභ අගයන් සඳහා ඉඩ ලබා දෙන බව ඇත්තද? එය බොහෝ සෙයින් උපකාරී වේ.
Thorbj Rrn Ravn Andersen

Or ThorbjørnRavnAndersen Scala ශ්‍රිතයන්ට තනි ප්‍රතිලාභ අගයක් ඇති අතර එය ටුපල් වර්ගයට අයත් විය හැකිය (උදා: පූර්ණ සංඛ්‍යාවක් සහිත අගයක් ලබා දෙන අගයක් ලබා def f(...): (Int, Int)දෙන ශ්‍රිතයකි f). ජාවා හි ජනක විද්‍යාව එහි ගැටලුව බව මට විශ්වාස නැත; උදාහරණයක් ලෙස හස්කල් ද මකාදැමීම සිදු කරන බව සලකන්න. ජාවා ටුපල් නොමැති වීමට තාක්ෂණික හේතුවක් ඇතැයි මම නොසිතමි .
ඇන්ඩ්‍රස් එෆ්.

3

ජැක් බී එයට පිළිතුරු දීමට මම එකඟ වෙමි

ජාවා යනු (සාම්ප්‍රදායිකව) පැහැදිලි-අනුකූලතාව සඳහා ප්‍රශස්තිකරණය කරන තනි-පරමාදර්ශී පන්ති පදනම් කරගත් OO භාෂාවකි

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

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

වෙනත් වචන වලින් කිවහොත්, මෘදුකාංග සංවර්ධනය අවබෝධ කරගත් බව කළමනාකරුවන් විශ්වාස කිරීම සඳහා ජාවා සංස්කෘතිය ප්‍රශස්ත කර ඇත.

නැතහොත්, එක් බුද්ධිමත් පිරිමි ළමයෙක් බොහෝ කලකට පෙර එය තැබූ පරිදි ,

භාෂාවක් විනිශ්චය කිරීමට හොඳම ක්‍රමය නම් එහි යෝජකයින් විසින් ලියන ලද කේතය දෙස බැලීමයි. "Radix enim omnium malorum est cupiditas" - සහ ජාවා පැහැදිලිවම මුදල් නැඹුරු වැඩසටහන්කරණයකට (MOP) උදාහරණයකි. එස්ජීඅයි හි ජාවා හි ප්‍රධාන යෝජකයා මට පැවසූ පරිදි: "ඇලෙක්ස්, ඔබ මුදල් ඇති තැනට යා යුතුය." නමුත් මට විශේෂයෙන් මුදල් ඇති තැනට යාමට අවශ්‍ය නැත - එය සාමාන්‍යයෙන් එහි සුවඳ නොදැනේ.


3

(මෙම පිළිතුර විශේෂයෙන් ජාවා සඳහා පැහැදිලි කිරීමක් නොවේ, ඒ වෙනුවට “[බර] භාවිතයන් ප්‍රශස්ත කළ හැක්කේ කුමක් සඳහාද?” යන පොදු ප්‍රශ්නයට ආමන්ත්‍රණය කරයි.)

මෙම මූලධර්ම දෙක සලකා බලන්න:

  1. ඔබේ වැඩසටහන නිවැරදි දේ කරන විට එය හොඳයි. නිවැරදි දේ කරන වැඩසටහන් ලිවීම අප පහසු කළ යුතුය.
  2. ඔබේ වැඩසටහන වැරදි දේ කරන විට එය නරක ය. වැරදි දේ කරන වැඩසටහන් ලිවීම අප දුෂ්කර කළ යුතුය.

මෙම අරමුණු වලින් එකක් ප්‍රශස්තිකරණය කිරීමට උත්සාහ කිරීම සමහර විට අනෙකාගේ මාර්ගයට පිවිසිය හැකිය (එනම් වැරදි දේ කිරීම දුෂ්කර කිරීම නිවැරදි දේ කිරීමට අපහසු විය හැකිය , නැතහොත් අනෙක් අතට).

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

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

ඔබේ පද්ධතිය වඩාත් “බර” බවට පත් කිරීමට නැඹුරු වන වෙනත් උදාහරණ:

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

දේවල් “බර” බවට පත් කිරීම (සහ සමහර කේත ඉක්මනින් ලිවීම ඔබට අපහසු කරවීම) අව්‍යාජව චේතනාන්විත විය හැකි අවස්ථා පිළිබඳ අදහසක් ලබා දීමට මේවා උදාහරණ කිහිපයක් පමණි. (කේත ලිවීමට විශාල උත්සාහයක් අවශ්‍ය නම්, කේතය ලිවීමට පෙර එය වඩාත් හොඳින් සිතා බැලීමට එය මඟ පෑදිය හැකි යැයි කෙනෙකුට තර්ක කළ හැකිය! ඇත්ත වශයෙන්ම මෙම තර්කය ඉක්මනින් හාස්‍යයට ලක් වේ.)

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


සටහන : ඉහත සියල්ලම දේවල් "බර" වීමට නැඹුරු වන විට පමණි. මම පරම නැහැ නැහැ ජාවා හෝ පයිතන් (එක්කෝ භාෂා තමන් හෝ තම සංස්කෘතීන්) යම් විශේෂිත අවස්ථාවක් සඳහා ප්රශස්ත එබැව්න් ගවේෂණශීලි කරන්න බව කියා; එය ඔබට සිතා බැලිය යුතුය. එවැනි වෙළඳාම පිළිබඳ අදාළ සබැඳි දෙකක්:


1
කේතය කියවීම ගැන කුමක් කිව හැකිද? එහි තවත් වෙළඳාමක් තිබේ. විකාර සහගත හා චාරිත්‍ර වාරිත්‍ර මගින් බර කිරන ලද කේතය කියවීමට අපහසුය; ඔබගේ IDE හි බොයිලර් ප්ලේට් සහ අනවශ්‍ය පෙළ (සහ පන්ති ධූරාවලිය!) සමඟ, කේතය ඇත්ත වශයෙන්ම කරන්නේ කුමක්දැයි බැලීම දුෂ්කර වේ. කේතය අනිවාර්යයෙන්ම ලිවීමට පහසු නොවිය යුතුය යන තර්කය මට පෙනේ (මම එයට එකඟදැයි විශ්වාස නැත, නමුත් එයට යම් කුසලතාවයක් ඇත), නමුත් එය අනිවාර්යයෙන්ම කියවීමට පහසු විය යුතුය . ජාවා සමග ජලයයි කේතය සහ ඉදිකර ඇති කළ හැකිය - එය එසේ බොළඳ විය කැමතියි - ඒත්, ඒ ස්තුති එහි verbosity කිරීමට, හෝ තිබියදීත් ඒ?
ඇන්ඩ්‍රස් එෆ්.

Nd ඇන්ඩ්‍රෙස් එෆ්. මම පිළිතුර සංස්කරණය කළේ එය ජාවා ගැන නොවේ (එයින් මම විශාල රසිකයෙක් නොවේ). නමුත් ඔව්, කේතය කියවීමේදී සිදුවන වෙළඳාම: එක් කෙළවරක ඔබ කී පරිදි “කේතය ඇත්ත වශයෙන්ම කරන්නේ කුමක්ද” යන්න පහසුවෙන් කියවිය හැකිය. අනෙක් කෙළවරේ, වැනි ප්‍රශ්න වලට පහසුවෙන් පිළිතුරු දැකීමට ඔබට අවශ්‍යය: මෙම කේතය වෙනත් කේත සමඟ සම්බන්ධ වන්නේ කෙසේද? මෙම කේතයට කළ හැකි නරකම දේ කුමක්ද: එහි බලපෑම වෙනත් තත්වයකට කුමක් විය හැකිද, එහි අතුරු ආබාධ මොනවාද? මෙම කේතය රඳා පැවතිය හැකි බාහිර සාධක මොනවාද? (ඇත්ත වශයෙන්ම අපට ප්‍රශ්න දෙකටම ඉක්මන් පිළිතුරු අවශ්‍යයි.)
ශ්‍රීවාට්සාර්

2

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

නිර්දේශයට බලපෑම් කරන දෙයින් කොටසක් වන්නේ පයිතන් සහ ජාවා හි කියවිය හැකි සහ නඩත්තු කළ හැකි යැයි සැලකෙන දෙය බෙහෙවින් වෙනස් ය.

  • පයිතන්හි, ටුපල් යනු භාෂා ලක්ෂණයකි.
  • ජාවා සහ සී # යන දෙවර්ගයේම, ටුපල් යනු පුස්තකාල අංගයකි (හෝ වනු ඇත) .

මම C # ගැන පමණක් සඳහන් කරන්නේ සම්මත පුස්තකාලයට ටුපල් <A, B, C, .. n> පන්ති සමූහයක් ඇති අතර, භාෂාව ඒවාට සෘජුවම සහාය නොදක්වන්නේ නම් එය කෙතරම් අනවශ්‍යද යන්නට කදිම නිදසුනකි. සෑම අවස්ථාවකම පාහේ, ගැටලුව විසඳීම සඳහා ඔබ හොඳින් තෝරාගත් පන්ති තිබේ නම් ඔබේ කේතය වඩාත් කියවිය හැකි සහ නඩත්තු කළ හැකිය. ඔබගේ සම්බන්ධිත සිරස් පිටාර ගැලීමේ ප්‍රශ්නයේ විශේෂිත උදාහරණයේ දී, අනෙක් අගයන් ආපසු එන වස්තුව මත ගණනය කළ අය ලෙස පහසුවෙන් ප්‍රකාශ වේ.

C # වේදිකාව විසින් සතුටුදායක විසඳුමක් ලබා දුන් සිත්ගන්නා විසඳුමක් නම්, මෙම කැසීම හොඳින් සීරීමට නිර්නාමික වස්තූන් ( C # 3.0 වලින් නිකුත් කරන ලද ) අදහසයි . අවාසනාවට, ජාවාට තවමත් සමාන ප්‍රමාණයක් නොමැත.

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


4
C # හි නවතම අනුවාදයේ පුස්තකාල පංතිවලට වඩා නව පංතියේ පළමු පන්තියේ පුරවැසියන් වේ. එහි යෑමට බොහෝ අනුවාදයන් අවශ්‍ය විය.
ඊගෝර් සොලොයිඩෙන්කෝ

අවසාන ඡේද 3 සාරාංශගත කළ හැක්කේ "ජාවා නොකරන ලෙස ඔබ සොයන ලක්ෂණය X භාෂාවට ඇත", තවද ඔවුන් පිළිතුරට එකතු කරන්නේ කුමක්දැයි බැලීමට මා අසමත් වේ. පයිතන් සිට ජාවා මාතෘකාවට C # සඳහන් කරන්නේ ඇයි? නෑ, මට කාරණය පේන්නේ නැහැ. 20k + නියෝජිතයෙකුගෙන් ටිකක් අමුතුයි.
ඔලිවියර් ග්‍රෙගෝයර්

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

G ඉගෝර්සොලොයිඩෙන්කෝ, සමහර විට ජාවා 9 ගැන බලාපොරොත්තුවක් තිබේද? මෙය ලැම්බඩාස් හි තාර්කික ඊළඟ පියවර වන එක් අංගයක් පමණි.
බෙරින් ලොරිට්ස්

1
G ඉගෝර්සොලොයිඩෙන්කෝ එය සත්‍යයක් බව මට විශ්වාස නැත (පළමු පන්තියේ පුරවැසියන්) - ඒවා පුස්තකාලයෙන් පන්තිවල අවස්ථා නිර්මාණය කිරීමට හා ලිවීමට සින්ටැක්ස් දිගුවන් ලෙස පෙනේ.
පීට් කිර්හැම්

0

මම හිතන්නේ මේ අවස්ථාවේ දී පන්තියක් භාවිතා කිරීම පිළිබඳ මූලික කරුණක් වන්නේ එකට යන දෙය එකට පැවතිය යුතු බවයි.

ක්‍රම තර්ක ගැන මම මේ සාකච්ඡාව වෙනත් ආකාරයකින් කර ඇත්තෙමි: BMI ගණනය කරන සරල ක්‍රමයක් සලකා බලන්න:

CalculateBMI(weight,height)
{
  System.out.println("BMI: " + (( weight / height ) x 703));
}

මෙම අවස්ථාවේ දී මම මෙම ශෛලියට එරෙහිව තර්ක කරන්නේ බර හා උස සම්බන්ධ වන බැවිනි. "සන්නිවේදනය" කිරීමේ ක්‍රමය ඒවා නොමැති විට වෙනම අගයන් දෙකකි. එක් පුද්ගලයෙකුගේ බර සහ තවත් කෙනෙකුගේ උස සමඟ ඔබ BMI ගණනය කරන්නේ කවදාද? එය තේරුමක් නැත.

CalculateBMI(Person)
{
  System.out.println("BMI: " + (( Person.weight / Person.height ) x 703));
}

උස සහ බර එකම ප්‍රභවයකින් එන බව දැන් ඔබ පැහැදිලිව සන්නිවේදනය කරන නිසා තවත් අර්ථයක් ඇති කරයි.

බහුවිධ අගයන් ආපසු ලබා දීම සඳහා ද එයම වේ. ඒවා පැහැදිලිව සම්බන්ධ වී ඇත්නම්, ඉතා කුඩා පැකේජයක් ආපසු ලබා දී වස්තුවක් භාවිතා කරන්න.


4
හරි, නමුත් ඔබට ප්‍රස්ථාරයක් පෙන්වීමට (උපකල්පිත) කාර්යයක් ඇතැයි සිතමු: යම් නිශ්චිත ස්ථාවර උසකට BMI බර මත රඳා පවතින්නේ කෙසේද? එවිට, එක් එක් දත්ත ලක්ෂ්‍යය සඳහා පුද්ගලයෙකු නිර්මාණය නොකර ඔබට එය කළ නොහැක. තවද, එය අන්තයට ගෙන යාමෙන්, වලංගු උපන්දිනයක් සහ විදේශ ගමන් බලපත්‍ර අංකයක් නොමැතිව පුද්ගල පන්තියේ අවස්ථාවක් නිර්මාණය කළ නොහැක. දැන් මොකක්ද? මා එහි, btw downvote නැත වේ සමහර පන්ති එකට ගුණ ආනයනික භාණ්ඩ සඳහා වලංගු හේතු.
artem

1
අතුරුමුහුණත් ක්‍රියාත්මක වන ඊළඟ පියවර එයයි. එබැවින් පුද්ගල බර පංති අතුරුමුහුණතක් එවැනි දෙයක් විය හැකිය. එකට යන දෙය එකට තිබිය යුතුය යන කාරණය ඉදිරිපත් කිරීමට මා දුන් ආදර්ශයට ඔබ හසු වේ.
පීටර් බී

0

අවංකව කිවහොත්, සංස්කෘතිය නම්, ජාවා ක්‍රමලේඛකයින් මුලින් ම නැඹුරු වූයේ විශ්ව විද්‍යාල වලින් ය.

එරික් ඔහුගේ පිළිතුරෙහි තවත් වචන වලින් පවසන පරිදි, ඔබ තිරසාර කේතයක් ලියන බවක් නොපෙනේ. ඔබේ ආදර්ශයෙන් මා දකින දෙය නම්, ඉතා අසීරු කාරණා තිබේ.

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

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


1
ගූගල් භාවිතා කරන ෆූබාර් බඳවා ගැනීමේ මෙවලම විසඳුම් සඳහා භාෂා දෙකක් භාවිතා කිරීමට ඉඩ සලසයි: ජාවා සහ පයිතන්. Go යනු විකල්පයක් නොවන බව මට සිත්ගන්නා කරුණකි. Go හි මෙම ඉදිරිපත් කිරීම මත මම සිදු වූ අතර එයට ජාවා සහ පයිතන් (මෙන්ම වෙනත් භාෂා) පිළිබඳ සිත්ගන්නා කරුණු කිහිපයක් ඇත. උදාහරණයක් ලෙස එක් වෙඩි උණ්ඩයක් කැපී පෙනේ: “සමහර විට එහි ප්‍රති expert ලයක් ලෙස විශේෂ-නොවන වැඩසටහන්කරුවන් ව්‍යාකූල වී ඇත” පහසුව "අර්ථ නිරූපණය සහ ගතික ටයිප් කිරීම සමඟ" භාවිතා කරන්න. කියවීම වටී.
ජිමී ජේම්ස්

Im ජිමී ජේම්ස් ස්ලයිඩයට පැමිණියේ 'ප්‍රවීණයන්ගේ අතේ, ඔවුන් විශිෂ්ටයි' - ප්‍රශ්නයේ හොඳ සාරාංශය
ටොම්
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.