خبرنامه
 
پست الکترونیکی خود را وارد نمایید
شماره خبر : 847
تاریخ انتشار :
شروع کار با زبان برنامه نویسی شیءگرای C

شروع کار با زبان برنامه نویسی شیءگرای C

با توجه به اینکه چندی پیش مقاله‌ای در رابطه با زبان C در سایت منتشر شد حال بنا به قولی که در مقاله قبل داده شد در این مقاله قصد داریم به معرفی زبان شیءگرای C بپردازیم. در واقع تفاوت اصلی این دو زبان همانطور که از نام آنها هم مشخص است شیءگرا بودن و نبودن است. جایی که زبان شیگرای C در واقع یک زبان برنامه نویسی شیگرا بوده  اما در مقابل زبان C یک زبان برنامه نویسی رویه‌ای است. این بدان معناست که ما ابتدا باید با ساختار شیءها آشنا شده و نحوه ارتباط آنها با کلاس ها را درک کنیم. از دیگر مفاهیم کلیدی که در این مقاله به آنها گریزی خواهیم زد می توان به سه مقوله object messaging، encapsulation(کپسوله سازی)، inheritance(وراثت) اشاره کرد.
ریشه و منشا زبان برنامه نویسی شیگرای C :
رابطهای Cocoa و Objective-C دو جزء کلیدی از پلتفرم iOS شرکت اپل محسوب می شوند. صرف نظر از این واقعیت که پلتفرم iOS از نظر سن و سال نسبتاً جوان است اما از آن طرف زبان شیگرای C که در اوایل دهه 1980 توسط افرادی همچون Brad Cox و Tom Love توسعه داده شد سابقه سنی زیادی را یدک می کشد. قرار بود از ابتدا این زبان به گونه ای توسعه داده شود که ترکیبی از زبان قدرتمند و سریع الاجرای C را با زبان Smalltalk فراهم کند. همانطور که در مقاله قبلی بدان اشاره شد زبان شیگرای C در واقع یک مجموعه ضمنی بزرگ از زبان C بوده که از نظر سطح بندی نیز در مقایسه با زبان C جزء زبان های سطح بالا قرار گرفته است. باز هم می گویم تفاوت اصلی زبان C و زبان شیگرای C  این است که اولی یک زبان برنامه نویسی رویه‌ای بوده و دومی همانطور که از نام آن مشخص است یک زبان برنامه نویسی شیگرا است.
حال به نظر شما چطور یک زبانی که حدود 35 سال پیش توسعه یافته اکنون توسط پلتفرم شرکت اپل، یعنی iOS مورد استفاده قرار می گیرد. واقعیت این است که مدتی کوتاه بعد از اینکه شرکت NeXT توسط استیوجابز فقید بنیان گذاری شد، پروانه بهره برداری از این زبان توسط همین شرکت خریداری شد. این شرکت همان موقع، رابط کاربری NeXTSTEP را برای سیستم عامل NeXT که تحت زبان شیگرای C طراحی شد تولید کرد. حتی با این وجود که NeXTSTEP یک انقلابی در عرصه ارائه ابزارهای قدرتمند ایجاد کرد، اما با این حال سیستم عامل NeXT تنها توانست از یک بخش کوچک بازار فناوری های موبایلی بهره ببرد. سال 1996 بود که شرکت اپل NeXT را به چنگ آورد و مجموعه ابزارهای ساخته شده NeXTSTEP نیز از آن به بعد تحت نام Cocoa شناخته شد. سیستم عامل NeXT بعد از اینکه در اختیار شرکت اپل افتاد با انتشار سیستم عامل iOS و پلتفرم iPhone راه خود را پیدا کرد. دومین مورد یعنی Cocoa نیز با معرفی سیستم عامل OS X در ماه مارس سال 2001 مسیر اصلی خود را هموار کرد.

