Java Tips

طراحی و توسعه نرم افزار با زبان Java

Java Tips

طراحی و توسعه نرم افزار با زبان Java

Java Tips

اشتراک دانش و تجربه و یادگیری مستمر

وبلاگ مهندس نرم افزار

طبقه بندی موضوعی
بایگانی
نویسندگان

هر شیء ای حالات(States) و رفتارهایی(behaviors) دارد که State بیانگر همان فیلد ها (Instance Variable ها) است و رفتار بیانگر همان متدها(Methods) (توابع) می باشد.

هر نمونه ای از یک کلاس(هر شیء از کلاس) می تواند مقادیر منحصر به فرد برای فیلد های خودش (Instance Variable) داشته باشد. رفتار(Behavior) عملیاتی روی State(حالات) یک کلاس انجام می دهد, به عبارت دیگر متد ها مقادیر فیلد ها (Instance Variable) ها را استفاده می کنند.

در حقیقت سه نوع متغیر داریم :

  • ·         Local Variables
  • ·         Instance Variables (Non-static variables)
  • ·         Class Variables (Static Variables)

 

Instance Variables(Non-Static Variables)

یک کلاس توصیف می کند که, چگونه یک Object شناخته می شود و چه کاری انجام می دهد.

در برنامه نویسی شیء گرا به Instance Variable ها , Attribute یا همان صفت و یا فیلد(Field) هم گفته می شود. Instance Variable باید در داخل کلاس تعریف شوند و باید بصورت Private(خصوصی) باشند. برای دسترسی به فیلد های (Instance Variable ها) کلاس باید getter و setter متناظر آن نیز پیاده سازی شود. هدف از خصوصی بودن Instance Variable ها Encapsulation(کپسوله سازی) می باشد که یکی از اصول برنامه نویس شیء گرا می باشد. getter و setter هم در حقیقت یک متد هستند. در مثال زیر یک فیلد (Instance Variable) برای کلاس و getter و setter های متناظر آن را پیاده سازی میکنیم :

نحوه دسترسی به Instance Variable و مقدار دهی آن نیز به این صورت می باشد :

Local Variable(متغیر های محلی)

متغیر های محلی فقط در داخل بدنه یک متد تعریف می شوند و حوزه (Scoop)  آن نیز داخل بدنه آن متد است.

Class Variables(Static Variables)

متغیر استاتیک : گاهی اوقات لازم است که مقدار یک متغیر, بین همه شیء های یک کلاس, یکی و مشترک باشد ولی در حالت معمولی هر شیء از یک کلاس کپی خودش را از Instance Variable های کلاس دارد. به عبارتی دیگر: یک قطعه داده برای همه اشیاء یک کلاس به اشتراک گذاشته می شود(سهیم هستند) و صرفا فقط یک فضای حافظه(RAM) برای متغیر Static در نظر گرفته می شود که بین همه Object های یک کلاس مشترک است.

با متغیر Static فقط یک حافظه به کل کلاس اختصاص داده شده است, ولی با متغیر های غیر Static , به هر Object یک حافظه اختصاص داده شده است.

نحوه دسترسی به متغیر Static :

نام متغیر استاتیک.نام کلاس

 مثال:

و خروجی آن : 

و همینطور علاوه بر متغیر استاتیک, متد استاتیک و کلاس استاتیک هم داریم.

متد استاتیک : متد هایی هستند که برای انجام دادن کاری نیازی به Instance Variable های آن کلاس ندارند, بلکه اطلاعات مورد نیاز خود را توسط پارامتر های ورودی می گیرند و یک عملیاتی را انجام می دهند و یک  Return Value دارند. مانند تابع محاسبه توان از کلاس Math :

Math.pow(5);

کلاس استاتیک : زمانیکه همه اعضای کلاس(متغیر ها و متد ها) استاتیک است بهتر است کلاس استاتیک باشد.

 

