සංස්කරණය කරන්න: මම මෙම ප්රශ්නයට පිළිතුරු දුන්නේ ක්රමලේඛනය ඉගෙන ගන්නා පිරිසක් සිටින නිසාත්, බොහෝ පිළිතුරු ඉතා තාක්ෂණිකව දක්ෂ නිසාත්, ඔබ නවකයෙක් නම් ඔවුන් තේරුම් ගැනීමට පහසු නැත. අපි හැමෝම අලුතෙන් ආපු අය, ඒ නිසා මම හිතුවා මම වඩාත් නවක මිත්රශීලී පිළිතුරක් ලබා ගැනීමට උත්සාහ කරමි.
ප්රධාන ඒවා දෙක වන්නේ බහුමාපකය සහ වලංගුකරණයයි. එය මෝඩ දත්ත ව්යුහයක් වුවද.
මෙම සරල පංතිය අපට ඇතැයි කියමු:
public class Bottle {
public int amountOfWaterMl;
public int capacityMl;
}
එහි ඇති දියර ප්රමාණය සහ එහි ධාරිතාව (මිලිලීටර වලින්) රඳවා ගන්නා ඉතා සරල පන්තියකි.
මා කරන විට කුමක් සිදුවේද:
Bottle bot = new Bottle();
bot.amountOfWaterMl = 1500;
bot.capacityMl = 1000;
හොඳයි, ඔබ එය ක්රියාත්මක වේ යැයි බලාපොරොත්තු නොවනු ඇත, නේද? ඔබට යම් ආකාරයක සනීපාරක්ෂක පරීක්ෂණයක් කිරීමට අවශ්යයි. ඊටත් වඩා නරක දෙය නම්, මම කිසි විටෙකත් උපරිම ධාරිතාව නියම නොකළේ නම් කුමක් කළ යුතුද? ඔහ්, ආදරණීය, අපට ගැටලුවක් තිබේ.
නමුත් තවත් ගැටලුවක් තිබේ. බෝතල් එක් බහාලුමක් පමණක් නම් කුමක් කළ යුතුද? අප සතුව බහාලුම් කිහිපයක් තිබේ නම්, සියල්ලම ධාරිතාවයෙන් හා ද්රවයෙන් පුරවා තිබේ නම් කුමක් කළ යුතුද? අපට අතුරු මුහුණතක් සෑදිය හැකි නම්, අපගේ වැඩසටහනේ ඉතිරි අයට එම අතුරුමුහුණත පිළිගැනීමට ඉඩ දිය හැකි අතර බෝතල්, ජෙරිකන් සහ සියලු වර්ගවල දේවල් එකිනෙකට හුවමාරු වේ. එය වඩා හොඳ නොවේද? අතුරුමුහුණත් ඉල්ලුම් ක්රම බැවින් මෙයද හොඳ දෙයකි.
අපි අවසන් කරන්නේ මෙවැනි දෙයක් සමඟයි:
public interface LiquidContainer {
public int getAmountMl();
public void setAmountMl(int amountMl);
public int getCapacityMl();
}
මහා! දැන් අපි බෝතලය මේකට වෙනස් කරමු:
public class Bottle extends LiquidContainer {
private int capacityMl;
private int amountFilledMl;
public Bottle(int capacityMl, int amountFilledMl) {
this.capacityMl = capacityMl;
this.amountFilledMl = amountFilledMl;
checkNotOverFlow();
}
public int getAmountMl() {
return amountFilledMl;
}
public void setAmountMl(int amountMl) {
this.amountFilled = amountMl;
checkNotOverFlow();
}
public int getCapacityMl() {
return capacityMl;
}
private void checkNotOverFlow() {
if(amountOfWaterMl > capacityMl) {
throw new BottleOverflowException();
}
}
මම BottleOverflowException හි අර්ථ දැක්වීම පා er කයාට අභ්යාසයක් ලෙස තබමි.
දැන් මෙය කොතරම් ශක්තිමත්දැයි බලන්න. බෝතලය වෙනුවට LiquidContainer භාර ගැනීමෙන් අපට දැන් අපගේ කේතයේ ඇති ඕනෑම බහාලුමක් සමඟ කටයුතු කළ හැකිය. මෙම බෝතල් මේ ආකාරයේ දේවල් සමඟ කටයුතු කරන ආකාරය සියල්ල වෙනස් විය හැකිය. එය වෙනස් වූ විට ඒවායේ තත්වය තැටියට ලියන බෝතල් හෝ SQL දත්ත සමුදායන්හි ඉතිරි කරන බෝතල් හෝ GNU වෙනත් දේ දනී.
මේ සියල්ලටම විවිධ විකාර හැසිරවීමට විවිධ ක්රම තිබිය හැකිය. බෝතලය පරික්ෂා කර බැලූ විට එය පිරී ඉතිරී යන්නේ නම් එය ධාවන වේලාව විසි කරයි. නමුත් එය වැරදි දෙයක් විය හැකිය. (දෝෂ හැසිරවීම පිළිබඳ ප්රයෝජනවත් සාකච්ඡාවක් ඇත, නමුත් මම එය මෙහි අරමුණක් මත ඉතා සරළව තබමි. අදහස් දක්වන පුද්ගලයින් මෙම සරල ප්රවේශයේ අඩුපාඩු පෙන්වා දෙනු ඇත.;))
ඔව්, අපි ඉතා සරල අදහසකින් වඩා හොඳ පිළිතුරු ඉක්මනින් ලබා ගැනීමට යන බවක් පෙනේ.
ඔබට බෝතලයක ධාරිතාව වෙනස් කළ නොහැකි බව කරුණාවෙන් සලකන්න. එය දැන් ගල් ගසා ඇත. එය අවසාන වශයෙන් ප්රකාශ කිරීමෙන් ඔබට මෙය int එකකින් කළ හැකිය. නමුත් මෙය ලැයිස්තුවක් නම්, ඔබට එය හිස් කළ හැකිය, එයට අලුත් දේවල් එකතු කළ හැකිය. ඔබට ඇතුළත ස්පර්ශ කිරීමට ඇති ප්රවේශය සීමා කළ නොහැක.
සෑම කෙනෙකුම ආමන්ත්රණය නොකළ තුන්වන කාරණය ද තිබේ: ලබා ගන්නන් සහ සැකසුම් කරන්නන් ක්රම ඇමතුම් භාවිතා කරයි. ඒ කියන්නේ ඒවා අනෙක් සෑම තැනකම වගේ සාමාන්ය ක්රම වගේ. DTOs සහ දේවල් සඳහා අමුතු නිශ්චිත වාක්ය ඛණ්ඩයක් වෙනුවට, ඔබට සෑම තැනකම එකම දේ ඇත.