ობიექტზე ორიენტირებული დაპროგრამების საფუძვლები

opp

ბოლო დროს ობიექტზე ორიენტირებული დაპროგრამების (Object-Oriented Programming – OOP) იდეა, პროგრამის დაწერის კარდინალურად ახალი იდეოლოგია, სულ უფრო დიდ მოწონებით სარგებლობს პროგრამისტებს შორის.

ობიექტზე ორიენტირებული პროგრამები უფრო მარტივი და მობილურია, მათი მოდიფიცირება და თანხლება ბევრად მარტივია, ვიდრე ჩვეულებრივი, ტრადიციული პროგრამების. ამის გარდა, თვითონ ობიექტზე ორიენტირებულის იდეის კომპეტენტურად გამოყენების შემთხვევაში, შექმნილი პროგრამები ბევრად უფრო დაცულია შეცდომებისაგან.

ობიექტზე ორიენტირებული დაპროგრამება შეიქმნა იმ პროცედურული დაპროგრამების იდეოლოგიის განვითარების შედეგად, სადაც მონაცემები და მათი დასამუშავებელი ქვეპროგრამები (პროცედურები, ფუნქციები) ფორმალურად ერთმანეთთან კავშირში არ არიან. 

დაპროგრამების პირველი ენა, რომელშიც ობიექტზე ორიენტირებული დაპროგრამების პრინციპები გამოიყენეს  იყო სიმულა. მისი შექმნის დროს 1967 წელს რევოლუციური იდეები გაჩნდა: ობიექტები, კლასები, ვირტუალური მეთოდები და სხვა, თუმცა მაშინდელი სპეციალისტების მიერ ყოველივე ეს არ იქნა აღქმული, როგორც გრანდიოზული მოვლენა. ამის მიუხედავად, კონცეფციების უმეტესობა ალან კეემისა და დენ ინგალსის მიერ Smalltalk ენაში იქნა რეალიზებული. სწორედ, იგი გახდა პირველი, ფართოდ გავრცელებული ობიექტზე ორიენტირებული დაპროგრამების ენა. ამჟამად, გამოყენებითი დაპროგრამების ის ენებია მეტი, რომლებშიც ობიექტზე ორიენტირებული განხორციელების

მეთოდების რეალიზება ხდება, ვიდრე ის ენები, რომლებიც დაპროგრამების სხვა მეთოდებს იყენებენ. სისტემური დაპროგრამების სფეროში ჯერ კიდევ პროცედურული დაპროგრამების მეთოდები გამოიყენება და საყოველთაოდ მიღებულ დაპროგრამების ენას C წარმოადგენს. ოპერაციული სისტემის სისტემური და გამოყენებითი დონეების ურთიერთქმედების დროს ობიექტზე ორიენტირებულმა დაპროგრამებამ შესამჩნევი გავლენის მოხდენა დაიწყო. მაგალითად, ერთ-ერთ ყველაზე გავრცელებულ მულტიპლატფორმული დაპროგრამების ბიბლიოთეკას C++ ენაზე დაწერილი ობიექტზე ორიენტირებული ბიბლიოთეკა Qt წარმოადგენს.

PHP  ბოლო დრომდე ობიექტზე ორიენტირებული დაპროგრამების მხოლოდ გარკვეულ მხარდაჭერას უზრუნველყოფდა. მაგრამ, PHP 5-ის გამოსვლის შემდეგ პრაქტიკულად, ობიექტზე ორიენტირებული დაპროგრამების სრული მხარდამჭერი გახდა. ყველაზე კარგი იქნება ობიექტზე ორიენტირებული დაპროგრამების სტრატეგიის აღწერა დაპროგრამების პროცესში მოხდეს, როგორც დანართების ფუნქციურობიდან მონაცემთა სტრუქტურებისაკენ წანაცვლება. ეს პროგრამისტს შესაქმნელ დანართებში რეალური ობიექტებისა და სიტუაციის მოდელირების საშუალებას მისცემს. ობიექტზე ორიენტირებული დაპროგრამების ტექნოლოგიას სამი მთავარი უპირატესობა გააჩნია:

  • იგი გასაგებად ადვილია: ობიექტზე ორიენტირებული დაპროგრამება ყოველდღიური ობიექტების კატეგორიებით აზროვნების საშუალებას იძლევა;
  • გაზრდილია საიმედოობა და მარტივია მხარდაჭერისათვის – სწორი დაპროექტება ობიექტზე ორიენტირებული პროგრამის გაფართოებისა და მოდიფიკაციის სიმარტივეს უზრუნველყოფს. მოდულური სტრუქტურა პროგრამის ცალკეულ ნაწილებში დამოუკიდებელი ცვლილებების შეტანის საშუალებას იძლევა და ამასთან ერთად დაპროგრამების შეცდომების რისკი მინიმუმამდეა დაყვანილი;
  • დამუშავების ციკლს აჩქარებს – მოდულურობა აქაც მნიშვნელოვან როლს ასრულებს, ვინაიდან ობიექტზე ორიენტირებული პროგრამის ცალკეული კომპონენტები სხვა პროგრამებში ძალზე მარტივად შეიძლება იქნეს გამოყენებული, რაც კოდის მოცულობას ამცირებს და კოპირების დროს დაშვებული შეცდომების რისკს ამცირებს.

ობიექტზე ორიენტირებული დაპროგრამების სპეციფიკა პროგრამისტის შრომის ნაყოფიერებას საკმაოდ ამაღლებს და მათ საშუალებას აძლევს უფრო მძლავრი, მასშტაბური და ეფექტური დანართები შექმნან. ობიექტზე ორიენტირებული დაპროგრამების პრინციპებს

წარმოადგენს:

ინკაპსულაცია; პოლიმორფიზმი; მემკვიდრეობითობა. ინკაპსულაცია

ობიექტზე ორიენტირებული დაპროგრამების მრავალი უპირატესობა მისი ერთ-ერთი ფუნდამენტური პრინციპით – ინკაპსულაციითა განპირობებული. ინკაპსულაცია არის სისტემის თვისება, რომელიც მონაცემებისა და მეთოდების მათთან მომუშავე კლასში გაერთიანებისა და მომხმარებლისაგან რეალიზაციის დეტალების დაფარვის  საშუალებას იძლევა. ინკაპსულაციის საშუალებით სხვადასხვა მცირე ელემენტის უფრო მსხვილ ელემენტებში ჩართვა ხდება, რის შედეგადაც პროგრამისტი უშუალოდ ამ ობიექტთან მუშაობს. ეს პროგრამის გამარტივებას იწვევს, რადგან            მასში   მეორეხარისხოვანი     დეტალები გამოირიცხება.

ინკაპსულაციასა და ობიექტზე ორიენტირებულ დაპროგრამებაში „შიგა მოწყობის“ მრავალი წვრილმანი მომხმარებლისგან დაფარულია, რაც მას საშუალებას აძლევს მთელი ყურადღება კონკრეტული ამოცანის გადაწყვეტაზე გადაიტანოს. ობიექტზე ორიენტირებულ დაპროგრამებაში ამ შესაძლებლობების უზრუნველყოფა კლასებით, ობიექტებითა და მათ შორის იერარქიული კავშირების სხვადასხვა საშუალების გამოსახვით ხდება.

პოლიმორფიზმი 

პოლიმორფიზმი – ეს არის სისტემის თვისება ერთნაირი ინტერფეისის მქონე ობიექტები ობიექტის ტიპისა და შიგა სტრუქტურის ინფორმაციის გარეშე გამოიყენოს.

პოლიმორფიზმი საშუალებას იძლევა მსგავსი, მაგრამ ტექნიკურად სხვადასხვა ამოცანისათვის ერთი და იგივე სახელები გამოიყენოს. პოლიმორფიზმში მთავარია, რომ იგი მსგავსი ქმედებებისათვის სტანდარტული ინტერფეისის შექმნის გზით ობიექტებით მანიპულირების საშუალებას იძლევა. პოლიმორფიზმი რთული პროგრამების დაწერის მნიშვნელოვანი ხელშემწყობია.

მემკვიდრეობითობა

მემკვიდრეობითობა არის სისტემის თვისება, რომელიც უკვე არსებულის საფუძველზე ახალი კლასი აღწერის საშუალებას იძლევა და ფუნქციონირებას ნაწილობრივ ან სრულად კისრულობს. კლასს, რომლისგანაც მომდინარეობს მემკვიდრეობა, საბაზო, საბაზო ან სუპერ კლასი ეწოდება. ახალ კლასს კი მემკვიდრე ან ქვეკლასი ეწოდება.

მემკვიდრეობითობა ერთ ობიექტს საშუალებას აძლევს სხვა ობიექტის თვისება შეიძინოს, ეს ობიექტის კოპირებაში არ აურიოთ. კოპირების დროს ობიექტის ზუსტი ასლი იქმნება, მემკვიდრეობითობის დროს  კი ობიექტის ზუსტი ასლი მისი იმ უნიკალური თვისებებით ივსება, რომელიც მხოლოდ წარმოქმნილი ობიექტისათვისაა დამახასიათებელი.

ძირითადი ცნებები

აბსტრაქცია არის ობიექტის მნიშვნელოვანი მახასიათებლებების ნაკრების გამოყოფისა და განხილვიდან უმნიშვნელო მახასიათებლების გამორიცხვის საშუალებანი.

შესაბამისად, აბსტრაქცია – ყველა ასეთი მახასიათებლის ნაკრებია. კლასი არის ჯერ კიდევ არ არსებული არსის (ობიექტის) ტერმინოლოგიის ენაზე აღწერილი მოდელის საწყისი კოდი. ფაქტობრივად იგი ობიექტის მოწყობას აღწერს და თავისებურ ნახაზს წარმოადგენს. ამბობენ, რომ ობიექტი ეს კლასის ეგზემპლარია. ამასთან, ზოგიერთ შესრულებად სისტემაში კლასი მონაცემთა ტიპის დინამიკური იდენტიფიცირებით პროგრამის შესრულების დროს შეიძლება რომელიმე ობიექტით იყოს წარმოდგენილი. ჩვეულებრივ, კლასების დამუშავება ისე ხდება, რომ მათი ობიექტები საგნობრივ სფეროს ობიექტებს შეესაბამებოდეს.

ობიექტი არის გამოთვლითი სისტემის სამისამართო სივრცის არსი, რომელიც კლასის ეგზემპლარის ან პროტოტიპის კოპირების დროს წარმოიშობა (მაგალითად, კომპილაციის შედეგებისა და საწყისი კოდის შესრულებაზე გაშვების შემდეგ). ობიექტი არის არსი, რომლითაც შეტყობინების გაგზავნა შეიძლება და რომელსაც მათზე თავისი მონაცემების გამოყენებით რეაგირება შეუძლია. ობიექტი ეს კლასის ეგზემპლარია. ობიექტის მონაცემები დანარჩენი პროგრამისაგან დაფარულია. მონაცემთა დაფარვას ინკაპსულაცია ეწოდება.

პროტოტიპი არის ობიექტი-ნიმუში, რომლის მიხედვით და მსგავსებით სხვა ობიექტები იქმნება. ობიექტ-ასლმა ორიგინალ ობიექტებთან კავშირი შეიძლება შეინარჩუნს, პროტოტიპში ცვლილებების მემკვიდრეობით გადაცემა ავტომატურად მოხდეს; ეს განსაკუთრებულობა კონკრეტული ენის ფარგლებში შეიძლება განხორციელდეს.

განმარტების სირთულე

ობიექტზე ორიენტირებულ დაპროგრამებას უკვე ორმოცწლიანი ისტორია აქვს, მაგრამ მიუხედავად ამისა, მოცემული ტექნოლოგიის მკაფიო, საყოველთაოდ მიღებული განმარტება ჯერ კიდევ არ არსებობს. ძირითადმა პრინციპებმა, რომლებიც მის პირველ ობიექტურ ენებსა და სისტემებში იყო ჩადებული, შემდგომი წლების მრავალრიცხოვანი რეალიზაციის დროს მნიშვნელოვანი ცვლილებები (ან დამახინჯებანი) და დამატებები განიცადა. ამის გარდა, დაახლოებით 1980 წლის შუიდან ტერმინი „ობიექტზე ორიენტირებული ძალზე მოდური გახდა, რის გამოც მას ნებისმიერ ახალ მოვლენებს „აწეპებდნენ“, რათა მათი მიმზიდველობა უზრუნველეყოთ.

Smalltalk ენის შემქმნელის ალან კეის აზრით, რომელსაც ობიექტზე ორიენტირებული დაპროგრამების ერთ-ერთ მამთავრად მიიჩნევენ, ობიექტზე ორიენტირებული მიდგომა შემდეგი ძირითადი პრინციპებით გამოიხატება:

  1. ყველაფერი ობიექტია;
  2. გამოთვლები ობიექტებს შორის მონაცემთა გაცვლით ხორციელდება, რომლის დროსაც ერთი ობიექტი მოითხოვს, რომ სხვა ობიექტმა რაიმე მოქმედება შეასრულოს. ობიექტები შეტყობინებების გაგზავნითა და მიღებით ურთიერთქმედებენ. შეტყობინება არის მოქმედების შეასრულების მოთხოვნა, შევსებული არგუმენტთა ნაკრებით, რომლებიც მოქმედების შემსრულების დროს შეიძლება გახდეს საჭირო;
  3. ყოველ ობიექტს დამოუკიდებელი მეხსიერება აქვს, რომელიც სხვა ობიექტებისაგან შედგება;
  4. ყოველი ობიექტი წარმომადგენელია კლასის, რომელიც ობიექტების საერთო თვისაბას წარმოადგენს

(მაგალითად, როგორიცაა მთელი რიცხვები ან სიები);

  1. კლასში მოცემული ობიექტის ქცევა (ფუნქციურობა). შესაბამისად, ყოველ ობიექტს, რომელიც ერთი კლასის ეგზემპლარს წარმოადგენს, იგივე ქმედების შესრულება შეუძლია;
  2. კლასები საერთო ფესვის მქონე ერთიან ხისმაგვარ სტრუქტურაშია გაერთიანებული, რომელსაც მემკვიდრეობითობის იერარქია ეწოდება. მეხსიერება და ქცევა, რომელიც გარკვეული კლასის ეგზემპლართანაა დაკავშირებული, იერარქიულ ხეში მის ქვემოთ მდგომი ნებისმიერი კლასისათვის ავტომატურად მისაწვდომია.

ამგვარად, პროგრამა ობიექტების ნაკრებს წარმოადგენს,

რომელსაც მდგომარეობა და ქცევა გააჩნია. ობიექტები შეტყობინებების საშუალებით ურთიერთქმედებენ. ბუნებრივად განლაგდება ობიექტთა იერარქია: პროგრამა მთლიანად არის ობიექტი, რომელიც თავისი ფუნქციის შესასრულებლად მასში შემავალ ობიექტებს მიმართავს, რომლებიც, თავის მხრივ მიმართვის გზით მოთხოვნილს პროგრამის სხვა ობიექტებზე მიმართვის გზით ასრულებენ. ცხადია, რომ მიმართვების უსასრულო რეკურსიის თავიდან აცილების მიზნით რაიმე ეტაპზე ობიექტი მასზე მიმართვის შეტყობინების ტრანსფორმირებას ახდენს და დაპროგრამების ენისა და გარემოს მიერ უზრუნველყოფილ სტანდარტულ სისტემურ ობიექტებს მიმართავს.

სტაბილურობა და მართვის სისტემა ობიექტების პასუხისმგებლობის მკაფიო განაწილებით (ყოველ ქმედებაზე გარკვეული ობიექტი აგებს პასუხს), ობიექტთაშორისი ურთიერთქმედების ინტერფეისის ცალსახა განსაზღვრით და ობიექტის შიგა სტრუქტურის გარემოდან სრული იზოლაციითაა (ინკაპსულაცია) უზრუნველყოფილი.

             

კლასები და ობიექტები PHP-ში

როგორც ზემოთ აღვნიშნეთ, კლასი ობიექტზე ორიენტირებული დაპროგრამების საბაზო ცნებას წარმოადგენს. მარტივად რომ ვთქვათ, კლასი ცვლადის ერთ-ერთი თავისებური ტიპია. კლასის ეგზემპლარი არის ობიექტი. ობიექტი არის დასამუშავებლად განკუთვნილი მონაცემებისა (თვისებების) და ფუნქციების (მეთოდების) ერთობლიობა. მონაცემებსა და მეთოდებს კლასის წევრები ეწოდებათ. საერთოდ, ობიექტს წარმოადგენს ყველაფერი, რაც ინკაპსულაციას უჭერს მხარს. ობიექტის შიგნით მონაცემები და კოდი (კლასის წევრები) შეიძლება იყოს ღია ან დახურული. ღია მონაცემები და კლასის წევრები პროგრამის სხვა ნაწილებისათვისაც, რომლებიც ობიექტის ნაწილს არ წარმოადგენს, მისაწვდომია. ხოლო დახურული მონაცემები და კლასის წევრები მხოლოდ ამ ობიექტის შიგნითაა მისაწვდომი. 

PHP-ში კლასის აღწერა class სამომხმარებლო სიტყვით იწყება:

  class კლასი_სახელი {

// მონაცემების – კლასის წევრების აღწერა და მათი დამუშავების მეთოდები

}

ობიექტის გამოსაცხადებლად აუცილებლად უნდა გამოვიყენოთ ოპერატორი new:

  ობიექტი = new კლასი_სახელი;

მონაცემების აღწერა var სამომხმარებლო სიტყვის მეშვეობით ხდება. მეთოდის აღწერა ჩვეულებრივი ფუნქციის მსგავსად ხდება.

ავტორი:სტურუა  ბესიკ ტაბატაძე,თეა თოდუა