Java Tips

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

Java Tips

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

Java Tips

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

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

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

۱۳ مطلب توسط «مهندس نرم افزار» ثبت شده است

تفاوت های Interface و Abstract Class :

              * یک کلاس انتزاعی(abstract Class) بعنوان یک کلاس پایه, برای یک خانواده از کلاس های مشتق شده بکار گرفته

                می شود, ولی اینترفیس(Interface) برای پیاده سازی وراثت چند گانه است.

              * یک کلاس معمولی فقط می تواند از یک کلاس Abstract ارث بری کند و لی همین کلاس می تواند از چندیدن

                  اینترفیس ارث بری کند.

              * عناصر موجود در یک کلاس Abstract می تواند مانند یک کلاس معمولی انواع سطح دسترسی داشته باشد و لی

                  عناصر اینترفیس فقط public هستند.

              * کلاس Abstract یک نوع کلاس است ولی اینترفیس یک کلاس نیست.

              * یک کلاس Abstract می تواند مانندیک کلاس معمولی Instance Variable داشته باشد ولی اینترفیس نمی تواند

                 داشته باشد .

              * وقتی در پروژه های بزرگ با تغییرات زیادی مواجه هستیم باید از کلاس Abstract استفاده کنیم, زیرا با

                  تغییر در کلاس پایه(Abstract) (بعنوان مثال متدی به کلاس پایه(Super Class) اضافه شود), کلاس های

                  مشتق شده(فرزند)  مجبور نیستند آنرا پیاده سازی کنند و اجباری نیست در حالیکه پیاده سازی تمامی متد های

                  تعریف شده داخل اینترفیس برای کلاس های مشتق شده اجباری است.

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

                  باید از اینترفیس استفاده کنیم .

              * زمانیکه یک کلاس باید یک اینترفیس را پیاده سازی کند به این معنی است که : این کلاس باید همه بخش های

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

                  است.

              * در صورتی که نخواهیم کلیه متد های تعریف شده داخل کلاس پایه , در کلاس های مشتق شده پیاده سازی شود

                  باید از کلاس Abstract استفاده کنیم.

              * زمانیکه وراثت چندگانه داریم از اینترفیس استفاده می کنیم.

              * متد های یک اینترفیس Abstract هستند ولی یک کلاس Abstract می تواند متد غیر abstract هم داشته باشد.

              * وقتی شما یک متد به کلاس Abstract اضافه می کنید , اگر این متد Abstract نباشد بطور خودکار به همه زیرکلاس

                  ها اعمال می شود ولی اگر به اینترفیس متدی اضافه کنیم باید آنرا در تمام کلاس های مشتق شده اضافه کنیم .

              * به بیان کلی و ساده : Interface چارچوب و قالب کلی و قابلیت های یک کلاس را مشخص می کند و یک قراداد است,

                  درحالیکه Abstract نوع کلاس را مشخص می کند.

۰ نظر موافقین ۰ مخالفین ۰ ۲۰ اسفند ۹۵ ، ۲۰:۵۱
مهندس نرم افزار

Interface : قراردادی است برای یک سرویس گیرنده(برنامه نویس client) , که نحوه رفتار یک کلاس را تضمین خواهد کرد. Interface یک مجموعه از متد های Abstract می باشد. کلاسی که یک Interface را پیاده سازی می کند(Implement) در حقیقت متد های Abstract آن Interface را ارث بری کرده است. یک Interface یک کلاس نیست ولی شبیه به یک کلاس است. دوتفاوت اصلی بین اینترفیس و کلاس وجود دارد: 1. یک کلاس صفت ها(Attribute)(همان state و فیلد) و رفتارهای(Behavior) یک شی را توصیف می کند.  2. یک اینترفیس شامل رفتار هایی(متدها) می شود که یک کلاس باید پیاده سازی کند.

