جاوا و تکنولوژی های آن

java programming language

در این وبلاگ به بررسی نکات موجود در جاوا و تکنولوژی های آن می پردازیم

طبقه بندی موضوعی

از Annotation ها برای lable گذاری روی عناصر استفاده میشود و بعدا توسط Reflection میتوان بصورت Dynamic مقادیر یا instance هایی را ایجاد کرد

با Retention مشخص میکنیم که Annotation تا چه زمانی زنده بماند 

با Target مشخص میکنیم که این Annotation قرار است روی چه المانی استفاده شود


محدودیت های Annotation :


هیچ یک از آنها نمیتوانند از دیگری ارث بری کنند

تمامی متد هایش بدون آرگومان ورودی باید باشند

متد ها نمیتوانند از throws استفاده کنند

annotation ها نمیتوانند Generic type داشته باشند

حتما باید یکی از مقادیر enum , primitive types , Class , String , Annotaion و یا آرایه از اینها را برگردانند


 برای تعریف یک Annotation :

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.METHOD)

public @interface AnnotName {


String attr1();


}



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

اگر این کلاس واسط وجود نداشت آن وقت باید در تک تک کلاس های فرزند ان متد ها که پیاده سازی مشترکی دارند پیاده سازی میشد و این حجم کد و نگهداری کد را ضعیف تر میکرد 

به این کلاس واسط Adapter Class میگویند و ارتباطی با Adapter design pattern ندارد


این کلاس فقط موقعی کاربرد دارد که کلاس های فرزند پدر دیگری که بخواهند extends کنند نداشته باشند چون در جاوا فقط یک کلاس میتواند از کلاس دیگری ارث بری کند مگر آنکه کلاس پدر یک interface باشد

متد ها در interface بصورت پیش فرض abstract هستند و نیازی به نوشتن ما نیست

فقط متد های public در interface مجاز هستند چون باید بعدا پیاده سازی شوند

interface ها بصورت پیش فرض abstract class هستند و نیازی به نوشتن آن نیست

تنها در interface ها multi inheritance میتوانیم داشته باشیم

interface ها constractor ندارند

marker interface ها بدون متد هستند و از قبل در جاوا پیاده سازی شده اند و نیازی هم به پیاده سازی توسط ما ندارند جاوا خودش آنرا وقتی implements شد پیاده سازی میکند مانند Clonable و Serializable 

فیلد ها در abstract class هم بصورت instance variable و هم بصورت class variable قابل استفاده هستند ولی در interface بصورت ضمنی final و static هستند و instance variable در interface نداریم

 در ارث بری عناصر private هم ارث بری میشوند ولی فقط برای عناصر پدر قابل دسترس خواهند بود .


اگر در یک توالی ارث بری 4 کلاس پشت سر هم از هم ارث بری کرده باشند موقع ساختن یک Object جدید از آخرین فرزند به ترتیب از اولین نسل متد constractor آن call میشود تا به فرزند آخر برسد


اگر متدی در پدر وجود داشت و در فرزند متدی با همان نام ولی آرگومان های متفاوت ایجاد کنیم override نکردیم بلکه overload کرده ایم و با توجه به نیاز میتوان از هر دو متد استفاده کرد


متد final شده دیگر توسط فرزندان قابل override نسیت


از نظر OOP در ارث بری متد ها هنگام Override کردن حق نداریم سطح دسترسی را محدود تر کنیم مثلا متد public در پدر نمیتواند بصورت private در فرزند override شود


دو فرزندی که یک پدر مشترک دارند ولی در یک سلسله توارثی نباشند قابل cast به هم نیستند


قوانین Overriding :

متد public باید بصورت public شده override شود

متد protected باید بصورت public یا protected شده override شود

متد default (خالی) باید بصورت public یا protected یا default شده override شود

متد private قابل override نیست

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



نوع داده های Enum از ارث بری پشتیبانی نمیکنند چون نیازی هم ندارند !



هر زبان برنامه نویسی که قابلیت سه اصل :


1-encapsulation

2-inheritance

3-polymorphism

4- و گاهی abstraction


را داشته باشد میتوانیم بگوییم آن زبان شی گرا است


encapsulation : این اصل میگوید که لازم نیست بقیه کامپوننت ها تمامی اجزا کلاس را ببینند و با استفاده از access modifier ها این دسترسی را محدود میکنیم که در پست جداگانه به این modifier ها پرداخته ایم


inheritance : با ارث بری هر شی میتواند خصوصیات شی دیگری را کسب کند و از مفهوم طبقه بندی سلسله مراتبی پشتیبانی میکند این امر بسیار مهم است . بیشتر یافته ها و اطلاعات از طریق طبقه بندی سلسله مراتبی یعنی از بالا به پایین قابل مدیریت میشوند


polymorphism : توانایی ظاهر شدن یک شی در چندین قالب را polymorphism میگویند و قدرت شی گرایی به حداکثر خود میرسد و بر سه نوع میباشد :


1- Ad-Hoc : ما میتوانیم یک درخواست مشترک را برای انواع زیر کلاس ها ارسال کنیم که این زیر کلاس ها واسط مشترکی دارند و این درخواست یکسان ما نسبت به پیاده سازی های مختلف رفتار متفاوتی را دارند همچنین یک متد میتواند چندین Overload داشته باشد و در زمان runtime جاوا تصمیم میگیرد که از کدام یک طبق نیاز باید استفاده شود که به آن  dynamic polymorphism هم میگویند همچنین یک متد میتواند چندین Override داشته باشد که در زمان Compile time نوع متد را مشخص میکند که به آن static polymorphism میگویند