برنامه نویسی شیگرا :
در برنامه نویسی رویه‌ای، یک برنامه متشکل از یک سری روالها یا روتین ها بوده که به ترتیب اجرا شده تا به وضعیت مشخص و نهایی برسند. از آن طرف اما در برنامه نویسی شیگرا، در واقع این مجموعه ای از اشیاء هستند که با یکدیگر ارتباط برقرار کرده تا وظیفه مشخصی را انجام دهند. ولو اینکه نتیجه نهایی نیز می تواند در هر دو نوع یکسان باشد اما نحوه کدنویسی و ساختار هر یک از آنها کاملاً با یکدیگر متفاوت است. در حقیقت ویژگی هایی همچون پیمانه ای بودن(Modularity) و قابلیت استفاده مجدد از کد(code reusability) دو ویژگی اصلی زبان های برنامه نویسی شیگرا بوده که در ادامه این مقاله بیشتر با آنها آشنا می شویم. با ما همراه باشید.
Objective-C, Cocoa (OS X), Cocoa Touch :
توسعه دهندگانی که تازه وارد چرخه کار با پلتفرم های iOS و OS X شده اند ممکن است ابتدا در درک روابط بین آنها دچار مشکل شوند. مثلاً شاید با خود بگویند که Cocoa Touch چیست و چه ارتباطی با زبان شیگرای C دارد؟. Cocoa در واقع یک زبان برنامه نویسی کاربردی یا همان API بومی شرکت اپل است که برای استفاده تحت پلتفرم های OS X و iOS مورد استفاده قرار می گیرد. از آن طرف زبان شیگرای C نیز با قدرت خود، به بهره وری بیشتر Cocoa کمک می کند. همانطور که از عنوان مقاله مشخص است ما در این مقاله به معرفی زبان شیگرای C می پردازیم اما از آنجایی که رابط های Cocoa  و Cocoa Touchنیز ارتباط تنگاتنگی به هنگام استفاده تحت پلتفرم های اپل دارند در مقالات آتی به معرفی بیشتر آنها نیز خواهیم پرداخت.
کلاسها،اشیاء و نمونه ها(Classes,Objects,Instances) :
یک مسئله دیگری که به احتمال زیاد برای توسعه دهندگان تحت یک زبان برنامه نویسی شیگرا ممکن است پیش آید در واقع تمایز و تشخیص تفاوت بین کلاسها،اشیاء و نمونه ها است. یک کلاس در واقع یک الگو برای ایجاد اشیاء است در حالی که نمونه ها، رویدادهای یکتایی از یک کلاس هستند. یک شیءدر واقع یک ساختار داده است که دارای وضعیت و رفتار است.
برای درک بهتر روابط و تفاوت های این سه مورد اجازه دهید مثالی بزنیم. دستگاه های خانگی نان برشته کن را در ذهن خود تصور کنید(toaster). قبل از اینکه یک toaster ساخته شود، مهندسینی یک طرح چاپی که معادل یک کلاس هست را برای شروع ساخت toaster طراحی می کنند. حال هر toaster که تحت نقشه آن blueprint ساخته شود یک نمونه یا یک رویداد یکتای کلاس محسوب می شود. حتی با این وجود که هر Toaster از یک طرح چاپی(Blueprint) ساخته می شود(class) اما هر کدام از خصوصیات متفاوتی همچون رنگ، تعداد شکاف نان و صد البته از رفتار متفاوتی برخوردار هستند.
متغیرهای نمونه و کپسوله سازی (encapsulation and instance variables ) :
وضعیت یک نمونه ذخیرده شده، توسط متغیرهای نمونه و دیگر صفات شی مد نظر شما تعریف می گردد.
این حالت ما را به الگوی کلیدی دیگر زبان شیگرای C یعنی کپسوله سازی سوق می دهد. در واقع کپسوله سازی به این معناست که نمایندگی داخلی یک شی موجود خصوصی بوده و تنها توسط خود شیء شناسایی و قابل استفاده است. شاید این حالت در نگاه اول یک محدودیت سخت گیرانه تلقی شود اما به هر حال نتیجه حاصله سبب ماژولار بودن کد خواهد شد.
حال اجازه دهید تا مبحث کپسوله سازی را با ذکر یک مثال بیشتر باز کنیم. سرعت ماشین در واقع با اجزای داخلی آن مشخص می شود حال آنکه راننده، سرعت ماشین را با یک نگاه به سرعت شمار خواهد فهمید. همانطور که مشخص است راننده برای آگاهی از سرعت ماشین در حال حرکت خود نیاز به درک و درگیری با اجزای داخلی ماشین خود ندارد همچنین راننده ماشین نیازی به درک نحوه کارکرد اجزای ماشین همچون موتور داخلی آن برای رانندگی و هدایت خودرو ندارد. در واقع جزییات در رابطه با اینکه اجزای داخلی ماشین چطور با یک دیگر ارتباط برقرار می کنند از دید راننده پنهان است. در واقع وضعیت و رفتار درونی اجزای ماشین از دید راننده پنهان بوده و تنها از طریق رابطهای ظاهری ماشین از جمله چرخ های آن، پدال ترمز و داشبورد قابل رویت خواهد بود.
وراثت :
دیگر ویژگی قدرتمند زبان برنامه نویسی شیگرا، بخش وراثت کلاس های آن است. به عنوان مثال زمانی که کلاس A زیر مجموعه کلاس B قرار داشته باشد، نتیجه حاصله این خواهد بود که کلاس A رفتار و مشخصات کلاس B را به ارث می برد. در چنین مواقعی گفته می شود که کلاس B به عنوان کلاس پدر یا  Superclass کلاس A محسوب می شود. یکی دیگر از مزایای وراثت این است که سبب ماژولاریتی کد و استفاده مجدد از کدهای نوشته شده به منظور جلوگیری از تکرار مکررات خواهد شد.
متدها و خصوصیات :
متدها در واقع زیرروال های وابسته به کلاس هستند که رفتار و متغیرهای نمونه کلاس را تعریف می کنند. متدهای یک کلاس قادر به دسترسی اجزای داخلی یک نمونه را داشته و از این طریق می توان تغییرات مورد نظر را به نمونه اعمال کنند. به عبارت دیگر وضعیت یک نمونه(برای مثال متغیرهای نمونه) توسط متدهای یک نمونه تحت کنترل هستند.
به علت الگوی کپسوله سازی، متغیرهای نمونه از یک نمونه کلاس، نمی توانند به صورت آزادانه مورد دسترسی قرار بگیرند. در عوض می توان از طریق متدهای getter و setter به آنها دسترسی پیدا کرد. در حقیقت خصوصیات جز ویژگی اصلی زبان شی گرای C هستند که همین امر سبب می شود فرایند ایجاد متدهای getter و setter ناچیز شمرده شوند.
صرف نظر از مفید بودن متدهای getter و setter، اما به طور کلی پروسه نوشتن مکرر این متدها برای هر متغیر نمونه بسیار خسته کننده است. در ادامه این مقاله توضیحات بیشتری را در این بابت خدمت شما خواهیم داد. اما فعلاً خصوصیات را به عنوان یک لفافه که دور متغیرهای نمونه پیچیده شده اند تا کار با متغیرهای نمونه را با استفاده از متدهای getter و setter آسان کنند تصور کنید. با ما همراه باشید.
ادامه فرایند آموزش با استفاده از مثال :
حال اجازه دهید تا آموخته های تئوری خود را در قالب یک پروژه در معرض امتحان قرار دهیم. ابتدا یک پروژه جدید را در رابط کاربری Xcode ایجاد کنید.
یادآوری : برای ایجاد پروژه جدید از منوی File، مسیر New > Project را برگزینید.

همانطور که در مقاله پیشین عمل کردیم از بین گزینه هایی که با انتخاب گزینه Appliaction در سمت راست نمایان می شود گزینه Command Line Tool را انتخاب کرده و در نهایت روی گزینه Next در پایین کادر محاوره ای کلیک کنید. مقدار فیلد مقابل عبارت Product Name را Books تنظیم کرده و برای فیلدهای organization name و company identifier نیز مقداری را تعیین کنید. برای پروژه حال حاضر مهم است که نوع پروژه را تحت گزینه Foundation تنظیم کنید. دلیل این انتخاب در ادامه این مقاله مشخص خواهد شد. در کادر بعدی که نمایان می شود مسیر ذخیره پروژه را به دلخواه تنظیم کنید و در آخر روی دکمه Create کلیک کنید. شاید تا العان متوجه تفاوت بین این پروژه و پروژه ای که پیشتر در مقاله قبلی ایجاد کردیم شده باشید. حال اجازه دهید تا تفاوت های این دو پروژه را مشخص کنیم. با ما همرا باشید.

مقدار فیلد مقابل عبارت Product Name را Books تنظیم کرده و برای فیلدهای organization name و company identifier نیز مقداری را تعیین کنید. برای پروژه حال حاضر مهم است که نوع پروژه را تحت گزینه Foundation تنظیم کنید. دلیل این انتخاب در ادامه این مقاله مشخص خواهد شد.

در کادر بعدی که نمایان می شود مسیر ذخیره پروژه را به دلخواه تنظیم کنید و در آخر روی دکمه Create کلیک کنید. شاید تا العان متوجه تفاوت بین این پروژه و پروژه ای که پیشتر در مقاله قبلی ایجاد کردیم شده باشید. حال اجازه دهید تا تفاوت های این دو پروژه را مشخص کنیم. با ما همرا باشید.

مروری بر پروژه :
پروژه حال حاضر از نظر تعداد فایل ها و پوشه، کمی بزرگتر از ابزار خط فرمانی است که در مقاله قبلی ایجاد کردیم. علاوه بر دو فایل main.m و Books.1 دو پوشه با نامهای Supporting Files و Frameworks در ساختار پروژه وجود داشته که هر یک شامل یک آیتم نیز هستند.
پوشه Supporting Files دربردارنده یک فایل با نام و پسوند Books-Prefix.pch بوده که پسوند آن نشان می دهد که این یک فایل از پیش کامپیایل شده هدر یا precompiled header file است. در مقالات بعدی اطلاعات بیشتری را راجع به این فایل ها در اختیارتان قرار خواهیم داد.
همچنین پوشه Frameworks نیز شامل فریمورک هایی است که پروژه فعلی به آنها متصل شده است. حال این فریمورک چیست؟ در واقع یک فریمورک یک باندل یا یک پوشه بوده که شامل کتابخانه ای از منابع، همچون تصاویر و فایل های هدر است. در ادامه کار مفهوم یک فایل هدر برای شما روشن تر خواهد شد. پوشه Frameworks در حال حاضر شامل یک آیتم با نام Foundation.framework برای مدیریت کارهای اصلی پیشفرض است. به هنگام ایجاد پروژه، زمانی که نوع پروژه را تحت گزینه Foundation تنظیم کنید در واقع اعلام کردید که پروژه به فریمورک Foundation پیوند داده شود. فریمورک Foundation در حقیقت شامل یک سری از کلاس های پایه زبان شیگرای C است. در مقالاتی که در آینده منتشر خواهیم کرد نگاه دقیقتری به فریمورک  Foundation خواهیم داشت پس تا آن زمان با ما همراه باشید.
ایجاد یک کلاس :
حال با توضیحات گفته شده، وقت آن رسیده است که به صورت عملی اولین کلاس خود را ایجاد کنیم. هر زمان که شما قصد ایجاد یک فایل جدید را از طریق الگوی (File > New > File...) دارید با لیستی از الگوهای از پیش تعریف شده روبرو خواهید شد. از طریق لیست سمت چپ و در زیرگزینه های OS X، گزینه Cocoa را انتخاب کرده، و از بین گزینه هایی که در سمت راست کادر نمایان می شوند گزینه Objective-C class را برگزینید. در نهایت هم روی گزینه Next که در پایین کادر نمایان شده، کلیک کنید.

حال همانطور که در تصویر زیر مشخص شده، مقدار فیلد مقابل Class را Book تنظیم کرده و نام زیرکلاس آن را نیز NSObject قرار دهید. همانطور که پیش از این دیدیم، با ایجاد کلاس جدید تحت زیر کلاس NSObject، در واقع به کلاس جدید اعلام می کنیم که از خصوصیات و رفتار NSObject ارث بری کند. به طور کلی این بدان معناست که کلاس جدید، برخی عملیات را به صورت آزادانه می تواند انجام دهد.

بعد از انجام فرایند گفته شده روی گزینه Next کلیک کنید. سپس در کادر بعدی‌ای که نمایان می شود محل ذخیره کلاس جدید خود را مشخص کنید. حتماً دقت داشته باشید که کلاس جدید را باید در لابه لای پروژه Xcode خود ذخیره کنید.
شاید تا العان متوجه شده باشید که که Xcode دو فایل جدید با نام و پسوندهای Book.h و Book.m ایجاد کرده است. فایل Book.h در واقع یک فایل هدر تحت کلاس Book بوده که همانطور که پیشتر دیدیم موجب نمایان شدن رابط کلاس می شود. یک رابط کلاس شامل خصوصیات و متدهای کلاس بوده و همچنین کلاس پدر یک کلاس را مشخص می کند. از آن طرف فایل Book.m نیز یک فایل پیاده سازی کلاس بوده که رفتارش را با به کارگیری متدهای اعلان شده در داخل فایل هدر کلاس تعریف می کند.
فایل هدر :
اکنون فایل هدر Book.h را باز کرده و محتویات آن را بررسی کنید. جدای برخی توضیحات کمکی در بالای فایل، این فایل هدر تنها شامل سه خط کد است. اولین خط، فایل هدر تحت فریمورک Foundation را بارگزاری می کند. این فرایند ما را مطمئن می کند که کلاس Book به کلاس ها و پروتکل های اعلان شده تحت فریمورک Foundation دسترسی دارد.


#import <Foundation/Foundation.h>

و اما خط دوم و سوم یک زوج را تشکیل می دهند. در زبان شیگرای C، هر رابط کلاس با الگوی ثابت @interface شروع و در نهایت با الگوی @end پایان می پذیرد. این دو دستور هر دو از دستورالعمل های کامپایلر محسوب می شوند.
دستور @interface که به دنبال آن نام کلاس و سپس کلن(علامت دو نقطه) و در نهایت کلاس پدر آورده شده، یک نمونه کامل و بی عیب و نقص را نشان می دهد. همانطور که پیشتر دیدیم کلاس پدر، در واقع کلاسی است که دیگر کلاس ها از آن صفات و رفتار را به ارث می برند.


@interface Book : NSObject
@end

کلاس NSObject در واقع یک کلاس ریشه برای اکثریت کلاس های زبان برنامه نویسی شیگرای C می باشد. دو حرف اول این کلاس یعنی NS به ریشه بودن آن(NeXTSTEP)اطلاق می شود. با ارث بری از کلاس NSObject، کلاس ها رفتاری به مانند کلاس های زبان شیگرای C داشته و یک رابط پایه را برای یک سیستم زمان اجرا به ارث خواهند برد.
فایل پیاده سازی :
پیش از اینکه ما تغییرات مد نظر خود را تحت کلاس Book اعمال کنیم، اجازه دهید تا یک نیم نگاهی سریع به فایل پیاده سازی کلاس یعنی Book.m داشته باشیم. با ما همراه باشید.
در حقیقت به جای بارگذاری فریمورک Foundation، فایل پیاده سازی، فایل هدر متعلق به کلاس Book را بارگزاری می کند. حال چرا این امر ضروری است؟ در واقع فایل پیاده سازی لازم است از خصوصیات و متدهایی که در فایل هدر اعلان شده پیش از آنکه بتواند رفتار کلاس را پیاده سازی کند مطلع شود. دستور بارگزاری‌ای که با پیاده سازی کلاس همراه شده توسط دو الگوی دستوری @implementation و @end مشخص شده اند.
اضافه کردن متدها و خصوصیات :
کلاس در حالت پیاده سازی فعلی خود خیلی کارایی آنجنانی ندارد. هم اکنون به سراغ فایل هدر رفته و سه خصوصیت با نام های year, title و author و همچنین یک متد با نام bookInfo را اضافه کنید.
خواص، همراه با لغت کلیدی @property اعلان شده اند. ناگفته نماند که می توان این خواص را در هر جایی در بلوک @interface متعلق به کلاس اعلان کرد. لغت کلیدی @property همراه با نوع و نام مشخص آورده شده است. دقت داشته باشید که نماد * حتماً باید در جلوی خواص title و author قرار بگیرد چرا که یک شیء Cocoa همیشه به عنوان یک اشاره گر مورد ارجاء قرار می گیرد.


#import <Foundation/Foundation.h>
 
@interface Book : NSObject
 
@property int year;
@property NSString *title;
@property NSString *author;
 
- (NSString *)bookInfo;
 
@end

اعلان متد، کمی حس و کارایی نمونه اولیه یک تابع را القاء می کند اما تفاوت های کلیدی نیز در این بین وجود دارد. اعلان متد با یک علامت منها(minus)شروع شده که مشخص می کند این متد، یک متد نمونه است. متدهای کلاس با یک علامت به اضافه(plus) پیش از آنها مشخص شده اند. بعد از علامت منها نیز در داخل پرانتز نوع برگشتی متد نیز یک نمونه NSString تعیین شده و در نهایت نیز نام متد نوشته شده است. اعلان متد هم با یک علامت سمی کلن پایان یافته است. قویاً مطمئنم که در ابتدا شاید تعجب کنید که اصلاً NSString چه چیزی هست و چرا نیاز هست تا به عنوان یک اشاره گر مورد ارجاء قرار بگیرد. کلاس NSString در واقع یک عضو از فریمورک Foundation تلقی می شود.  این کلاس رابطی را برای یک شی اعلان کرده که موجب مدیریت یک رشته ثابت می شود. در مقاله پیشین، ما دیدیم که یک رشته در زبان C می تواند توسط آرایه ای از کاراکترها تشکیل شود و این دقیقاً همان چیزی است که کلاس NSString انجام می دهد. در واقع این کلاس آرایه ای از کاراکترها را به صورتی غیر آشکار مدیریت می کند. ویژگی و مزیت استفاده از کلاس NSString این است که سبب می شود کار با رشته ها بسیار آسانتر شود.

حال که ما متد bookInfo را در فایل هدر کلاس اعلان کرده ایم وقت آن رسیده تا آن را تحت فایل پیاده سازی کلاس به کار بگیریم. برای این منظور ابتدا فایل Book.m را باز کرده و تکه کد زیر را جایی در لابه لای کدهای @implementation اضافه کنید. پیش از اینکه ما فرایند پیاده سازی bookInfo را به چند بخش تقسیم کنیم لازم است ابتدا در مورد object messaging اطلاعات کافی را کسب کنیم.


- (NSString *)bookInfo {
    NSString *bookInfo = [NSString stringWithFormat:@"%@ was written by %@ and published in %i", self.title, self.author, self.year];
    return bookInfo;
}
 

پیغام رسانی اشیاء(object messaging):
ما پیش از این می دانستیم که رفتار یک کلاس توسط متدهای آن تعریف می شود. به منظور فراخوانی یک متد تحت یک شیء، یک پیغام به شی ارسال می شود. حال برای درک بیشتر قضیه تکه کد زیر را مورد بررسی قرار دهید. اجازه دهید تا کل کد را به صورت خط به خط مورد تجزیه و تحلیل قرار دهیم.در خط اول ما یک رشته جدید را تعریف می کنیم و سپس یک مقدار ثابت رشته ای را با قرار دادن آن در دابل کوتیشین و نهادن پیشوند @ در ابتدا به آن اضافه می کنیم.


NSString *string = @"This is a string of characters.";
int length = [string length];
NSLog(@"The length of the string is %i.\n" length);

 

در خط دوم، ما یک پیغام طول را به نمونه رشته ارسال می کنیم. به عبارت دیگر ما متد length را تحت نمونه رشته فراخوانی کرده و متد نیز یک مقدار عددی را برمی گرداند. این مقدار عددی در یک متغیر دیگر از نوع عددی ذخیره می شود. در آخرین خط ما مقدار متغیر طول(length) را با استفاده از فراخوانی تابع NSLog به مانند مقاله پیشین، تحت محیط کنسول نرم افزار نمایش می دهیم.
ارسال پیغام به اشیاء، امری است که در ادامه کار به وفور مجبور به استفاده از آن خواهید شد پس در همین ابتدا مهم است که نحوه نوشتن آن را درک کنید. با این وجود که نحوه نوشتن ان کمی عجیب به نظر می رسد اما در صورتی که حتی یک برنامه نویس جدید از نوع شیگرا باشید، درک ساختار به آن سختی ها هم نیست. همانطور که از کد زیر مشخص است، بین براکت ها در ابتدا نام یک شیء قرار گرفته و به دنبال آن نیز یک پیغام یا نام متد آمده است.
[object message]
متدهایی که آرگومان می پذیرند کمی متفاوت‌تر به نظر می رسند اما نحوه نوشتن آنها به طور کلی یکسان است. به عنوان مثال، کلاس NSString از متد دیگری با نام substringFromIndex: برخوردار است. علامت دو نقطه در انتهای نام مشخص می کند که این متد یک آرگومان می پذیرد. فرخوانی یک متد تحت یک رشته به مانند زیر انجام می شود :


NSString *substring = [string substringFromIndex:5];

 

یکی از ویژگی هایی که زبان شیگرای C، همیشه به همراه خود داشته است نام گذاری های دراز و طویل متدهای آن است. حال به مثال زیر که شامل یک نام متد همراه با چندین آرگومان است دقت کنید. شما باید بپذیرید که در واقع نام یک متد چیزی هست یا چیزی باید باشد که در واقع آن متد قصد انجام آن را دارد. در واقع نام متد به چند تکه تقسیم بندی می شود که هر یک از این تکه ها، یک آرگومان را می پذیرند.


NSString *anotherString = [string stringByPaddingToLength:5 withString:@"some string" startingAtIndex:2];

 

قبل از ادامه کار، لازم است تا دوباره نگاهی به پیاده سازی bookInfo داشته باشیم. در واقع پیاده سازی متد با تکرار اعلان متد شروع می شود. سمی کلنی که در انتها آمده نیز با یک جفت کمان مجعر جایگزین شده تا حول پیاده سازی متد را بپوشاند. ما ابتدا یک رشته جدید به نام bookInfo را تعریف، و مقدار آن را یک رشته جدید، که ترکیبی از صفات نمونه های کتاب در اینجا،title, author و year است قرار می دهیم. در پایان متد bookInfo، نیز ما رشته جدید bookInfo را برمی گردانیم. چرا که این همان چیزی است که متد انتظار آن را دارد، یک رشته به عنوان نوع برگشتی.
در این حالت سه مورد به کمی شفاف سازی نیاز دارند. اول متد stringWithFormat: که در واقع یک متد کلاس بوده نه یک متد نمونه. البته ما این را با کمی دقت متوجه می شویم چرا که این متد روی خود کلاس NSString فراخوانی شده، نه روی یک نمونه از کلاس. ناگفته نماند که به کارگیری متدهای کلاس در زبان های برنامه نویسی شیگرا امری متداول هستند. دوم format specifier یا مشخص کننده فرمت، برای یکی شیء توسط نماد @(آمپرسند) مشخص شده است. هر دوی title و author در مثال ما شیهای رشته ای هستند که باید به اندازه کافی مورد توجه قرار بگیرند. و اما لغت کلیدی self که همیشه به عنوان نمونه کلاس مورد ارجاء قرار می گیرد. در این مثال نیز لغت self به نمونه Bookای اشاره می کند که متد bookInfo به آن تعلق دارد.
دسترسرها مجدداً بازدید شده اند :
اگر با دیگر زبان های برنامه نویسی شیگرا کار کرده باشید می دانید که دسترسی به متغیرهای نمونه در زبان شیگرای C ممکن است گیج کننده به نظر برسد. در واقع ما به طور مستقیم به هنگام نوشتن self.title به متغیر نمونه دسترسی پیدا نمی کنیم. در حقیقت این چیزی بیشتر از یک راه میانبر برای [self title] نیست. این بدان معناست که ما از متد getter استفاده کرده تا از نمونه برای متغیر نمونه ای با نام title درخواست کنیم. این حالت برای تنظیم یک متغیر نمونه هم یکسان است. حال نگاهی به تکه کد زیر داشته باشید. همانطور که می توانید ببینید استفاده از self.title چیزی بیشتر از به کارگیری یک ترکیب دلخواه نیست.


// This assignment ...
self.title = @"The Hobbit";
// ... is equivalent to ...
[self setTitle:@"The Hobbit"];
Id :

 

قبل از شروع کار با کلاس Book، در همین جا قصد داریم تا کمی در رابطه با چند لغت کلیدی که ممکن است برخی افراد آنها را با هم قاطی کنند صحبت کنیم. در واقع هر زمان که شما قصد دارید یک شیء را بدون اعلان صریح نوع آن، ذخیره کنید شما در واقع از نوع id استفاده می کنید. این نوع داده، همچنین به عنوان نوع پیشفرض برای اعلان های آرگومان و برگشتی تحت متدهای زبان شیگرای C مورد استفاده قرار می گیرد.
قدرت و کاربرد نوع داده id حتی فراتر از این هاست. نوع داده id یک جزء کلیدی از نوع دهی پویای زبان شیگرای C و اتصال منعطف آن است. بسیار مهم است که بدانید که نوع داده id با اینکه خود در زمره اشیاء محسوب می شود لیکن هیچ اطلاعاتی را راجع به خود شیء نگه نمی دارد.
در زبان شیگرای C، هر شی از طریق متغیر isa می داند که به کدام کلاس تعلق دارد. و این یک وضعیت بحرانی را ایجاد می کند. حال چرا این حالت وجود دارد؟ در واقع یکی از ویژگی های قدرتمند این زبان، نوع دهی منعطف آن است. به این معنا که عمل بررسی و بازرسی نوع به جای انجام در زمان کامپیال، در زمان اجرا انجام می شود. به هر حال چون نوع داده id هیچ اطلاعاتی را راجع به کلاسی که شی به آن تعلق دارد به کامپیالر نمی دهد، شیء به صورت خودجوش لازم است تا این اطلاعات را برای کامپایلر فراهم کند.


اتصال پویا :
یکی دیگر از اجزای حیاتی زبان شیگرای C در زمان اجرا، پویا بودن اتصال آن است. در زبان برنامه نویسی شیگرای C تفاوت مهمی بین پیغام ها و توابع وجود دارد. در واقع یک پیغام و دریافت شیء تا زمان اجرا به یکدیگر متصل نمی شوند.
حال این قضیه به چه معناست و چرا این حالت مهم است؟ در واقع این حالت بدان معناست که متد در واکنش به یک پیغام ارسال شده، به یک شی فراخوانی شده و آن متد زمانی که هر دو پیغام و شیء در زمان اجرا شناسایی شوند تعیین می شود. این حالت در واقعی چیزی است که از آن به عنوان اتصال پویا نام برده می شود.
Nil و NULL :
در زبان شیگرای C، لغت کلیدی nil به عنوان یک شی null تعریف شده است. این شی با یک id تحت مقدار 0 تنظیم شده است.  از نقطه نظر غیرتئوری، هیچ تفاوتی بین سه لغت کلیدی nil, Nil و NULL وجود ندارد. یعنی این امکان وجود دارد تا پیغام ها را به هر یک از این سه لغت کلیدی بدون وقوع هیچ گونه خطایی ارسال کرد. قائده کلی ای که وجود دارد این است که از nill برای اشیاء، از Nil برای کلاس ها و از NULL نیز برای باقی موارد استفاده شود. اینکه بتوانیم از این سه لغت کلیدی برای ارسال پیغام ها استفاده کرد مزیت هایی دارد. اما همچنین باید در نظر داشت که این حالت عاری از عیب هم نیست.
ایجاد اشیاء :
ابتدا فایل main.m را باز کرده و یک دستور دریافت یا همان import statement را به آن اضافه کرده تا فایل هدر متعلق به کلاس Book را بارگذاری کند. به جای استفاده از براکت های زاویه دار، ما از دابل کوتیشن به منظور دریافت فایل هدر کلاس Book استفاده می کنیم. دابل کوتیشن تحت فایل های محلی مورد استفاده قرار می گیرد در حالی که از براکت های زاویه دار برای include های عمومی با استفاده از مسیر include متعلق به پروژه مورد استفاده قرار می گیرد.


#import <Foundation/Foundation.h>
#import "Book.h"


حال فوراً زیر فراخوانی NSLog، تکه کد زیر را اضافه کنید تا یک نمونه از کلاس Book ایجاد شود :

Book *book1 = [[Book alloc] init];
book1.title = @"The Hobbit";
book1.author = @"JRR Tolkien";
book1.year = 1937;