یک اینترفیس صرفا اعضایی را که باید توسط یک کلاس پیاده سازی شوند را تعریف می کند و شامل هیچ گونه پیاده سازی نیست. اینترفیس برای یک کلاس انتزاعی, جهت ایجاد قراردادهایی مابین این کلاس انتزاعی و سرویس گیرنده هایش(فرزند های این کلاس) , یک چاره پیشنهاد می کند.

شباهت های یک اینترفیس و یک کلاس:

  1.       یک اینترفیس می تواند شامل متد هم باشد.
  2.       یک اینترفیس در یک فایل .java*  نوشته می شود.
  3.       Bytecode اینترفیس در یک کلاس .java*  قرار می گیرد.
  4.       اینترفیس در یک Package قرار می گیرد.

تفاوت های یک اینترفیس و یک کلاس :

  1.       اینترفیس قابل نمونه سازی(Instantiate) نیست.
  2.       اینترفیس سازنده(Constructor) نمی تواند داشته باشد.
  3.       همه متد ها در اینترفیس, فقط باید Abstract باشند.
  4.       اینترفیس نمی تواند شامل Instance Field(Variable) باشد. فقط می تواند فیلدی را شامل شود که بصورت Static و final اعلان شده باشد.
  5.       یک اینترفیس نمی تواند از یک کلاس ارث بری کند(یک کلاس یک اینترفیس را پیاده سازی می کند).
  6.       یک اینترفیس می تواند چند اینترفیس را توسعه و بسط (extend)دهد(از چند اینترفیس ارث بری کند).

 نحو کلی اینترفیس : 

مثال تعریف یک اینترفیس : 

۰ نظر موافقین ۰ مخالفین ۰ ۲۰ اسفند ۹۵ ، ۲۰:۴۹
مهندس نرم افزار

انتزاع یعنی: بخشی از موجودیت یک مفهوم را که , میان همه وارثان مشترک است را پیش تعریف کنیم. این توانایی منجر به داشتن نگاه مشابه به موجودیت های مشابه گردد. به عنوان مثال برای شیء ای مانند حیوان یا پرنده نمی توان صفتی همچون " دست های دو انگشتی, بال های کوتاه یا بلند, تعداد پا ها, نوع دندان و ... " تعریف کرد. زیرا موجودیت حیوان و پرنده یک موجودیت انتزاعی است.  

در دانش رایانه و مهندسی نرم‌افزار به معنای تفکیک مباحث مربوط به هم و نگریستن به موضوع, جدای از مباحث وابسته به آن است. مزیت این کار در مهندسی نرم‌افزار کمک به مدیریت پیچیدگی و پیشگیری از چفت شدگی و  وابستگی شدید (Tight Coupling) اجزای سیستم به یکدیگر است که باید در سامانه‌های نرم‌افزاری تا حد امکان از آن کاست(پیاده سازی Decoupling).

نکته : از روی کلاس های Abstract نمی توان شیء(نمونه) ایجاد کرد, در واقع قابل نمونه سازی(Instantiate) نیست. از شیء حیوان و پرنده نمی توان نمونه ساخت و فقط یک نمونه می تواند وجود داشته باشد, زیرا این(کلاس Abstract) تنها نمونه موجود است . این نمونه ها بسیار مهم هستند , زیرا این نمونه ها هستند که ساختار یک سلسله مراتب را تشکیل می دهند و صفات و رفتار های کل آن را معین می کنند.

* کلاسی که Abstract نباشد, کلاس Concrete است. کلاس Concrete(کلاس فرزند) یعنی کلاسی که

۰ نظر موافقین ۰ مخالفین ۰ ۲۰ اسفند ۹۵ ، ۲۰:۴۰
مهندس نرم افزار

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

تنها راه دسترسی به یک شیء فقط ار طریق یک Reference Variable(متغیر از نوع ارجاع) می باشد.Reference Variable فقط از یک نوع(Type) می تواند باشد. نوع آن یکبار اعلان می شود و بعد از آن دیگر قابل تغییر نیست.

یک نمونه پر کاربرد از چند ریختی زمانی رخ می دهد که یک ارجاع به کلاس پایه استفاده می شود برای اشاره به شیء کلاس فرزند. همه اشیاء در جاوا چند ریختی هستند زیرا از کلاس Object ارث بری می کنند.