2- Parametric : همان استفاده از Generic ها است Object هایی از جنس نامعلوم که در Runtime نوع آن مشخص میشود 

3- Subtype : ما میتوانیم به ازای یک پدر چندین فرزند داشته باشیم با پیاده سازی های متفاوت ، با قابلیت polymorphism میتوان یک Object Variable از نوع پدر داشته باشیم و هر کدام از پیاده سازی هایش را به آن نسبت دهیم 



فرایند تولید کد OOP : 


OOA : تجزیه و تحلیل از نگاه شی گرایی

OOD : استخراج و طراحی کلاس و سایر اجزای مود نیاز

OOP : مرحله کد زنی و پیاده سازی پلن شی گرایی

OOT : مرحله تست کد که بسته به نوع متدولوژی توسعه گاهی اول تست کد ها را مینویسند گاهی همراه با کد اصلی و گاهی آخر 


در OOA سه خانواده از کلاس ها را شناسایی میکنیم : 


1-Entity

2-Boundray

3-Control


Entity : کلاس هایی هستند که قرار است دیتا های اصلی برنامه را بصورت طولانی مدت نگه دارند و اصلاعات آن در ریسورسی مثل DB , File System و... ذخیره میشوند

Boundray : با دنیای بیرون ارتباط برقرار میکند که ممکن است یک کابر باشد یا یک کامپوننت و یا ماشین دیگر باشد مثل UI

Control : فرایند هایی که در یک سیستم داریم نقش ایم کلاس ها است و کار کنترل روی دیتا را انجام میدهند 

به کلاس های بالا در مرحله OOD میتواند نقش های دیگری را اضافه کرد


OOD : در این مرحله مشخص میکنیم که دیتا چگونه قرار است دریافت و ذخیره شود و بعد مشخص میکنیم که کاربر چگونه میتواند با سیستم تعامل داشته باشد که به آن لایه ارائه یا View میگویند 

در این مرحله به شناسایی کلاس های زیر می پردازیم :

Business Object :  گاهی به آن EntityModel یا DomainModel هم گفته میشود که هم دیتای Business را دارد و هم شامل متد هایی برای عملیات روی دیتا  و هم شامل متد هایی برای save  و load کردن از Data Resource

Trasfer/Value Object : که به آن DTO یا VO یا TO هم گفته میشود این کلاس ها برای نقل و انتقال و نگه داری دیتا مورد استفاده قرار میگیرند


Data Access Object : کلاس هایی هستند که دیتای Entity را به Data Resource ارتباط میدهند و بعضی مواقع Transaction ها را مدیریت میکنند 


OOP : مراحل قبل را بصورت کد در می آوریم و پیاده سازی میکنیم


یک برنامه نویس حرفه ای شی گرا هیچ وقت کارش را از لایه ارائه یا طراحی DB شروع نمیکند گام اول شناسایی و در آوردن کلاس ها از روی usecase ها و مشخص کردن کارهایی که قرار است در سیستم انجام شود و ارتباط آن با قسمت های دیگر است 


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


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



اصولا در طراحی OOP دسترسی مستقیم field ها به بیرون از کلاس نمیدهیم و از setter و getter متد ها استفاده میکنیم که جز قواعد Java Bean است 

به setter متدها mutetor  و به getter متد ها accessor متد هم گفته میشود

متد getter تنها مقدار را برمی گرداند و نه متغییر را از اینرو نمیتوان مقدار جدیدی به متغییر مربوطه ارسال کرد و با استفاده از getter میتوان اطمینان حاصل کرد که عامل دیگری نمیتواند روی دیتای ما تاثیری نمیگذارد و تنها این عمل توسط setter قابل انجام است


طی پیشرفت OOP به مفاهیم موئلفه گرایی (COP (component oriented programming و (CBD (component base development که در آن مجموعه چندین Object را تبدیل میکنیم به یک Reusable Component که این کامپوننت ها به صورت مجموع در کنار هم قرار میدهند و برنامه ساخته میشود 

(RAD (rapid application developing بر همین اساس موئلفه گرایی ساخته میشود 


(AOP (aspect/agent oriented programming : همان OOP است اما یکسری قطعه کد به کد اصلی برنامه اضافه میکند که مثلا قبل از اجرای متد یک کاری را انجام دهد ، بعد از اتمام کار متد یک کاری دیگری انجام دهد و یا در حین رخ دادن خطا کاری دیگری انجام گیرد اضافه کردن Logger به برنامه یکی از ساده ترین کارهای قابل انجام است

اگر به کامپوننت های AOP یکسری امکانات و ویژگی های رفتار هوشمند اضافه شود یعنی بتوانند محیط خود را sens کنند و قابلیت تطبیق با محیط را داشته باشند ، گاهی بتوانند حرکت کنند و مابقی اعمال هوشمند را انجام دهند به دسته های دیگری تقسیم میشوند :

Mobile Agent : به agent هایی که میتوانند روی net حرکت کنند

Intelligent Agent : به agent هایی که قابلیت تطبیق با محیط را دارند



SOA : از مجموع component ها یک service بوجود می آید که بخشی از business  و مستقل باشند و به بخش های دیگر وابسته نباشند و به تنهایی قابل استفاده باشند service oriented architecture بوجود می آید که از فرمت SOAP برای تبادل داده استفاده میکند که بیشتر به صورت remote استفاده میشود به این سرویس ها web service هم گفته میشود