در خط اول، ما یک متغیر از نوع Book تعریف کرده و مقداردهی اولیه می کنیم. این مثال را می توان به عنوان یک راهنمای مفید به منظور شرح عملکرد فراخوانی های تودرتوی متد در نظر گرفت. اولین متد فراخوانی شده تحت کلاس Book، alloc در نظر گرفته شده است. البته جزییات این فراخوانی مهم نیست. اما به طور کلی بدانید که حافظه ای برای این شی و شی جدید اختصاص یافته است.
به علت تودر تو بودن فراخوانی ها، متد init روی شی جدیدی فراخوانی شده که توسط متد alloc ایجاد شده است.
متد init، شی جدید را ایجاد، مقداردهی و در نهایت آن را برای استفاده آماده می کند. در واقع متد init نمونه را برگردانده و در این مثال آن را به متغیر book1 نسبت می دهد.
هویت سه خط بعدی از مجموعه کدهای بالا نیز باید برایتان مشخص باشد. در واقع این سه خط به ترتیب به منظور تعیین عنوان کتاب، نام نویسنده و سال انتشار این کتاب جدید مورد استفاده قرار می گیرد.
حال اجازه دهید تا یک کتاب دیگر ایجاد کرده و مجموعاً دو کتاب را به یک آرایه از زبان شی گرای C اضافه کنیم. تنها تفاوتی که وجود دارد این است که ما استفاده از متدهای setter کلاس را به منظور تنظیم متغیرهای نمونه متعلق به نمونه جدید صریحاً ذکر کرده ایم.


Book *book2 = [[Book alloc] init];
[book2 setTitle:@"The Fellowship of the Ring"];
[book2 setAuthor:@"JRR Tolkien"];
[book2 setYear:1954];
 
NSArray *books = [[NSArray alloc] initWithObjects:book1, book2, nil];

در خط آخر نیز ما یک نمونه دیگر از NSArray به عنوان کلاس جداگانه تحت فریم ورک Foundation  ایجاد می کنیم. در واقع کلاس NSArray یک آرایه بوده که توانایی ذخیره یک لیست مرتب از شی ها را دارد. درست همانطور که ما با نمونه های کتاب رفتار کردیم، در اینجا نیز حافظه‌ای را اختصاص داده و آرایه جدید را معرفی و مقداردهی می کنیم.
به هر حال به جای فراخوانی init ما دو دستور initWithObjects:. initWithObjects: را فراخوانی می کنیم. این بدان معناست که متد init با چند ویژگی اضافه همراه شده که در نهایت، تعریف و مقدار دهیه اولیه شیء را آسان می کند.
دستور initWithObjects: می تواند هر تعداد شیءی که شما دوست داشته باشید را در آرایه ذخیره کند. لیست شیءها همیشه باید با nill خاتمه یابند.
ترکیب زبان برنامه نویسی C و نوع شیگرای آن :
اگر خوب مقاله را خوانده باشید من پیش از این چندین بار گفتم که در واقع زبان شیگرای C، تنها به عنوان یک مجموعه ضمنی بزرگتر نسبت به زبان C قرار دارد و ما می توانیم به صورت آزادانه هر دو زبان را با هم ترکیب کنیم. حال اجازه دهید تا نگاه دقیتری به قضیه داشته باشیم. ما کارمون را با استفاده از یک دستور ساده if/else شروع می کنیم تا ببینیم که آرایه مد نظر، از شیءی برخوردار هست یا خیر. با ارسال یک پیغام به آرایه تحت متغیر Count، تعداد اشیاء موجود در داخل آرایه را خواهیم فهمید. اگر آرایه شامل اشیائی باشد ما از یک حلقه for برای تکرار بر روی اشیاء موجود در آرایه استفاده می کنیم. در طی هر بار عمل تکرار، ما از آرایه درخواست شیءی با اندیس i را کرده و سپس یک شیء، یک نمونه از کلاس Book و یک پیغام از bookinfo را ارسال می کنیم. همانطور که پیشتر دیدیم bookinfo یک نمونه از NSString برگشت داده و ما نیز آن را تحت رابط کنسول نمایش می دهیم.


if ([books count] > 0) {
    for (int i = 0; i < [books count]; i++) {
        Book *aBook = [books objectAtIndex:i];
        NSLog(@"%@", [aBook bookInfo]);
    }
}

نتیجه گیری :
با وجود اینکه توضیحات زیادی در رابطه با زبان شیءگرای C داده شد اما با توجه به اینکه هنوز کار خاصی در عمل نکرده ایم یقین دارم که هنوز کمی در درک و استفاده از این زبان مشوش هستید. البته جای نگرانی نیست چون هنوز در ابتدای کار هستید و با توجه به کمی پیچیده بودن آن، این حالت امری طبیعی است.
اطلاعات و مهارت های این زبان بیشتر از چیزی است که در این مقاله به آنها اشاره شد. اما به هر حال شما با دانستن مفاهیم اولیه این زبان باید آمادگی کار تحت بستر iOS SDK را پیدا کرده باشید. در مقاله بعدی ما تمرکز خود را بر روی iOS SDK گذاشته و اجزای مختلف آن را مورد بررسی قرار خواهیم داد. امیدوارم این آموزش مورد پسندتان واقع شده باشد.
نویسنده:هادی نجار

منبع:code.tutsplus.com

تعداد بازدید : 946

نظرات
ناشناس
با c# هم میشه توی اپل برنامه نوشت؟
ارسال نظر

سوال امنیتی : مجموع دو عدد 5 و 8 =