مثال زیر را در نظر بگیرید :

کلاس Deer بصورت چند ریختی می باشد زیرا ارث بری چندگانه دارد. در این باره موارد زیر صدق می کند :

  • ·        A Deer IS-A Animal
  • ·        A Deer IS-A Vegetarian
  • ·        A Deer IS-A Deer
  • ·        A Deer IS-A Object

وقتی که ما یک متغیر از نوع ارجاع(Reference Variable) از کلاس Deer اجاد می کنیم موارد زیر صادق می باشد:

همه Reference Variable های بالا(d,a,v,o), به یک شیء از کلاس Deer در heap اشاره می کنند.

نتیجه گیری :

              * یک Reference Variable می تواند به یک شیء دیگر انتساب داده شود(به شرط اینکه final نباشد).

              * نوع Reference Type تعیین می کند که چه متد هایی با  یک شیء قابل فراخوانی(Invoke) هستند.

              * یک Reference variable می تواند اشاره کند به یک شیء  دیگر به شرط اینکه همنوع خودش باشد.

              * یک Reference variable می تواند اعلان شود مانند نوع کلاس یا یک نوع Interface. 

۰ نظر موافقین ۰ مخالفین ۰ ۲۰ اسفند ۹۵ ، ۲۰:۲۷
مهندس نرم افزار

اگر یک کلاس از یک Super Class مشتق شود, آن کلاس می تواند متدهای کلاس پایه را بازنویسی(Override) کند(به شرط اینکه آن متد final نباشد).

مزیتی که به همراه , Override کردن متدهای کلاس پایه در Sub Class می باشد این است که : Sub Class می تواند متدهای کلاس پایه را براساس نیازمندی های خودش پیاده کند.

مثال اول:

 

خروجی آن :

مثال دوم :

۰ نظر موافقین ۰ مخالفین ۰ ۲۰ اسفند ۹۵ ، ۲۰:۲۱
مهندس نرم افزار

ارث بری از مفاهیم اساسی برنامه نویسی شیء گرا می باشد. برای مثال می توان اتومبیلی را در نظر گرفت که برای جلوگیری از بازنویسی خواص عمومی اتومبیل برای هر نوع اتومبیل مانند پراید, پیکان و ... شامل : چرخ ها, فرمان, متد حرکت چرخ ها, متد چرخاندن فرمان و ... , می توان یک کلاس عمومی و پایه از اتومبیل ایجاد کرد. سپس برای اتومبیل مثلا زانتیا یک کلاس جدید ایجاد کرد که فقط برای خواص و متد ها و رویداد های جدید مخصوص به این اتومبیل کد نویسی انجام داد.

اگر از وراثت استفاده شود, نگهداری کد ها و اطلاعات در ساختارهای سلسله مراتبی قابل مدیریت می شود. زمانیکه ما از وراثت صحبت می کنیم از کلمات کلیدی extends و implements استفاده می کنیم. این دو کلمه تعیین می کنند که آیا یک Object از یک نوع Object دیگر است یا خیر(is-a type of another) ؟

در حقیقت این دو کلمه می گویند : این شیء یا کلاس , یک نوع از شیء یا کلاس دیگر است.

 

به عبارت دیگر : وراثت یک فرم استفاده مجدد از

۰ نظر موافقین ۰ مخالفین ۰ ۲۰ اسفند ۹۵ ، ۲۰:۱۲
مهندس نرم افزار

کپسوله سازی(مخفی سازی یا لفافه بندی) به این مفهوم اشاره دارد که باید بعضی از خصوصیات و رفتارهای شیء از دید دیگر اشیاء پنهان بماند. مانند: کارکرد اجزا مختلف یک خودرو(عملکرد سیستم فرمان, عملکرد سیستم برقی, عملکرد سیستم ترمز و ...).

