JavaRush /Курстар /All lectures for KK purposes /Инкапсуляция қағидалары

Инкапсуляция қағидалары

All lectures for KK purposes
Деңгей , Сабақ
Қол жетімді
Сәлем! Бүгінгі дәрісті инкапсуляцияға арнаймыз және оны бірден мысалдармен бастаймыз :) Инкапсуляция қағидалары - 1Алдыңда — әдеттегі газировка автоматы. Менде саған бір сұрақ бар: ол қалай жұмыс істейді? Толығырақ жауап беруге тырыс: стакан қайдан шығады, іші қалай суытылып тұрады, мұз қайда сақталады, автомат қандай сироп қосу керектігін қалай түсінеді және т.с.с. Мүмкін, бұл сұрақтардың жауаптарын білмейсің. Жақсы, мүмкін емес барлық адамдар осындай автоматтарды пайдаланады, қазір олар сонша танымал емес. Басқа мысал келтіріп көрейік. Сен күнде бірнеше рет қолданатын нәрсе. О, идея келді! Инкапсуляция қағидалары - 2 Google іздеу жүйесі қалай жұмыс істейді? Сен енгізген сөздерге ақпаратты қалай іздейді? Неге бұл нәтижелер жоғарғы орында, ал басқалары емес? Сен гуглды күнде қолданасың, бірақ сен мұны білмейтінің анық. Бірақ бұл маңызды емес. Өйткені саған мұны білу қажет емес. Сен іздеу жүйесіне сұрауларды енгізе аласың, оның қалай жұмыс істейтінін ойламай-ақ. Сен газировка автоматынан сатып ала аласың, оның қалай құрылғанын білмей-ақ. Сен көлікті жүргізе аласың, ішкі жану қозғалтқышының жұмысын түсінбей-ақ және мектеп деңгейіндегі физиканы білмей-ақ. Мұның бәрі объектіге-бағытталған бағдарламалаудың басты принциптерінің бірі — инкапсуляция арқасында мүмкін. Бұл тақырыпта әртүрлі мақалаларды оқығанда, сен бағдарламалауда екі кең таралған ұғым — инкапсуляция және жасыру бар екенін байқаған боларсың. Ал «инкапсуляция» сөзімен авторлар бірде бірін, бірде басқа түсінікті білдіреді (солай қалыптасқан). Біз екі терминді де қарастырамыз, осылайша сенде толық түсінік болады. Бағдарламалауда сөздің бастапқы мәні « инкапсуляция» — мәліметтер мен олармен жұмыс әдістерін бір пакетке біріктіру («капсула»). Java-да орауыш-капсула рөлінде класс қолданылады. Класс өзінің ішінде мәліметтерді (класс өрістерімен) және осы мәліметтермен жұмыс істеу үшін әдістерді қамтиды. Инкапсуляция қағидалары - 3 Саған бұл айқын көрінуі мүмкін, бірақ басқа бағдарламалау концепцияларда бәрі басқаша ұйымдастырылған. Мысалы, функционалды бағдарламалауда мәліметтер операциялардан қатты бөлінген. OOП-де (объектіге-бағытталған бағдарламалау) бағдарламалар деректер мен олармен жұмыс істеу функциялары бірдей болып табылатын класс-капсулалардан тұрады. Енді жасыру жайлы сөйлесейік. Қалайша біз күрделі механизмдерді олардың қалай ұйымдастырылғанын және олардың жұмысы негізделгенін түсінбей-ақ қолдана аламыз? Барлығы қарапайым: олардың жасаушылары қарапайым және ыңғайлы интерфейс берді. Газировка автоматында интерфейс — панельдегі батырмалар. Бір батырманы басып, сен стаканның көлемін таңдайсың. Екіншісін басып, сиропты таңдайсың. Үшіншісі - мұз қосуға жауапты. Әрине, сенің жасауың керек нәрсе де осы ғана. Автоматтың ішінде қалай орналасқаны маңызды емес. Ең бастысы — ол ішкі жағынан газировка алу үшін қолданушыға үш батырманы басу қажет болатындай ұйымдастырылған. Көлікпен де солай. Оның ішкі жағынан не болып жатқаны маңызды емес. Ең бастысы — оң педальды басқанда көлік алға жүреді, сол педальды басқанда — тежеледі. Жасырынудың мәні осында. Барлық «ішкі бөліктер» қолданушыдан жасырылады. Бұл ақпарат қолданушыға артық, қажет емес. Қолданушыға тек соңғы нәтиже қажет, ал ішкі процесс емес. Кел, мысал ретінде Auto классын қарап көрейік:

public class Auto {

   public void gas() {

       /*көлікте неше түрлі күрделі нәрселер болып жатады,
       сондықтан ол алға қарай жылжиды*/
   }

   public void brake() {

       /*көлікте күрделі нәрселер орын алады,
       сондықтан ол тежеледі*/
   }

   public static void main(String[] args) {

       Auto auto = new Auto();

       //Қолданушыға қалай көрінеді

       //бір педальді басса - жүреді
       auto.gas();
      
       //басқа педальді басса - тежеледі
       auto.brake();
   }
}
Міне, Java бағдарламасында жасырудың қалай көрінетіні осылай. Барлығы шынайы өмірдегідей: қолданушыға белгілі бір интерфейс (әдістер) беріледі. Егер оған бағдарламадағы көлік бір әрекетті орындауы керек болса, қажетті әдісті шақыру жеткілікті. Ал осы әдістердің ішінде не болып жатқаны — артық ақпарат, ең бастысы, бәрі қалай жұмыс істеп жатқаны. Мұнда біз жасырыну түрін қарастырдық. Java-да тағы да мәліметтерді жасыру бар. Біз оны геттерлер мен сеттерлер туралы дәрісінде жазған едік, бірақ еске түсірген артық етпейді. Мысалы, бізде Cat класы бар:

public class Cat {

   public String name;
   public int age;
   public int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Мяу!");
   }
}
Мүмкін, сен өткен дәрістен осы класстың мәселесін еске түсірдің бе? Егер жоқ болса — еске түсірейік. Мәселе мында: оның деректері (өрістер) барлық адамдарға ашық, ал басқа бағдарламалаушы программада есімсіз, салмағы 0, жасы -1000 жыл болатын мысық жасауға оңай болады:

public static void main(String[] args) {

   Cat cat = new Cat();
   cat.name = "";
   cat.age = -1000;
   cat.weight = 0;

}
Мұндай жағдайда сенің әріптестерің ешкімнің дұрыс емес объектілер жасамайтындығына көз жеткізу қажет, бірақ мұндай «дұрыс емес объектілерді» жасау мүмкіндігін болдырмау әлдеқайда жақсы болады. Инкапсуляция қағидалары - 4 Деректерді жасыруда бізге:
  1. қол жетімділік модификаторы (private, protected, package default);
  2. геттерлер мен сеттерлер көмектеседі.
Ол жерде, мысалы, біреу мысыққа жасы ретінде теріс сан тағайындауға тырыспайтындығын тексеруді орнатуға болады. Бұрын айтқанымыздай, инкапсуляция туралы әртүрлі мақалалардың авторлары инкапсуляцияны (деректер мен әдістерді біріктіру), жасыруды, немесе екі механизмді де. Java-да екі механизм де бар (басқа ООП тілдерінде бұл міндетті емес), сондықтан соңғы нұсқа ең дұрыс болады. Инкапсуляцияны пайдалану бізге бірнеше маңызды артықшылықтар береді:
  1. Объектінің дұрыс күйін бақылау. Бұған дейінгі мысалдар осыған дәлел болды: сеттер мен private модификаторының арқасында, біз 0 салмақты мысықтардан өз бағдарламамызды қауіпсіз етіп жасадық.

  2. Пайдаланушыға интерфейс арқылы ыңғайлылық беру. Біз пайдаланушыға қол жетімді тек әдістерді ғана «сыртта» қалдырамыз. Оларға тек шақыру жеткілікті, нәтижені алу үшін, ал жұмыс барысына толығымен араласудың қажеті жоқ.

  3. Кодтағы өзгерістер пайдаланушыларға әсер етпейді. Біздің барлық өзгерістеріміз әдістер ішінде жүргізіледі. Бұл пайдаланушыға әсер етпейді: ол auto.gas() деп жазады, және бұрынғысынша жаза береді. Ал біз gas() әдісінің жұмысын өзгертсек те, ол үшін бұл байқалмайды: ол бұрынғысынша қажетті нәтижені алатын болады.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION