برنامه نویسی

اصطلاحات رایج در برنامه نویسی شی گرا

نوشته شده توسط امین سجودی

اصطلاحات رایج در برنامه نویس شی گرا

۱- تفاوت کلاس و آبجکت چیست ؟

آبجکت ها در واقع Instance های یک کلاس هستند ، یعنی یک کلاس به خودی خود شی نیست بلکه تعریفی از ویژگی های یک شی است و آبجکت خود شی است که می تواند بر اساس تعریفی که برایش نوشته شده (کلاس) یکسری کارها را انجام دهد .

۲- Method Overriding چیست ؟ تفاوت آن با Method Overloading چیست ؟

این دو مفهوم کاملا با هم متفاوت اند ، Overloading یعنی ما از یک تابع چند نوع آن را داشته باشیم با نوع ورودی های متفاوت ولی با یک اسم . به مثال توجه کنید :

class Work
{
	public void DoSomthing()
	{

	}

	public void DoSomthing(int numberOfWorks)
	{

	}

	public void DoSomthing(string WorkName)
	{

	}
}

اما Overriding وقتی استفاده می شود که فرضا کلاس پدر دارای یک تابع نمایش است ،اما کلاس بچه نیاز دارد تا تابع نمایش دیگری داشته باشد ، در این حالت به اصطلاح می گوییم تابع نمایش در کلاس بچه Override شده است . به مثال توجه کنید :

class Shape
{
	public void Draw()
	{
		// draw a line
	}
}

class Rectangle : Shape
{
	public void Draw()
	{
		// draw a rectangle
	}
}
۳- تابع یا متغیری که کلید واژه Static(استاتیک) را دارد به چه معناست ؟

یک تابع یا متغیر استاتیک به کلاس تعلق دارد به جای اینکه به شی یا Instance اون کلاس تعلق داشته باشه . این یعنی که تنها یکی از این متغیر یا تابع وجود خواهد داشت، حتی اگه شما هزاران Instance از یک کلاس داشته باشید تابع یا متغیر استاتیک اون فقط یکی خواهد بود . مزیت این توابع یا متغیر ها در این است که برای استفاده نیازی به ساختن Instance از کلاس ندارند.

یکی دیگر از اصطلاحاتی که به طور معمول در حوزه برنامه نویسی می شنوید اصطلاح استاتیک است. به طور کلی ما کلاس های استاتیک، متد های استاتیک، متغیر های استاتیک و .. داریم. مهمترین این ها متغیر های استاتیک هستند، این متغیر ها در یک کلاس تعریف می شوند و نیازی به ایحاد شی(Object) ندارند و بدون ساختن نمونه(Instance) قابل استفاده هستند. انگار که قسمتی از تعریف کلاس اند. نکات مثبت و منفی در استفاده از متغیر های استاتیک وجود دارد، به طور مثال یکی از کاربرد های متداول متغیر های استاتیک، استفاده از آن ها برای ذخیره کردن حالت یک مفهوم یا حالت برنامه است. مثلا برنامه در وضعیت Pause قرار دارد، برنامه در وضعیت Stop قرار دارد، برنامه در وضعیت Start قرار دارد، تمام این وضعیت ها را می توان در یک متغیر استاتیک کلاس اصلی برنامه قرار داد و هر وقت لازم شد بدون ساختن یک شی از کلاس به این متغیر دسترسی پیدا کرد. این کار در ابتدای پروژه برنامه نویسی پروژه را بسیار دلچسب و راحت می کند اما اگر پروژه یک پروژه بزرگ شود و مراحل توسعه آن طول بکشد همین متغیر ساده استاتیک کمر برنامه نویس را می شکند!چون به هیچ وجه قابل ردیابی نیست و بزرگترین نقطه قوت آن یعنی دسترسی از همه جا و تغییر به راحتی به بزرگترین نقطه منفی آن تبدیل می شود، غیر قابل کنترل بودن وضعیت و مقدار این متغیر باگ های زیادی را در سیستم ایجاد می کند.(زبان های برنامه نویسی جدید مثل اسکالا به شدت جلوی ایجاد همچین مواردی را می گیرند و به این متغیر ها می گویند Shared Mutable State)

کلاس های استاتیک عموماً برای ساختن جعبه ابزار در کد به کار می روند. به طور مثال شما تعداد زیادی متد خوب و عالی برای کار کردن بر روی فایل دارید. شما می توانید تمام این متد ها رو در یک کلاس استاتیک قرار بدهید و هر جای برنامه بدون نیاز به ساختن نمونه(Instance) از این کلاس به راحتی از این متد ها استفاده کنید.

  • یک کلاس استاتیک باید فقط شامل متد های استاتیک باشد.
  • متد های استاتیک می توانند در هر کلاسی باشند، هم استاتیک و هم عادی

یکی از مهمترین کاربرد های متغیر های استاتیک در الگوهای معماری نرم افزار(Design Patterns) است. مانند سینگلتون (Singleton)

نمونه یک متغیر استاتیک :

در این مثال ما تعداد زیادی دکمه داریم که اگر روی یکی کلیک کردیم دیگر نباید باقی دکمه ها قابل کلیک کردن باشند. به کمک یک متغیر استاتیک این کار را به راحتی انجام می دهیم.


public class Button
{
public static bool Clickable = true;

public void OnClick()
{
if (Clickable)
{
Clickable = false;
// Handle the click
}
else
{
// show error, button is not clickable
}
}
}

۴- اصطلاح Protected :

این اصطلاح در قسمت قبلی آموزش توضیح داده شده است. لینک

اما برای توضیح بیشتر یکسری مثال می زنم . فرض کنیم ما یک کلاس Shape داریم . این کلاس یک متغیر دارد که مساحت (Area) شی را در خود دارد .فرض کنیم این متغیر با کلید واژه Protected تعریف شده باشد . حالا اگه یک کلاس دیگه داشته باشیم که بچه این کلاس شی باشه مثلا Square . ما توی تعریف این کلاس و داخل توابع این کلاس می تونیم از متغیر Area استفاده کنیم یعنی مقدارش رو تغییر بدیم یا از مقدارش استفاده کنیم . اگه این متغیر با کلید واژه  Private تعریف شده بود ، توی کلاسSquare دیگه نمی تونستیم از این متغیر استفاده کنیم . دقت کنید که اگه Public هم بود باز هم میشد استفاده کرد .

حالا تفاوت Public  و Protected : فرقشون این هست که مثلا ما یک کلاس دیگه به اسم Person داریم . (دقت کنید این کلاس هیچ ربطی به کلاس Shape ندارد ) , فرض کنید ما یک Instance از کلاس Sqaure توی کلاس Person درست کردیم . حالا اگه متغیر Area کلاس Shape ، با کلید واژه Public تعریف شده باشد ، باز هم ما می توانیم این متغیر را در کلاس Person استفاده کنیم . اما اگه این متغیر با کلید واژه Protected استفاده شده بود دیگه توی کلاس Person امکان دسترسی بهش رو نداشتیم .

در کل متغیری یا تابعی که با کلید واژه Protected ساخته میشه فقط توی بچه های اون کلاس قابل دسترسی هست . یعنی فقط کلاس هایی که از اون کلاس Extend میشن (یا از بچه های اون کلاس) می تونن به این متغیر دسترسی پیدا کنن.

 

اگه اصطلاحی مد نظرتون بود خوشحال میشم تو قسمت نظرات مطرح کنید تا در موردش توضیح داده بشه .

 

درباره نویسنده

امین سجودی

امین یک توسعه دهنده نرم افزار و علاقه مند به بازی می باشد که بیشتر وقت خود را صرف برنامه نویسی و یادگیری تکنولوژی های جدید می کند .

دیدگاه

    • سلام و با تشکر از نظرتون
      در مورد Protected توضیح دادم . در مورد موارد بعدی حقیقتش من خودم نشنیده بودم در موردشون تا حالا . در مورد MSIL جستجو کردم . این چیزی که من فهمیدم اینه که ربطی به برنامه نویسی شی گرا به اون صورت نداره بلکه در مورد .NetFrameWork هستش . این این فریم ورک پس از کامپایل کد های شما اون ها رو به یکسری دستور العملی که وابسته به CPU خاصی نیست تبدیل می کنه.
      در مورد JIT هم مخفف just in time هستش که یک ویژگی کامپایلر هستش و در مقابل AOT قرار دارد.

      • خیلی ممنون .بله protected مطالعه شد.حقیقتا من هم در مورد JIT و MSIL چیزی پیدا نکردم.ولی ادامه میدم شاید چیزی دستگیرم شد.بازم ممنون

  • سلام من مترجمم
    و الان دارم یک کتاب درباره برنامه نویسی ترجمه می کنم این کتاب پر از اصطلاخات برنامه نویسیه که من دیدم که معمولا به همون شکل انگلیسی به کار برده میشه و حتی ترجمه شون به فارسی ممکنه باعث گمراهی مخاطب بشه…اما اگه ترجمه هم نکنم صورت قشنگی نداره و ممکنه که فک کنن من نخواستم ترجمه کنم برای یه سریشون برابر فارسی پیدا کردم اما یه تعدادی مونده که معانی بسیار شبیهی دارن امیدوارم کمکم کنین:
    property:؟
    :attributeخاصیت
    feature: وجهه
    convention: اجماع نظر
    instance: نمونه
    specialization: مشخصه سازی
    argument: مولفه
    assertion: اعلان

    • مواردی که مطرح کردید مفهوم هایی هستند که معادل فارسی ندارند حتی در زبان انگلیسی هم اگر موضوع یا زبان برنامه نویسی مشخص نباشد بسیاری از موارد قابل تشخیص از هم نیستند از همین رو توصیه می کنم همین واژه های انگلیسی را به کار ببرید. مواردی که نوشتید فکر کنم مربوط به زبان سی شارپ هستش.

  • سلام خسته نباشید.یه سوال داشتم از کلمه استاتیک. فواید تعریف تابع و متغیر استاتیک چیه؟ علاوه بر این که میشه بدون ساخت شی صداشون زد فقط با اسم کلاس. مثلا یه جا خوندم یه بار حافظه اختصاص میده برای یه داده اما کلاس غیر استاتیک اینجور نیست.
    مضراتش هم بگین که چرا بعضی جاها باید کلاس با متدهای غیراستاتیک استفاده شده.
    ممنون میشم یه مثال عملی هم زده بشه. بنده در حال یادگیری جاوا هستم

اضافه کردن دیدگاه

هفده − 7 =