متد ها(Methods)

نشاندهنده عملیاتی است که یک کلاس می تواند انجام دهد. یک کلاس می تواند صفر یا چند متد داشته باشد.

هر متد یک امضاء دارد(Method Signature).

*   هر متد باید در راستای یک هدف باشد و یک کار مشخص را انجام دهد, که به این متد ها, متدهای Cohesive می گویند.

* Cohesive بودن باعث افزایش Reusability(قابلیت استفاده مجدد) و code readability(خوانایی بالای کد) و maintainability(قابلیت نگهداری سیستم) می شود.

* Cohesive بودن باعث می شود که پیچیدگی قابل کنترل باشد.

* نام متد باید یک عبارت فعلی باشد مانند : Insert() , نباید مخفف(Abbreviation) باشد.

* می توان متدهای همنام داشت که به این کار Overloading می گویند. البته باید تعداد و نوع پارامتر های ورودی آن متفاوت باشد. هدف ایجاد چندین متد با نام یکسان  این است که کار مشابه انجام می دهند ولی با انواع و تعداد پارامتر های ورودی متفاوت.

 

* هر متد در قسمت اعلان آن متد, تعدای پارامتر ورودی دارد.

* مقادیری که در فراخوانی متد, به متد پاس داده(ارسال) می شود آرگومان نام دارد.

نکته 1 : دو روش برای ارسال آرگومان به متد وجود دارد :

  1. ارسال با مقدار(Pass-By-Value)
  2. . ارسال با ارجاع(Pass-By-Reference)

ارسال با مقدار(Pass-By-Value) : در ارسال با مقدار(که نام دیگر آن Pass-By-Copy می باشد) یک کپی از متغیر اصلی به متد فرستاده می شود. بنابراین تغییرات تاثیری در مقدار متغیر اصلی که به متد پاس داده شده است ندارد(چون فقط یک کپی از متغیر اصلی به متد فرستاده شده است).

 به ارسال با مقدار به متد, فراخوانی با مقدار متد(Call-By-Value) هم می گویند.

ارسال با ارجاع(Pass-By-Reference) :  در ارسال با ارجاع, آدرس ارجاع به متغیر اصلی(اشاره گر به متغیر اصلی و یا همان آدرس متغیر اصلی در RAM) به متد فرستاده می شود. بنابراین با انجام هر نوع تغییرات, مقدار  متغیر اصلی تغییر می کند.

به ارسال با ارجاع به متد, فراخوانی با ارجاع متد(Call-By-Reference) هم می گویند.

نکته 2 : جاوا فقط و فقط ارسال آرگومان با مقدار(Pass-By-Value) را پشتیبانی می کند. جاوا ارسال آرگومان با ارجاع ندارد.         

بعضی از زبان ها مانند C# ارسال با ارجاع هم دارند.

