Objective-C: განსხვავება გადახედვებს შორის

[შეუმოწმებელი ვერსია][შეუმოწმებელი ვერსია]
შიგთავსი ამოიშალა შიგთავსი დაემატა
No edit summary
No edit summary
ხაზი 81:
ამაში შედიოდა Objective-C და [[NeXT|NeXT-ის]] Objective-Cში პროგრამების დასაწერი ხელსაწყოები, [[Project Builder]] (შემდეგში შეცვლილი [[Xcode]]-ის მიერ), და აგრეთვე გრაფიკული ინტერფეისის შექმნის ხელსაწყო, [[Interface Builder]].
[[Apple]]-ის დღევანდელი დღის უმეტესი [[Cocoa API]]-ს ნაწელი არის დაყრდნობილი [[OpenStep]]-ის ინტერფეისის ობიექტებზე, და წარმოადგენს Objective-Cს ყველაზე დიდ ნაწილს რომელიც გამოიყენება პროგრამირებისთვის.
 
 
==სინტაქსი==
 
Objective-C არის ძალიან thin [[C_(პროგრამირების_ენა)|C-ის]] ზედა ფენა, არის [[C_(პროგრამირების_ენა)|C-ზე]] დამატებული საშუალებები.
ასე რომ, შესაძლოა ნებისმიერი [[C_(პროგრამირების_ენა)|C]] კოდის კომპილირება Objective-C კომპილერით, და [[C_(პროგრამირების_ენა)|C]] კოდის შერწყმა Objective-C კლასთან.
 
Objective-Cის სინტაქსი მოდის Smalltalk-იდან. არა ობიექტზე-ორიენტირებული ოპერაციების სინტაქსი
(ცვლადები, ინსტრუქციები, ფუნქციის ახწერა, ფუნქციის გამოყენება) არის იგივე რაც [[C_(პროგრამირების_ენა)|C-ში]], და [[ობიექტზე-ორიენტირებული]] ოპერაციების სინტაქსი მიბაძულია [[Smalltalk]]-ის მესეჯების გაგაზავნის სისტემასთან.
 
 
===მესეჯები===
 
Objective-Cის [[ობიექტზე-ორიენტირებული]] პროგრამირების მოდელი არის ბაზირებული [[მესეჯების]] სხვა ობიექტების ნიმუშებთან გაგზავნაზე.
[[Simula]]-ს პროგრამირების სტილი, რომელიც გამოყენებულია [[C++]]ში, სემანტიკურად ხაზგასმით განსხვავდება.
Objective-Cში მეთოდემის დაძახება არ ხდემა, არამედ მათ უგზავნით მესეჯებს, ეს კონცეფტი განლაგებს თუ როგორ სრულდება მეთოდის კოდის შესრულება.
[[Simula]]-ს ნაირ ენაში, მეთოდის სახელი, უმეტეს შემთხვევაში, არის შერწყმული აღნიშნული კლასის კოდის სექციაში, [[კომპილატორი|კომპილატორის]] მიერ, მაგრამ [[Smalltalk]]-ში და Objective-Cში, მესეჯი წარმოადგენს მხოლოდ სახელს, რომელიც არის დადგენილი პროგრამის მუშაობის დროს: მესეჯის განმარტება (interpretation) ექვამდებარება მიმღებ ობიექტს.
აქედან გამომდინარე, მესეჯების გაგზავნის მექანიზმი არ არის დამოკიდებული რომ ცვლადების ტიპები შეამოწმოს: ომიექტი რომლისთვისაც მესეჯი არის გამოგზავნილი (მოიხსენება როგორც მიმღები) არ იძლევა გარანტიას რომ იგი მესეჯს პასუხს გასცემს, და მაგ შემთხვევაში იგ იგნორირებს და ნულ მითითემას (NULL pointer) აბრუნებს.
 
 
obj ობიექტისტვის მესეჯის გაგზავნა [[C++]]ში მოითხოვს შემდეგ კოდს:
<source code="c++">
obj->method(parameter);
</source>
 
რომელიც Objective-Cში იწერება როგორც შემდეგ:
<source code="obj-c">
[obj method:parameter];
</source>
 
ორივე პროგრამირების სტილს მიაჩნია თავისი პლიუსები და მინუსები.
[[Simula]]-ს ნაირი ობიექტზე-ორიენტირება მრავალ მემკვიდრეობას და კოდის ჩქარ შესრულებას უმართავს ხელს კომპილირების დროს ინფორნმაციების შეერთებით სადაც შესაძლოა მაგრამ არა აქვს [[დინამიკური_შერწყმა_(ინფორმატიკა)|დინამიკური შერწყმის]] უნარი (ბრუნებრივ შემთხვევაში).
იგი აგრეთვე იძულებულს ხდის რომ ყოველივე მეთოდს ქონდეს მისი იმპლემენტაცია გარდა იმ შემთხვევაში თუ იგი ვირტუალურია, (იმპლემენტაცია მაინც საჭიროა რომ მეთოდის მოხმარება შეიძლებოდეს).
[[Smalltalk]]-ის ნაირი ობიექტზე-ორიენტირება კი უშვებს მესეჯების გაგზავნას, რაც ანიჭებს დინამიურობას.
მესეჯის გაგზავნის მექანიზმი არ ხდის აუცილებელს რიმ გარკვეული ობიექტი ახწერილი იყოს კომპილირების დროს.
([[ტიპის დინამიკურად მინიჭება|ტიპის დინამიკურად მინიჭების]] შესახემ ქვემოთ იხილეთ ნუთუ რა უპირატესობა მოაქვს მას [[დინამიკური_შერწყმა_(ინფორმატიკა)|დინალიკური შერწმის]] მეშვეობით).
 
უნდა შევნიშნოთ რომ, მესეჯების გარკვევის დროის გამო Objective-Cს მესეჯების გაგზავნა და მიყება მინიმუმ სამჯერ უფრო ნელია ვიდრე C++ის ვირტუალური მეთოდის გამოყენებით.[1]
 
===ინტერფეისები და იმპლემენტაციები===
 
Objective-C აიძულებს პროგრამისტს რონ კლასის ინტერფეისი და იმპლემენტაცია იყოს დაყოფილი კოდის სხვადასხვა ბლოკსი. მიღებული წესის მიხედვით, ინტერფეისი არის დაწერილი თავ ფაილში (header) (გაფართოება .h) და იმპლემენტაცია კი კოდის ფაილში (გაფართოება .m).
 
===ინტერფეისი===
 
უმრავლეს შემთხვევაში, კლასის ინტერფეისი არის ახწერილი თავ ფაილში (header file). მიღებული წესის მიხედვით თავ ფაილის (header file) სახელი არის კლასის სახელი.
ამ შემთხვევაში Class კლასის თავ ფაილის (header file) სახელი იქნება Class.h
 
ინტერფეისის იყებს ასეთ ფორმას:
 
<source code="obj-c">
@interface classname : superclassname {
// instance variables
}
+classMethod1;
+(return_type)classMethod2;
+(return_type)classMethod3:(param1_type)parameter_varName;
-(return_type)instanceMethod1:(param1_type)param1_varName :(param2_type)param2_varName;
-(return_type)instanceMethod2WithParameter:(param1_type)param1_varName andOtherParameter:(param2_type)param2_varName;
@end
</source>
 
ნიშანი "+" ანიშნებს კლასის მეთოდს, "-" კი კლასის ნიმუშის მეთოდს. კლასის მეთოდებს კლასის ნიმუშის ცვლადებთან მიღვწვდომა არა აქვთ.
 
C++ში თუ გადავთარმნით ზემოთ მოცემულ კოდს იგი უდრის:
 
<source code="c++">
class classname : superclassname {
// instance variables
// Class (static) functions
static void* classMethod1();
static return_type classMethod2();
static return_type classMethod3(param1_type parameter_varName);
// Instance (member) functions
return_type instanceMethod1(param1_type param1_varName, param2_type param2_varName);
return_type instanceMethod2WithParameter(param1_type param1_varName, param2_type param2_varName=default);
};
</source>
 
შეამჩნიეთ რომ instanceMethod2WithParameter წარმოადგენს Objective-Cის დასახელებული პარამეტრის (named parameter) (დასახელებული პარამეტრი?) შესაძლებლობას რომელიც არ არსებობს C/C++ში.
 
დაბრუნული ცვლადის ტიპი შესაძლოა იყოს ნებისმიერი C-ს ტიპი, მითითება Objective-Cს ზოგად ობიექტთან, ან მითითება სპეციფიკურ ტიპთან როგორიცაა NSArray *, NSImage *, or NSString *.
ბრუნებრივ შემთხვევაში დაბრუნული ცვლადის ტიპი არის ზოგადი Objective-Cის ტიპი რომელიცაა id.
 
მეთოდის არგუმენტების წინ არის ორი წერტილი (":") და შემდეგ არგუმენტის ტიპი ფრჩხილებში და ბილოს მოდის მეთოდის არგუმენტის სახელი.
ზოგიერთ შემთხვევაში (სისტემური API-ის წერის დროს) პრაქტიკულია ტექსტუალური ახწერის დამატება ყოველივე პარამეტრის წინ.
 
-(void) setRange:(int)start :(int)end;
-(void) importDocumentWithName:(NSString *)name withSpecifiedPreferences:(Preferences *)prefs beforePage:(int)insertPage;
 
 
==აგრეთვე იხილეთ==
მოძიებულია „https://ka.wikipedia.org/wiki/Objective-C“-დან