Java Programming ကို လေ့လာရာတွင် လေ့လာသူတစ်ဦးအနေနှင့် ရင်ဆိုင်ရမည့် ပြဿနာ များထဲတွင် Object Oriented သည်လည်း အဓိက အခန်းမှ ပါဝင်နေ၏။ Object Oriented နှင့်ပတ်သက်သော ဘာသာရပ်များ၊ စာအုပ်များ၊ ရှင်းလင်းချက်များ များစွာရှိကြပါ၏။ သို့ရာတွင် Object Oriented သည် နားလည်ရခက်သည်ဟု ပြောနေသူ အများအပြားရှိနေဆဲပင်။ အချို့သောသူများသည် Object Oriented ကို နားလည်သည်ဟု ပြောကြ၏။ ဒါဆိုရင် Polymorphism ကိုနားလည်ပြီး Coding တွေမှာ အသုံးပြုနေသလားဟု မေးပါက အဖြေခက်နေတတ်၏။
သို့ရာတွင် အံ့သြစရာ ကောင်းလောက်အောင်ပင် Object Oriented ကို ခက်ခဲလှပါသည်ဟု ပြောနေကြပေမယ့် Inheritance ကို သိလားလို့မေးလျှင် မှန်ကန်စွာ နားလည်ထား တတ်ကြ၏။ ဒါဆိုလျှင် ဘာလို့ Object Oriented ကို ခက်တယ်လို့ ထင်နေရတာလဲ။
အဲ့ဒီ အဖြေဟာ နောက်ထပ်မေးမည့် မေးခွန်း၏ နောက်ကွယ်တွင် တည်ရှိလိမ့်မည် ဟုထင်ပါသည်။ Inheritance ကို အသုံးပြုခြင်း၏ ကောင်းကျိုး၊ ဆိုးကျိုးတွေကို သိလားဟုမေးပါမည်။ အတော်များများက Inheritance မှာ ဆိုးကျိုးတွေ ရှိလို့လားဟု ပြန်မေးကြမည်။ အဲ့ဒီနေရာမှာ ပြဿနာက စပါတော့သည်။ Object Oriented ကို နားမလည်စေသော အခြေခံသည် ဤနေရာမှ စတင်ပါတော့သည်။
Object Oriented ၏ သဘောတရားသည် လွန်စွာကောင်းမွန်သည်မှာ မှန်၏။ သို့ရာတွင် Java Program တစ်ခုမှ Object Oriented ကို အသုံးပြုရာတွင် အသုံးပြုပုံ မှားယွင်းခဲ့ပါက လုံးဝ အသုံးမဝင်သော Code များကို ရေးမိသွားနိုင်သည် အထိ အန္တရယ်ရှိပါသည်။
ကျွှန်တော်တို့ OOP ဖြစ်ရင်ပြီးရော ဆိုပြီး မှားယွင်းသော အသုံးချမှု့များမှ ကင်းဝေးစေရန်၊ Object Oriented ရဲ့ အဓိကကျသော Encapsulation, Inheritance, Polymorphism အစရှိတဲ့ အခြေခံ သဘောတရားများမှ စပြီး ပြန်လည်လေ့လာသွားမည် ဖြစ်သည်။
Encapsulation သည် OOP ရဲ့ အခြေခံကျတဲ့ အတွေးအခေါ်တစ်ခုဖြစ်၏။ Encapsulation က ဘာလို့လိုအပ်တာလဲ ဆိုတာကို မစဉ်းစားခင် OOPရဲ့ သမိုင်းကို ပြန်ကြည့်ကြည့်ကြရအောင်။ Software Engineering လောကမှာ OOP က စတင်နေရာ ရလာခဲ့တာကတော့ လွန်ခဲ့တဲ့ နှစ်၂၀ခန့်ကဖြစ်၏။ ကမ္ဘာတဝှမ်း၌ IT နည်းပညာကို စီးပွားရေးအခြေခံ တွေမှာ၊ လူနေမှု့စနစ်ရဲ့ အခြေခံတွေမှာ ရင်းနှီးမြှုပ်နှံမှု့တွေကို အပြိုင်အဆိုင် ပြုလုပ်နေတဲ့ ကာလဖြစ်ခဲ့၏။ ထိုခေတ်သည် System လိုအပ်မှု့များနှင့် စာလျှင် IT Engineerရဲ့ အရေအတွက်ဟာ အလွန်နည်းပါး ခဲ့သော ကာလလည်းဖြစ်၏။
အသစ်အသစ်တွေကို ပြန်ရေး နေသည်နှင့်စာလျှင် ရေးထားပြီးသား System တွေကို ဘယ်လိုပြန် အသုံးချနိုင်အောင် လုပ်မလဲဆိုတာ IT သမားတွေ အတွက် မရှိမဖြစ်လိုအပ်ခဲ့တဲ့ လိုအပ်ချက်တစ်ခု ဖြစ်ခဲ့၏။ Software ရဲ့ အစိတ်အပိုင်းတွေကို ရုပ်ပစ္စည်း အဖြစ်ကြည့်မြင်ပြီး၊ အစိတ်အပိုင်းတွေကို စုပေါင်းအသုံးချခြင်း အားဖြင့် System တစ်ခုကို တည်ဆောက်သော OOP ရဲ့ တွေးခေါ်မှု့တွေဟာ ရေးပြီးသား Software တွေကို ပြန်လည်အသုံးချလိုတဲ့ အဲ့ဒီခေတ်ရဲ့ လိုအပ်ချက်နှင့် ကိုက်ညီနေခဲ့၏။
ထို့ကြောင့် OOP ကို အခြေခံတဲ့ Programming ဘာသာရပ်တွေ အများအပြား ထွက်ပေါ်လာရခြင်း ဖြစ်သည်။ ကျွှန်တော်တို့ OOP ကို ဘာလို့အသုံးပြုခဲ့ကြတယ် ဆိုတာကိုသဘောပေါက်ပြီးရင် Encapsulation ဘက်ကို ပြန်စဉ်းစားကြည့်ကြရအောင်။
Encapsulation ဆိုသည်မှာ လုံခြုံအောင် ထုတ်သိမ်းထားခြင်းဟု အဓိပ္ပါယ် ရပါသည်။ ဘာကြောင့် Encapsulation လုပ်ဖို့လိုတာလဲဟု စဉ်းစားလျှင် OOP ရဲ့ လိုအပ်ချက်တွင် အဖြေရှိပါသည်။ ရေးသားထားသော Object တစ်ခုကို ရေးသားသူ တစ်ယောက်တည်းက အသုံးပြုမည် မဟုတ်။ ထို့အပြင် ရေးသားပြီး အချိန် အတန်ကြာမှ ပြန်လည်အသုံးချသည့်အခါလည်း ရှိပါလိမ့်မည်။ Object ၏ အချက်အလက်တွေနဲ့ လုပ်ဆောင်ချက်တွေကို အခြားသော နေရာများမှ နှစ်သက်သလို အသုံးပြုကြမည် ဆိုလျှင် ခက်ပေမည်။ အဲ့ဒီအတွက် Object တစ်ခုက ပိုင်ဆိုင်တဲ့ အချက်အလက်နဲ့ လုပ်ဆောင်ချက်တွေကို ပြင်ပမှ မမြင်နိုင်ရန် ဖုံးကွယ်ထားဖို့ လိုအပ်ပေသည်။ ဤကဲ့သို့ ဖုံးကွယ်ခြင်းကို Encapsulation ဟုခေါ်၏။
ကျွှန်တော်တို့ Java မှာ Encapsulation ကို ဘယ်လိုလုပ်လဲ ဆိုတာကို လက်တွေ့ Code တွေရေးကြည့်ကြရအောင်။ အောက်ပါ User.java ကို ကြည့်ပါ။ Encapsulation ကို အသုံးမပြုပဲ ရေးသားထားခြင်း ဖြစ်သည်။
အထက်ပါ User Class ၏ အချက်အလက်များ ဖြစ်ကြသော name, age နှင့် Constructor ဖြစ်သော User(String name, int age) သည် public များဖြစ်ကြ၍ OOP ၏အမြင်မှဆိုလျှင် လုံခြုံမှု့မရှိဟု သတ်မှတ်နိုင်သည်။ ဟုတ်ပြီ၊ လုံခြုံမှု့ရှိအောင် Encapsulation လုပ်ကြစို့။ အောက်ပါ Src Code များသည် public ကို private အဖြစ်ပြောင်းလည်းပြီး Encapsulation လုပ်ထားသော Code များဖြစ်၏။
အထက်ပါအတိုင်း Encapsulation သည် လွယ်ကူလှပေသည်။ သို့ရာတွင် ဤအတိုင်းဆိုပါက အသုံးဝင်မည် မဟုတ်ပေ။ Constructor က private ဖြစ်နေပါသဖြင့် instance ကို လုပ်ယူနိုင်မည်မဟုတ်။ ဤနေရာသည် ရွေးချယ်ရန် အနည်းငယ် ခက်ခဲ ပေသည်။ package အတူတူ အတွင်းမှာသုံးမှာလား၊ ဒါဆိုရင် private ကို ဖြုတ်လိုက်ရုံပင်။ ဒါမှမဟုတ် package အပြင်က အထိ အသုံးပြုစေလိုတာလား။ ဆုံးဖြတ်ရန် အနည်းငယ် ခက်ခဲလှ၏။ဦးစွာ ဤနေရာတွင် Constructor ကို public အဖြစ် ပြောင်းလည်းပါမည်။ ဤသို့ပြောင်းလည်းခြင်း အားဖြင့် package ထဲမှာရော အပြင်မှာပါ instance ကို လုပ်ယူနိုင်မည် ဖြစ်၏။
သို့ရာတွင် အခြားသော ပြဿနာလည်း ရှိပါသေးသည်။ ပိုင်ဆိုင်သော အချက်အလက်များကို ပြောင်းလည်း၍ မရနိုင်ပေ။ age အချက်အလက်သည် နှစ်တိုင်း ပြောင်းလည်းနိုင်ပါသဖြင့် ပြင်ပမှ ပြောင်းလည်းမရနိုင်ခြင်းသည် သိပ်မကောင်းလှပေ။ public အဖြစ်ပြောင်းလည်း လိုက်ပြန်ရင်လည်း မဖြစ်နိုင်တဲ့ အသက်တွေ (အနှုတ်တန်ဖိုး) သတ်မှတ်သွားနိုင်သည်။ ဤနေရာတွင် Encapsulation ကို စောင့်စည်းရင်း ပြင်ပကိုလည်း ပြုပြင်နိုင်အောင် မလုပ်နိုင်ဘူးလားဟု စဉ်းစားစရာ ဖြစ်လာသည်။ ဤကဲ့သို့ အခြေအနေမျိုးတွင် Access Method များသည် အသုံးဝင်လှပေသည်။
အထက်ပါ setAge(int age) လုပ်ဆောင်ချက်ကို အသုံးပြုမည် ဆိုပါက
သို့ရာတွင် အံ့သြစရာ ကောင်းလောက်အောင်ပင် Object Oriented ကို ခက်ခဲလှပါသည်ဟု ပြောနေကြပေမယ့် Inheritance ကို သိလားလို့မေးလျှင် မှန်ကန်စွာ နားလည်ထား တတ်ကြ၏။ ဒါဆိုလျှင် ဘာလို့ Object Oriented ကို ခက်တယ်လို့ ထင်နေရတာလဲ။
အဲ့ဒီ အဖြေဟာ နောက်ထပ်မေးမည့် မေးခွန်း၏ နောက်ကွယ်တွင် တည်ရှိလိမ့်မည် ဟုထင်ပါသည်။ Inheritance ကို အသုံးပြုခြင်း၏ ကောင်းကျိုး၊ ဆိုးကျိုးတွေကို သိလားဟုမေးပါမည်။ အတော်များများက Inheritance မှာ ဆိုးကျိုးတွေ ရှိလို့လားဟု ပြန်မေးကြမည်။ အဲ့ဒီနေရာမှာ ပြဿနာက စပါတော့သည်။ Object Oriented ကို နားမလည်စေသော အခြေခံသည် ဤနေရာမှ စတင်ပါတော့သည်။
Object Oriented ၏ သဘောတရားသည် လွန်စွာကောင်းမွန်သည်မှာ မှန်၏။ သို့ရာတွင် Java Program တစ်ခုမှ Object Oriented ကို အသုံးပြုရာတွင် အသုံးပြုပုံ မှားယွင်းခဲ့ပါက လုံးဝ အသုံးမဝင်သော Code များကို ရေးမိသွားနိုင်သည် အထိ အန္တရယ်ရှိပါသည်။
ကျွှန်တော်တို့ OOP ဖြစ်ရင်ပြီးရော ဆိုပြီး မှားယွင်းသော အသုံးချမှု့များမှ ကင်းဝေးစေရန်၊ Object Oriented ရဲ့ အဓိကကျသော Encapsulation, Inheritance, Polymorphism အစရှိတဲ့ အခြေခံ သဘောတရားများမှ စပြီး ပြန်လည်လေ့လာသွားမည် ဖြစ်သည်။
Encapsulation ကို အသုံးပြုပါ
Encapsulation သည် OOP ရဲ့ အခြေခံကျတဲ့ အတွေးအခေါ်တစ်ခုဖြစ်၏။ Encapsulation က ဘာလို့လိုအပ်တာလဲ ဆိုတာကို မစဉ်းစားခင် OOPရဲ့ သမိုင်းကို ပြန်ကြည့်ကြည့်ကြရအောင်။ Software Engineering လောကမှာ OOP က စတင်နေရာ ရလာခဲ့တာကတော့ လွန်ခဲ့တဲ့ နှစ်၂၀ခန့်ကဖြစ်၏။ ကမ္ဘာတဝှမ်း၌ IT နည်းပညာကို စီးပွားရေးအခြေခံ တွေမှာ၊ လူနေမှု့စနစ်ရဲ့ အခြေခံတွေမှာ ရင်းနှီးမြှုပ်နှံမှု့တွေကို အပြိုင်အဆိုင် ပြုလုပ်နေတဲ့ ကာလဖြစ်ခဲ့၏။ ထိုခေတ်သည် System လိုအပ်မှု့များနှင့် စာလျှင် IT Engineerရဲ့ အရေအတွက်ဟာ အလွန်နည်းပါး ခဲ့သော ကာလလည်းဖြစ်၏။
အသစ်အသစ်တွေကို ပြန်ရေး နေသည်နှင့်စာလျှင် ရေးထားပြီးသား System တွေကို ဘယ်လိုပြန် အသုံးချနိုင်အောင် လုပ်မလဲဆိုတာ IT သမားတွေ အတွက် မရှိမဖြစ်လိုအပ်ခဲ့တဲ့ လိုအပ်ချက်တစ်ခု ဖြစ်ခဲ့၏။ Software ရဲ့ အစိတ်အပိုင်းတွေကို ရုပ်ပစ္စည်း အဖြစ်ကြည့်မြင်ပြီး၊ အစိတ်အပိုင်းတွေကို စုပေါင်းအသုံးချခြင်း အားဖြင့် System တစ်ခုကို တည်ဆောက်သော OOP ရဲ့ တွေးခေါ်မှု့တွေဟာ ရေးပြီးသား Software တွေကို ပြန်လည်အသုံးချလိုတဲ့ အဲ့ဒီခေတ်ရဲ့ လိုအပ်ချက်နှင့် ကိုက်ညီနေခဲ့၏။
ထို့ကြောင့် OOP ကို အခြေခံတဲ့ Programming ဘာသာရပ်တွေ အများအပြား ထွက်ပေါ်လာရခြင်း ဖြစ်သည်။ ကျွှန်တော်တို့ OOP ကို ဘာလို့အသုံးပြုခဲ့ကြတယ် ဆိုတာကိုသဘောပေါက်ပြီးရင် Encapsulation ဘက်ကို ပြန်စဉ်းစားကြည့်ကြရအောင်။
Encapsulation ဆိုသည်မှာ လုံခြုံအောင် ထုတ်သိမ်းထားခြင်းဟု အဓိပ္ပါယ် ရပါသည်။ ဘာကြောင့် Encapsulation လုပ်ဖို့လိုတာလဲဟု စဉ်းစားလျှင် OOP ရဲ့ လိုအပ်ချက်တွင် အဖြေရှိပါသည်။ ရေးသားထားသော Object တစ်ခုကို ရေးသားသူ တစ်ယောက်တည်းက အသုံးပြုမည် မဟုတ်။ ထို့အပြင် ရေးသားပြီး အချိန် အတန်ကြာမှ ပြန်လည်အသုံးချသည့်အခါလည်း ရှိပါလိမ့်မည်။ Object ၏ အချက်အလက်တွေနဲ့ လုပ်ဆောင်ချက်တွေကို အခြားသော နေရာများမှ နှစ်သက်သလို အသုံးပြုကြမည် ဆိုလျှင် ခက်ပေမည်။ အဲ့ဒီအတွက် Object တစ်ခုက ပိုင်ဆိုင်တဲ့ အချက်အလက်နဲ့ လုပ်ဆောင်ချက်တွေကို ပြင်ပမှ မမြင်နိုင်ရန် ဖုံးကွယ်ထားဖို့ လိုအပ်ပေသည်။ ဤကဲ့သို့ ဖုံးကွယ်ခြင်းကို Encapsulation ဟုခေါ်၏။
ကျွှန်တော်တို့ Java မှာ Encapsulation ကို ဘယ်လိုလုပ်လဲ ဆိုတာကို လက်တွေ့ Code တွေရေးကြည့်ကြရအောင်။ အောက်ပါ User.java ကို ကြည့်ပါ။ Encapsulation ကို အသုံးမပြုပဲ ရေးသားထားခြင်း ဖြစ်သည်။
public class User { public String name; public int age; public User(String name, int age) { this.name = name; this.age = age; } }
အထက်ပါ User Class ၏ အချက်အလက်များ ဖြစ်ကြသော name, age နှင့် Constructor ဖြစ်သော User(String name, int age) သည် public များဖြစ်ကြ၍ OOP ၏အမြင်မှဆိုလျှင် လုံခြုံမှု့မရှိဟု သတ်မှတ်နိုင်သည်။ ဟုတ်ပြီ၊ လုံခြုံမှု့ရှိအောင် Encapsulation လုပ်ကြစို့။ အောက်ပါ Src Code များသည် public ကို private အဖြစ်ပြောင်းလည်းပြီး Encapsulation လုပ်ထားသော Code များဖြစ်၏။
public class User { private String name; private int age; private User(String name, int age) { this.name = name; this.age = age; } }
အထက်ပါအတိုင်း Encapsulation သည် လွယ်ကူလှပေသည်။ သို့ရာတွင် ဤအတိုင်းဆိုပါက အသုံးဝင်မည် မဟုတ်ပေ။ Constructor က private ဖြစ်နေပါသဖြင့် instance ကို လုပ်ယူနိုင်မည်မဟုတ်။ ဤနေရာသည် ရွေးချယ်ရန် အနည်းငယ် ခက်ခဲ ပေသည်။ package အတူတူ အတွင်းမှာသုံးမှာလား၊ ဒါဆိုရင် private ကို ဖြုတ်လိုက်ရုံပင်။ ဒါမှမဟုတ် package အပြင်က အထိ အသုံးပြုစေလိုတာလား။ ဆုံးဖြတ်ရန် အနည်းငယ် ခက်ခဲလှ၏။ဦးစွာ ဤနေရာတွင် Constructor ကို public အဖြစ် ပြောင်းလည်းပါမည်။ ဤသို့ပြောင်းလည်းခြင်း အားဖြင့် package ထဲမှာရော အပြင်မှာပါ instance ကို လုပ်ယူနိုင်မည် ဖြစ်၏။
သို့ရာတွင် အခြားသော ပြဿနာလည်း ရှိပါသေးသည်။ ပိုင်ဆိုင်သော အချက်အလက်များကို ပြောင်းလည်း၍ မရနိုင်ပေ။ age အချက်အလက်သည် နှစ်တိုင်း ပြောင်းလည်းနိုင်ပါသဖြင့် ပြင်ပမှ ပြောင်းလည်းမရနိုင်ခြင်းသည် သိပ်မကောင်းလှပေ။ public အဖြစ်ပြောင်းလည်း လိုက်ပြန်ရင်လည်း မဖြစ်နိုင်တဲ့ အသက်တွေ (အနှုတ်တန်ဖိုး) သတ်မှတ်သွားနိုင်သည်။ ဤနေရာတွင် Encapsulation ကို စောင့်စည်းရင်း ပြင်ပကိုလည်း ပြုပြင်နိုင်အောင် မလုပ်နိုင်ဘူးလားဟု စဉ်းစားစရာ ဖြစ်လာသည်။ ဤကဲ့သို့ အခြေအနေမျိုးတွင် Access Method များသည် အသုံးဝင်လှပေသည်။
public void setAge(int age) { if(age > this.age) { this.age = age; } }
အထက်ပါ setAge(int age) လုပ်ဆောင်ချက်ကို အသုံးပြုမည် ဆိုပါက
- User ၏ age အချက်အလက်သည် private အတိုင်းပင်ဖြစ်၏။
- setAgeလုပ်ဆောင်ချက်ကို အသုံးပြုမည် ဆိုပါက ပြင်ပမှလည်း အချက်အလက်များကို ပြုပြင်ပြောင်းလည်းနိုင်မည် ဖြစ်သည်။
- setAge လုပ်ဆောင်ချက် အတွင်းတွင်လည်း age သည် Object မှပိုင်ဆိုင်သော age ထက်ကြီးမှသာ ပြောင်းလည်းမည်ဟု စစ်ဆေးနိုင်ပါသဖြင့် အချက်အလက်များကို လုံခြုံမှု့ရှိစေပါသည်။
အမြန်မှတ်ရန်
Encapsulation ပြုလုပ်မည်ဆိုပါက private မှစပါ။ အသုံးလိုသလို စဉ်းစားသွားမည် ဆိုပါက ပြင်ပကို ဖော်ပြရန်လိုတဲ့ အချက်အလက်နဲ့ လုပ်ဆောင်ချက်တွေကို အလိုလို မြင်လာမည် ဖြစ်သည်။
Encapsulation ပြုလုပ်မည်ဆိုပါက private မှစပါ။ အသုံးလိုသလို စဉ်းစားသွားမည် ဆိုပါက ပြင်ပကို ဖော်ပြရန်လိုတဲ့ အချက်အလက်နဲ့ လုပ်ဆောင်ချက်တွေကို အလိုလို မြင်လာမည် ဖြစ်သည်။
No comments:
Post a Comment