در حقیقت کپسوله سازی باعث می شود اشیاء بدون آنکه از چگونگی کارکرد یکدیگر اطلاع داشته باشند با هم کار کنند.

بنابراین کپسوله سازی تکنیکی است که می توان یک فیلد(همان Instance Variable) کلاس را خصوصی(Private) کرد و دسترسی به آن را از طریق یک متد عمومی(Public) فراهم کرد.

مثال : 

۰ نظر موافقین ۰ مخالفین ۰ ۲۰ اسفند ۹۵ ، ۲۰:۰۱
مهندس نرم افزار

زبان جاوا یک زبان برنامه نویسی شیء گرا می باشد که مفاهیم زیر را پشتیبانی می کند :

  • Polymorphism
  • Inheritance
  • Encapsulation
  • Abstraction
  • Classes
  • Objects
  • Instance
  • Method
  • Message Parsing

حال به مفهوم Object و Class می پردازیم :

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

ایجاد یک Object سه مرحله دارد :

  1. 1.      Declaration (اعلان) : اعلان متغیر با یک نام و یک نوع.
  2. 2.      Instantiation (نمونه سازی یا وهله سازی) :  استفاده از کلمه کلیدی new برای ایجاد Object.
  3. 3.      Initialization (مقدار دهی اولیه) : بعد از اینکه با کلمه کلیدی new  شیء ایجاد شد, بلافاصله بطور اتوماتیک سازنده(Constructor) فراخوانی می شود. فراخوانی شدن سازنده باعث می شود که شیء مقدار دهی اولیه شود.

مثال :

 

بعد از کامپایل و اجرای قطعه کد بالا خروجی زیر را مشاهده می کنیم : 

Class : کلاس می تواند تعریف شده باشد به عنوان یک قالب که توصیف می کند حالات(States) و رفتارهای(Behaviors)  یک شیء از نوع خودش را.

در دنیای نرم افزار, یک شیء نرم افزار یک سری State و Behavior دارد. حالت یک شیء نرم افزار در داخل Instance Variable ها ذخیره شده اند  و رفتار با متدها نشان داده می شود.

یک مثال برای کلاس : 

کلاس ها انواع مختلف متغیر های زیر را شامل می شوند :

-        Local variables

-        Instance variables

-        Class variables

 

سازنده :

متدی همنام با خود کلاس است که وظیفه مقدار دهی اولیه(Initialize) یک Object را برعهده دارد. هنگامی که یک شیء new می شود بطور اتوماتیک

۰ نظر موافقین ۰ مخالفین ۰ ۲۰ اسفند ۹۵ ، ۱۹:۴۹
مهندس نرم افزار

عملگر ها

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

-          عملگر های حسابی

-          عملگر های رابطه ای

-          عملگر های بیتی

-          عملگر های منطقی

-          عملگر های انتساب

-          عملگر های متفرقه

 

عملگر های حسابی(Arithmetic Operators)

عملگر های حسابی در عملیات محاسباتی و ریاضی مورد استفاده قرار می گیرد.

*  فرض: دو متغیر از نوع int بنام های A و B داریم.

عملگر

شرح

مثال

+

جمع مقدار دو متغیر

A + B

-

تفریق عملوند سمت راست(B) از عملوند سمت چپ(A)

A - B

*

دو عملوند را در هم ضرب می کند

A * B

/

تقسیم عملوند سمت چپ بر عملوند سمت راست(بدست آوردن خارج قسمت)

A / B

%

تقسیم عملوند سمت چپ بر عملوند سمت راست(بدست آوردن باقیمانده)

A % B

++

افزایش یک واحدی عملوند

A++

--

کاهش یک واحدی عملوند

A--

 

 

 

عملگر های رابطه ای(Relational Operators)

عملگر های رابطه ای شامل موارد زیر است :

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

هر شیء ای حالات(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)

متغیر استاتیک : گاهی اوقات لازم است که مقدار یک متغیر, بین همه شیء های یک کلاس, یکی و مشترک باشد ولی در حالت معمولی هر شیء از یک کلاس کپی خودش را از

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