خوب توی این قسمت قراره ببینیم اکثر زبان های برنامه نویسی که شئ گرایی را ساپورت می کنند چطور راه حلی برای پیاده سازی این ایده (ایده شئ گرایی) پیدا کردند و اساسا در این زبان ها چطور می توان یک شئ جدید را تعریف و ایجاد کرد.
زبان های مختلف راه های مختلفی برای پیاده سازی ایده شئ گرایی در پیش گرفتند ولی اکثر زبان های پرطرفداری که شئ گرایی را ساپورت می کنند در زمان نوشتن این متن از چیزی استفاده می کنند به اسم class. حالا برای اینکه دقیقا بفهمیم که این class چه چیزی هست باید ببینیم معنی class در زبان انگلیسی چیست:
معنی class: طبقه، نوع، رده، دسته، گروه، گونه.
بنابر این با توجه به معانی بالا ما کلمه class را در برنامه نویسی نه به معنای کلاس درس(!) که به عنوان کلمه ای برای مشخص کردن یک گونه از اشیا استفاده می کنیم.برای اینکه دقیق تر بشوم مثالی می زنم:
فرض کنید می خواهید ساختمانی درست کنید، اکثر افراد قبل از ساختن یک ساختمان روی نقشه ای طرحی که برای آن ساختمان در نظر دارند رو می کشند و بعد بر اساس آن طرح کلی ساختمان را می سازند.
پس یک کلاس طرح کلی یک گروه از اشیا هست همانطور که شما نمی توانید با طرح یک ماشین رانندگی کنید یا توی نقشه یک ساختمان زندگی کنید از class هم نمی توانید به عنوان یک شئ از آن گروه استفاده کنید اما همانطور که از نقشه و طرح کلی برای ساختن یک ساختمان یا ماشین جدید استفاده می شود می توانید از کلاس برای ساختن یک شئ جدید استفاده کنید.
همانطور که یک طرح یک ماشین را می کشیم و بعد می توانیم از روی آن هزاران نسخه از آن ماشین را تولید کنیم (به شرط داشتن منابع کافی)، کلاس را یک بار تعریف می کنیم و بعد هر چند بار که خواستیم از روی آن شئ جدید مربوط به آن کلاس را می سازیم.
پس تا اینجا می توانیم بفهمیم که یک کلاس قطعا یک اسم دارد (اسمی که به ما می گوید چه دسته ای را توصیف می کند) مثلا: ماشین، سیب.
و بنابر تعریف شئ که قبلا داشتیم باید ویژگی ها و احتمالا رفتارهایی داشته باشد.
ویژگی ها یعنی اینکه شئ ما چه داده هایی را درون خود دارد که وضعیت کنونیش را توصیف می کند مثل: رنگ، ارتفاع، حجم.
و رفتارها یعنی اینکه شئ ما چه کارهایی می تواند انجام دهد مثل: حرکت کردن، بسته شدن.
بنابرین تا اینجای کار به دو نتیجه مهم می رسیم:
اگر آشنایی کمی با برنامه نویسی داشته باشید باید با داده ها و تعریف کردن آنها آشنا باشید دادهایی مثل : Integer ,Float ,Char. و اگر برای بیشتر از ۱ ساعت برنامه نویسی کرده باشید با توابع یا function ها هم آشنایی دارید.
به داده هایی که ویژگی های یک شئ را مشخص می کنند Properties یا Attributes در اصلاح فنی گفته می شود و به توابعی که رفتارهای یک شئ را مشخص می کنند Method گفته می شود پس یک Property داده ای است که به یک شئ تعلق دارد و Method تابعی است که به یک شئ تعلق دارد.
خوب حالا که تعاریف را می دانیم بهتر است مقداری شبه کد با سینتکس کلی (این سینتکس به هیچ زبانی تعلق ندارد ولی بیشتر شبیه جاوا است) ببینیم تا بقیه مفاهیم را بهتر بفهمیم:
فرض کنید می خواهیم یک شئ حساب بانکی در برنامه خود داشته باشیم پس اول باید کلاس شئ حساب بانکی را بسازیم، قدم اول این است که یک اسم مناسب برای class این شئ استفاده کنیم پس اسم BankAccount را انتخاب می کنیم:
class BankAccount {
}
خوب این از قدم اول، قدم دوم این هست که از خودمان بپرسیم که یک حساب بانکی چه داده هایی را در خود نگهداری می کند؟ جوابی که برای هر حساب ساده ای به ذهن من می رسد این است: اسم صاحب حساب و مقدار پولی که درون حساب است؛ حالا باید از خودمان بپرسیم که هریک از این داده ها چه جنسی دارند؟ واضح است که اسم صاحب حساب از جنس string است و برای مقدار پول درون اکانت هم با مقداری تسامح می توانیم جنس float را انتخاب کنیم و بعد برای هر یک از این داده ها اسم مناسب انتخاب می کنیم من برای نام صاحب ownerName و برای مقدار پول balance را انتخاب می کنم پس تا به اینجای کار class ما به این شکل در می آید:
class BankAccount {
string ownerName;
float balance;
}
در مرحله بعد باید از خودمان بپرسیم که این حساب بانکی چه رفتارهایی دارد؟ رفتارهایی که به ذهن می رسد یکی اعلام مقدار پول درون حساب ، تعیین نام صاحب حساب، اعلام نام صاحب حساب، واریز پول به حساب و برداشت پول از حساب.
برای اعلام پول درون حساب مقدار balance را بر می گردانیم.
برای تعیین نام صاحب حساب مقدار ownerName را برابر نام داده شده قرار می دهیم.
برای اعلام نام صاحب حساب مقدار ownerName را بر می گردانیم.
برای واریز پول به حساب باید توجه کنیم که اولا وقتی پول به حساب واریز می شود این مقدار واریز شده به مقدار پول درون اکانت (balance) اضافه می شود و اینکه نمی شود مقدار منفی به اکانت واریز کرد.
برای برداشت پول از حساب اگر مقدار درخواست شده برای برداشت پول بیشتر از مقدار پول درون اکانت باشد نباید اجازه برداشت داده شود چون مقدار کلی پول فرد منفی می شود و این نادرست است و برای اینکه شخصی که از اکانت برداشت می کند متوجه شود که مقدار مجازی درخواست کرده اگر مقدار مجاز بود true و اگر مجاز نبود false را بر می گرداند.
من رفتار اعلام مقدار پول حساب را getBalance، اعلام نام صاحب حساب را getOwnerName، واریز به حساب را deposit و رفتار برداشت از حساب را withdraw می نامم، تا به اینجای کار تعریف class ما اینطور می شود:
class BankAccount {
string ownerName;
float balance;
float getBalance() {
return balance;
}
string getOwnerName() {
return ownerName;
}
void setOwnerName(string name) {
ownerName = name;
}
void deposit(float amount) {
if (amount > 0) {
balance = balance + amount;
}
}
boolean withdraw(float amount) {
if (amount < balance) {
balance = balance - amount;
return true;
}
return false;
}
}
حال برای این معرفی ساده همین مقدار کفایت می کند و class حساب بانکی ما آماده است که از روی آن اشیا جدید ایجاد کنیم پس در شبه کد زیر ما می خواهیم در جایی از برنامه اشیایی جدید از این کلاس ایجاد کنیم:
{
kamalBankAccount = new BankAccount();
kamalBankAccount.setOwnerName("Kamal")
kamalBankAccount.deposit(100);
// returns true
kamalBankAccount.withdraw(20);
aliBankAccount = new BankAccount();
aliBankAccount.setOwnerName("Ali")
aliBankAccount.deposit(120);
// returns false
aliBankAccount.withdraw(200);
// output: "Kamal"
print( kamalBankAccount.getOwnerName() );
// output: 80
print( kamalBankAccount.getBalance() );
// output: "Ali"
print( aliBankAccount.getOwnerName() );
// output: 120
print( aliBankAccount.getBalance() );
}
پس با این مثال با امیدارم متوجه فرق بین یک class و شئ از آن class شده باشید ما در تعریف کلاس فقط Property ها و منطق (Methods) را مشخص می کنیم.وقتی شئ جدید از آن کلاس می سازیم حالا می توانیم مقادیر Property ها را هم مشخص کنیم و توجه کنید که داده ها و رفتارهای هر شئ از شئ دیگر جدا است.
به فرآیند ساختن یک شئ در اصلاح فنی Instantiation می گویند.
امیدوارم با مفاهیم پایه برنامه نویسی شئ گرا آشنا شده باشید اگر این مفاهیم را فهمیده باشید مطالب بعدی بسیار آسان تر خواهد بود درست است که بسیاری از مفاهیم دیگر مثل Abstraction, Encapsulation, Polymorphism, Inheritance را در این پست پوشش ندادم اما تمام آنها چیزی نیستند جز بازی با این مفاهیم پایه در پست های بعدی شما را با این مفاهیم آشنا می کنم.