نتیجه گیری

  1. 1.      Instance Variable(Non-Static Variable) ها(فیلد های کلاس) :

                  * فیلد ها(Instance Variable ها) دیتای آن کلاس را نگهداری می کنند.

                  * در برنامه نویسی شیء گرا(Object-Oriented)  به Instance Variable ,فیلد(Field)

                    ,صفت(Attribute) و یا Data Member(عضو داده خصوصی کلاس) هم می گویند .

                  * یک کلاس می تواند صفر تا n فیلد داشته باشد.

                  *  فیلد ها داخل کلاس تعریف میشوند.

                  * Instance Variable ها(فیلد ها) باید Private باشند(کپسوله سازی(Encapsulation) و مخفی سازی

                     داده کلاس(Data Hiding)).

                 * متناظر با هر فیلد (Instance Variable) باید یک getter و یک setter هم داشته باشد.

                 * فقط با getter و setter می توان به فیلد ها دسترسی داشت.

                 * setter یک فیلد را مقداردهی و یا تغییر می دهد.

                 * getter مقدار فیلد را بر می گرداند.

                 * در برنامه نویسی شیء گرا(Object-Oriented)  بهgetter و  setter , خاصیت یا ویژگی (Property)    

                   هم می گویند.

                 * setter فقط و فقط یک آرگومان دارد.

                 * getter و setter باید public باشند.

                 * در حقیقت getter و setter ها یک روش هستند برای ارائه فیلد های آن کلاس.

                 * به متد setter , Mutator Method هم می گویند(تغییرات مقدار یک فیلد کلاس                                      

                   ( Private Instance Variable  ) را کنترل می کند).

                * با setter می توان مقدار یک فیلد را اعتبار سنجی(Validation) کرد.

                * به متد getter , Accessor هم می گویند(مقدار یک فیلد کلاس(Private Instance Variable) را  بر می

                    گرداند).

               * getter و setter این اجازه را به ما می دهند که فیلد های کلاس, با یک روش مطمئن                                                                  

                    تری در اختیار  سایر Object ها قرار گیرد(دسترسی به داده های خصوصی(Private) کلاس با یک روش

                    کنترل شده).

               *عدم رعایت موارد فوق باعث می شود نرم افزار شکننده(fragile) و بی دوام(brittle) شود.

               * فیلدی (Instance variable ای) که setter ندارد یعنی Read-Only است و فقط از طریق سازنده مقدار

                   دهی می شود.

               * کلاس هایی که هیچ فیلدی (Instance Variable ای)  ندارند Utility Class هستند.

 

  1. 2.      Local Variable ها :

              * در مقابل Instance Variable ها (فیلد ها) , نوع دیگری متغیر به نام Local Variable داریم که در  

                  داخل بدنه متد تعریف می شود.

              * Local Variable ها باید قبل از دسترسی مقدار دهی اولیه(Initialize) شوند.

              * برای متغیر های محلی Access Modifier ها قابل استفاده نیستند.

              * فقط داخل بدنه آن متد قابل استفاده هستند.

              * برای مقایسه دو متغیر از نوع primitive از عملگر = باید استفاده کرد.

              * اگر کلاس هیچ متدی نداشته باشد Entity Class است.

 

3. Class Variable(Static Variable) ها :

             * یک متغیر استاتیک  مفهوم "اطلاعات در سطح کلاس"(Class Wide Information) را بیان می کند.

             * متد استاتیک فقط به متغیر های استاتیک و متدهای استاتیک همان کلاس دسترسی دارد.

             * حوزه پوشش یک متغیر استاتیک فقط در بدنه همان کلاس است.

             * زمانیکه لازم است همه Object های یک کلاس فقط یک کپی از یک متغیر را دشته باشند باید آن متغیر

                 استاتیک باشد.

             * اعضای کلاس یا در سطح Object Scoop هستند(در 99 درصد مواقع اینگونه است) یا در سطح            

                Class Scoop هستند(در 1 درصد موارد اینگونه است).

             * متغیر های استاتیک Class Scoop هستند.

             * بطور پیش فرض متد ها Static نیستند که به آنها متد های Regular Method یا Instance Method

                 یا Non-Static Method  می گویند, یعنی یک عمل روی یک شیء خاص انجام می شود.

             * دسترسی به یک Regular Method از طریق یک نمونه از ان شیء انجام می شود ولی یک متد Static از

                 طریق نام کلاس دستیابی می شود.

             * متد  Static و کلاس Static یعنی هیچ شیء ای نمی توان از اینها ایجاد(new) کرد و این تنها نمونه موجود

               قابل استفاده است.

موافقین ۰ مخالفین ۰ ۹۵/۱۲/۰۶
مهندس نرم افزار

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

نظر دادن تنها برای اعضای بیان ممکن است.
اگر قبلا در بیان ثبت نام کرده اید لطفا ابتدا وارد شوید، در غیر این صورت می توانید ثبت نام کنید.