JavaRush /وبلاگ جاوا /Random-FA /مفاهیم برنامه نویسی شی گرا جاوا
shabnahm
مرحله

مفاهیم برنامه نویسی شی گرا جاوا

در گروه منتشر شد
جاوا مبتنی بر مفاهیم برنامه نویسی شی گرا است که به شما اجازه می دهد تا به سطح بالاتری از انتزاع بروید تا هر مشکلی را به روشی واقع بینانه حل کنید. رویکرد شی گرا راه حل یک مشکل را بر اساس اشیاء دنیای واقعی که استفاده مجدد در یک برنامه آسان تر است، مفهوم سازی می کند. مثلا Chair(صندلی)، Fan(پنکه)، Dog(سگ)، Computer(کامپیوتر) و غیره. در جاوا، کلاس یک طرح، قالب یا نمونه اولیه است که رفتار کلی یک شی از یک نوع معین را تعریف می کند. یک نمونه یک پیاده سازی جداگانه از یک کلاس است و همه نمونه های یک کلاس دارای ویژگی های یکسانی هستند که در تعریف کلاس توضیح داده شده است. به عنوان مثال، می توانید کلاسی به نام House را با تعداد اتاق به عنوان یک ویژگی تعریف کنید و نمونه هایی از کلاس مانند خانه دو اتاقه، خانه سه اتاقه و ... ایجاد کنید. مفاهیم برنامه نویسی شی گرا جاوا - 1مزایا: در زیر برخی از مزایای توسعه نرم افزار شی گرا ذکر شده است.
  • کاهش هزینه های پشتیبانی نرم افزار، عمدتاً به دلیل این واقعیت است که به صورت ماژولار انجام می شود.
  • بهبود استفاده مجدد از کد از طریق ویژگی‌هایی مانند وراثت و در نتیجه توسعه سریع‌تر نرم‌افزار.
  • افزایش قابلیت اطمینان و انعطاف کد.
  • سهولت درک به دلیل شبیه سازی دنیای واقعی.
  • انتزاع بهتر در سطح شی.
  • کاهش پیچیدگی انتقال از یک مرحله توسعه به مرحله دیگر.
چهار ویژگی اصلی OOP وجود دارد:
  • کپسوله سازی
  • وراثت
  • پلی مورفیسم
  • انتزاع - مفهوم - برداشت

کپسوله سازی

کپسولاسیون به عنوان یک قرارداد برای یک شی عمل می کند که چه چیزی را باید پنهان کند و چه چیزی را برای دسترسی اشیاء دیگر باز کند. در جاوا، ما از یک اصلاح کننده دسترسی privateبرای مخفی کردن یک روش و محدود کردن دسترسی به یک متغیر از دنیای خارج استفاده می کنیم. JAVA همچنین دارای اصلاح کننده های دسترسی مختلفی است: public, default, protected, private, که برای محدود کردن دید در سطوح مختلف استفاده می شود. اما هدف نهایی این است که چیزهایی را در بر بگیرد که نباید تغییر کنند. رویکردی که بهترین کار را دارد این است که یک کلاس باید فقط یک دلیل برای تغییر داشته باشد، و کپسوله‌سازی طراحی آن «یک دلیل» را به واقعیت تبدیل می‌کند. رویکرد صحیح به کپسوله‌سازی پنهان کردن چیزهایی است که مرتباً تغییر می‌کنند تا از آسیب رساندن به کلاس‌های دیگر جلوگیری شود. مزایا: در زیر به برخی از مزایای کپسولاسیون اشاره شده است:
  • ما می توانیم با پنهان کردن ویژگی های یک شی، از وضعیت داخلی آن محافظت کنیم.
  • این ماژولار بودن کد را بهبود می بخشد زیرا مانع از تعامل اشیا به روش های غیرمنتظره می شود.
  • قابلیت استفاده کد را بهبود می بخشد.
  • این از رابطه قراردادی یک نهاد خاص پشتیبانی می کند.
  • کپسوله سازی نگهداری نرم افزار را آسان تر می کند.
  • تغییرات در کد را می توان مستقل از یکدیگر انجام داد.

پلی مورفیسم

چند شکلی در برنامه نویسی توانایی ارائه رابط یکسان برای اشکال مختلف زیرین (انواع داده) است. این بدان معناست که کلاس‌هایی که عملکردهای متفاوتی دارند، رابط یکسانی دارند و می‌توان آنها را به صورت پویا با ارسال پارامترها توسط مرجع فراخوانی کرد. یک مثال کلاسیک کلاس Shape(شکل) و تمام کلاس هایی است که از آن به ارث می برند: square(مربع)، circle(دایره)، dodecahedron(دوده وجهی)، irregular polygon(چند ضلعی نامنظم)، splat(بلب)، و غیره. در این مثال، هر کلاس متد خاص خود را خواهد داشت Draw()و کد کلاینت به سادگی می تواند این کار را انجام دهد:
Shape shape = new Shape();
Shape.area()برای به دست آوردن رفتار صحیح از هر شکل زیبایی چندشکلی در این است که کد با کلاس های مختلف کار می کند، نیازی به دانستن اینکه از کدام کلاس استفاده می کند، ندارد، زیرا همه آنها بر اساس یک اصل کار می کنند. فرآیندی که توسط زبان های برنامه نویسی شی گرا برای پیاده سازی چندشکلی پویا استفاده می شود، اتصال پویا نامیده می شود. توجه: چند شکلی توانایی انتخاب روش های خاص تر برای اجرا بسته به شی است. پلی مورفیسم زمانی رخ می دهد که کلاس های انتزاعی درگیر نباشند. مزایای:
  • ایجاد کد قابل استفاده مجدد یعنی زمانی که یک کلاس ایجاد، پیاده سازی و آزمایش شد، می توان آزادانه از آن استفاده کرد بدون اینکه نگران چیزی باشد که دقیقاً در آن نوشته شده است.
  • این اجازه می دهد تا کدهای عمومی تر و با همبستگی ضعیف تر.
  • زمان کامپایل کاهش می یابد، که سرعت توسعه را افزایش می دهد.
  • لینک دهی پویا
  • از همین رابط می توان برای ایجاد روش هایی با پیاده سازی های مختلف استفاده کرد.
  • کل پیاده سازی را می توان با استفاده از امضاهای روش مشابه جایگزین کرد.
نادیده گرفتن روش به عنوان بخشی از چندشکلی. یک override با دو متد تعامل دارد: یک متد در کلاس والد و یک متد در کلاس مشتق شده. این روش ها دارای نام و امضاهای یکسانی هستند. Overriding به شما این امکان را می دهد که عملیات مشابهی را به روش های مختلف برای انواع مختلف اشیاء انجام دهید. مثلا:
while(it.hasNext()) {
Shape s = (Shape) it.next();
totalArea += s.area(dim); //будет применен полиморфизм и вызван нужный метод для каждого an object.
}
مفاهیم برنامه نویسی شی گرا جاوا - 2بارگذاری بیش از حد روش یا چندشکلی موقت یا چندشکلی ایستا Overloading با چندین روش از یک کلاس که نام یکسانی دارند اما دارای امضای روش متفاوتی هستند، تعامل دارد. بارگذاری مجدد به شما این امکان را می دهد که عملیات مشابه را به روش های مختلف برای داده های مختلف توصیف کنید. گاهی اوقات به آن چندشکلی استاتیک می گویند، اما در واقع چندشکلی نیست. این چیزی نیست جز داشتن دو روش با نام های یکسان، اما فهرست متفاوتی از آرگومان ها. راه اندازی مجدد ربطی به وراثت و چند شکلی ندارد. و روشی که بیش از حد بارگذاری شده است به هیچ وجه مشابه روش سرپوشیده نیست. چند شکلی پارامتریک از طریق Generication در JAVA هنگام اعلان یک کلاس، فیلد نام را می توان با انواع مختلف و نام متد را با پارامترها و انواع بازگشتی های مختلف مرتبط کرد. جاوا با استفاده از ژنریک از پلی مورفیسم پارامتریک پشتیبانی می کند.
List<String> list = new ArrayList<String>();
چرا نمی توانیم یک متد استاتیک را در جاوا لغو کنیم؟ Overriding به وجود نمونه ای از کلاس بستگی دارد. ایده چند ریختی این است که شما می توانید یک زیر کلاس ایجاد کنید و اشیاء پیاده سازی شده توسط آن زیر کلاس ها با روش های مشابه کلاس والد (در زیر کلاس ها لغو شده اند) رفتار متفاوتی خواهند داشت. یک متد استاتیک با هیچ نمونه ای از کلاس مرتبط نیست، بنابراین مفهوم overriding خود را نمی توان اعمال کرد. سازندگان JAVA توسط دو ملاحظه هدایت شدند که بر این رویکرد تأثیر گذاشت. اول، مشکلات اجرای کد وجود دارد: انتقادات زیادی از Smalltalk به دلیل کند بودن (جمع آوری زباله و چندشکلی بخشی از این مشکل بود) وجود داشت، و JAVA برای جلوگیری از این موضوع طراحی شده بود. دومین نکته این بود که مخاطبان JAVA توسعه دهندگان ++C باشند. داشتن متدهای استاتیک به این روش برای برنامه نویسان ++C بسیار آشنا بود، و همچنین سرعت کار را افزایش داد، زیرا نیازی به بالا رفتن از سلسله مراتب کلاس برای فهمیدن اینکه کدام متد را فراخوانی کنید وجود نداشت. شما مستقیماً به کلاس می روید و یک متد خاص را فراخوانی می کنید.

وراثت

وراثت عبارت است از ترکیب رفتار (مثلاً متدها) و حالت (یعنی متغیرها) یک کلاس پایه در یک کلاس مشتق شده به طوری که آنها در آن کلاس مشتق شده در دسترس قرار گیرند. مزیت اصلی وراثت این است که مکانیزم رسمی برای استفاده مجدد از کد فراهم می کند و از تکرار جلوگیری می کند. یک کلاس ارثی با کپی کردن رفتار کلاس والد و افزودن عملکرد جدید، عملکرد برنامه را گسترش می دهد. این باعث می شود که کد بسیار جفت شود. اگر می خواهید سوپرکلاس را تغییر دهید، باید تمام جزئیات زیر کلاس ها را بدانید تا کد را خراب نکنید. وراثت نوعی استفاده مجدد از نرم افزار است که در آن یک کلاس جدید (زیر کلاس) از یک کلاس موجود (سوپر کلاس) ایجاد می شود که عملکرد آن را گسترش می دهد و از برخی از ویژگی های سوپرکلاس استفاده می کند. بنابراین اگر شما یک کلاس والد داشته باشید و سپس یک کلاس فرزند ظاهر شود، کودک تمام چیزهایی را که والدین دارد به ارث می برد. مزایای:
  • استفاده مجدد از کد بهبود یافته
  • رابطه منطقی "است" (کسی است، چیزی است) برقرار می شود. به عنوان مثال: سگ یک حیوان n است . (سگ حیوان است).
  • ماژولارسازی کد
  • تکرارها مستثنی هستند.
نقص:
  • Tightly Coupd: یک زیر کلاس به پیاده سازی یک کلاس والد بستگی دارد و باعث می شود که کد به طور محکم جفت شود.

انتزاع - مفهوم - برداشت

Abstraction به معنای طراحی کلاس ها بر اساس رابط ها و عملکرد آنها، بدون در نظر گرفتن جزئیات پیاده سازی است. یک کلاس انتزاعی، اینترفیس ها را بدون گنجاندن پیاده سازی واقعی نشان می دهد. اجرای یک شی را از رفتار آن متمایز می کند. Abstraction کد را با پنهان کردن جزئیات غیر مهم ساده می کند. مزایای:
  • با استفاده از انتزاع، می‌توانیم آنچه را که می‌توان به نوعی گروه‌بندی کرد، جدا کرد.
  • ویژگی‌ها و روش‌هایی که اغلب اصلاح می‌شوند را می‌توان در یک نوع جداگانه گروه‌بندی کرد، بنابراین نوع اصلی دستخوش تغییر نخواهد شد. این اصل OOP را تقویت می کند: "کد باید برای برنامه افزودنی باز باشد، اما برای تغییر بسته باشد . "
  • Abstraction نمایش مدل های دامنه را ساده می کند.
تفاوت بین انتزاع و کپسوله سازی کپسوله سازی یک استراتژی است که به عنوان بخشی از انتزاع استفاده می شود. کپسولاسیون به ساختار یک شی اشاره دارد: اشیا ویژگی های خود را محصور می کنند و آنها را از دسترسی بیرونی پنهان می کنند. کاربران یک کلاس با استفاده از متدهای آن با آن تعامل دارند، اما دسترسی مستقیم به ساختار کلاس ندارند. به این ترتیب کلاس جزئیات پیاده سازی مربوط به طراحی خود را خلاصه می کند. انتزاع اصطلاح کلی تری است. همچنین می توان از جمله با استفاده از زیر کلاس ها به آن دست یافت. به عنوان مثال، یک کلاس List(فهرست) در کتابخانه استاندارد، یک انتزاع برای دنباله ای از عناصر است که با توجه به مکان آنها در لیست نمایه می شود. نمونه های خاص یک لیست Listهستند ArrayListیا LinkedList. کدی که با یک لیست در تعامل است، Listجزئیات لیستی را که از آن استفاده می‌کند، انتزاع می‌کند. اغلب انتزاع بدون پنهان کردن حالت زیربنایی با استفاده از کپسوله کردن امکان پذیر نیست. اگر یک کلاس ساختار داخلی خود را نشان دهد، نمی تواند عملیات داخلی خود را تغییر دهد و بنابراین نمی تواند انتزاع شود. کلاس انتزاعی و روش انتزاعی چیست؟ این اتفاق می افتد که در طول توسعه می خواهید یک کلاس پایه فقط برای کلاس های مشتق شده خود یک رابط ارائه دهد. یعنی شما نمی خواهید کسی نمونه هایی از کلاس پایه ایجاد کند. شما باید از رابط به گونه ای استفاده کنید که فقط اشیاء را به آن بفرستید (این یک cast ضمنی است که اجازه رفتار چندشکلی را می دهد). این امر با انتزاعی کردن این کلاس با استفاده از کلمه کلیدی به دست می آید abstract. این محدودیت‌هایی را اعمال می‌کند، مانند عدم توانایی در ایجاد نمونه‌های یک کلاس انتزاعی؛ هنگام استفاده از یک کلاس انتزاعی، باید متدهای انتزاعی را پیاده‌سازی کرد. این امر پلی مورفیسم را تضمین می کند. یک کلاس انتزاعی می تواند شامل هر دو روش انتزاعی و مشخص باشد. اگر حداقل یک متد در یک کلاس انتزاعی اعلام شود، کل کلاس نیز باید انتزاعی اعلام شود. با این حال، قانون در جهت مخالف لازم نیست رعایت شود. اگر کلاسی انتزاعی اعلام شود، ممکن است حاوی متدهای انتزاعی نباشد. روشی که صرفاً امضاهای خود را تعریف می کند و پیاده سازی را ارائه نمی دهد، انتزاعی نامیده می شود. اجرای واقعی آن به زیر کلاس های آن واگذار می شود که کلاس انتزاعی را گسترش می دهند. یک متد انتزاعی نمی تواند توسط یک شی استفاده شود، فقط کلاس دیگری می تواند آن را گسترش دهد. چه زمانی باید از کلاس انتزاعی استفاده کرد؟ کلاس های انتزاعی به شما این امکان را می دهند که برخی از رفتارهای پیش فرض را تعریف کنید و زیر کلاس ها هر رفتار خاصی را ارائه دهند. به عنوان مثال: List(list) یک رابط است، به نوبه خود AbstractListرفتار اساسی یک لیست را تعریف می کند، که می تواند به عنوان مثال در یک زیر کلاس استفاده شود یا در یک زیر کلاس، به عنوان مثال، در ArrayList(آرایه لیست) استفاده شود. رابط چیست؟ مفهوم واسط یک کلاس انتزاعی است، اما رابط (که با کلمه کلیدی تعریف می شود interface) یک قدم فراتر می رود. اصلاً از اجرای یک متد یا تابع جلوگیری می کند. شما فقط می توانید یک متد یا تابع را اعلام کنید، اما نمی توانید اجرای آن را ارائه دهید. کلاسی که اینترفیس را پیاده سازی می کند باید از پیاده سازی واقعی مراقبت کند. رابط ها بسیار مفید هستند و به طور گسترده در OOP استفاده می شوند. از آنجایی که آنها خود رابط و پیاده سازی را به اشتراک می گذارند، مزایای استفاده از آنها را ارائه می دهند:
  1. ارث چندگانه .
  2. اتصال سست . یک انتزاع از عملیات، مانند لایه بندی وجود دارد، و اجرای بتن می تواند هر چیزی باشد: JDBC، JPA، JTA و غیره.
  3. برنامه رابط پیاده سازی نشده است .
  4. پلی مورفیسم اتصال پویا : رابط برنامه نویسی یک شی بدون آشکارسازی اجرای واقعی آن در معرض دید قرار می گیرد.
  5. سطوح انتزاعی ، جداسازی عملکرد.
تفاوت بین کلاس رابط و انتزاعی
  • واسط یک رابطه قراردادی با کلاس هایی است که این رابط را پیاده سازی می کنند و بیان می کند که پیاده سازی به روش تعیین شده توسط رابط انجام می شود. این یک پوسته خالی با متدهای اعلام شده است.
  • یک کلاس انتزاعی برخی از رفتارهای کلی را تعریف می کند و از زیر کلاس های خود می خواهد که رفتار غیر معمول یا خاص را برای کلاس خود تعریف کنند.
  • متدها و اعضای یک کلاس انتزاعی را می توان با هر اصلاح کننده دسترسی تعیین کرد؛ به نوبه خود، تمام متدهای رابط باید عمومی باشند.
  • هنگام به ارث بردن یک کلاس انتزاعی، کلاس نزول باید متدهای انتزاعی را تعریف کند، در حالی که یک واسط می تواند واسط دیگری را بدون اینکه الزاماً متدهای آن را تعریف کند، به ارث می برد.
  • یک کلاس decendant می تواند تنها یک کلاس انتزاعی را گسترش دهد، اما یک رابط می تواند گسترش یابد یا یک کلاس می تواند بسیاری از اینترفیس های دیگر را پیاده سازی کند.
  • یک کلاس فرعی می‌تواند متدهای انتزاعی را با اصلاح‌کننده دسترسی محدود یا یکسان تعریف کند، اما کلاسی که رابط را پیاده‌سازی می‌کند باید متدهایی را با همان سطح دید تعریف کند.
  • یک رابط شامل سازنده نیست، در حالی که یک کلاس انتزاعی شامل می شود.
  • متغیرهای اعلام شده در رابط جاوا به طور پیش فرض نهایی هستند. یک کلاس انتزاعی می تواند شامل متغیرهایی باشد که نهایی نیستند.
  • همه اعضای رابط جاوا هستند public. اعضای یک کلاس انتزاعی می توانند باشند publicو protectedغیره باشند.

ترکیب بندی

استفاده مجدد از کد را می توان با استفاده از وراثت و ترکیب به دست آورد. اما استفاده از ترکیب، سطح بالاتری از کپسوله‌سازی را نسبت به وراثت فراهم می‌کند، زیرا تغییرات در کلاس back-end لزوماً بر کد متعلق به کلاس front-end تأثیر نمی‌گذارد. ترکیب یک تکنیک طراحی است که از روابط "has-a" (دارا، شامل) در کلاس ها استفاده می کند. هم وراثت جاوا و هم ترکیب شی می توانند برای استفاده مجدد از کد استفاده شوند. ماهیت ترکیب عبارت است از بیان رابطه "دارای" بین اشیا. به یک صندلی فکر کنید. صندلی دارای صندلی است. صندلی پشتی دارد. یک صندلی تعداد پایه مشخصی دارد. عبارت "دارای یک" رابطه ای را نشان می دهد که در آن صندلی دارای شی دیگری است یا حداقل از آن استفاده می کند. این دقیقاً رابطه "has-a" است که اساس ترکیب است. مزایای:
  • کنترل دید
  • پیاده سازی را می توان در زمان اجرا جایگزین کرد
  • اتصال شل، از آنجایی که کلاس رابط به پیاده سازی بستگی ندارد.
تفاوت بین ترکیب و ارث
خیر ترکیب (دارای / دارد) وراثت (یک / است)
1 از پلی مورفیسم و ​​استفاده مجدد از کد پشتیبانی می کند. از پلی مورفیسم و ​​استفاده مجدد از کد پشتیبانی می کند.
2 شیء زمان اجرا قبلاً ایجاد شده است. شی به صورت پویا در زمان کامپایل ایجاد می شود.
3 پیاده سازی را می توان در زمان اجرا جایگزین کرد. پیاده سازی را می توان در زمان کامپایل تغییر داد.
4 یک زیر کلاس مستقل از کلاس والد خود است، که طرفدار جفت آزاد (به ویژه تحت کنترل رابط) است. زیر کلاس به پیاده سازی کلاس والد وابسته است، بنابراین اتصال قوی در نظر گرفته می شود.
5 استفاده: خانه دارای حمام است. اشتباه است که بگوییم خانه حمام است. وراثت یک طرفه است: خانه یک ساختمان است. اما ساختمان خانه نیست.
توجه: از وراثت فقط برای اطمینان از استفاده مجدد از کد استفاده نکنید. اگر رابطه ای وجود نداشته باشد (است)، ترکیب برای این اهداف استفاده می شود. تفاوت بین ترکیب و تجمیع در روابط شی است. تجمیع رابطه ای است که در آن یک کلاس در یک مجموعه قرار می گیرد. این بخشی از یک رابطه کل است، جایی که جزء می تواند بدون کل وجود داشته باشد. چنین روابطی بسیار ضعیف تر است. وابستگی چرخه ای وجود ندارد. به عنوان مثال: سفارش و محصول. ترکیب رابطه ای است که در آن یک کلاس در یک مجموعه قرار می گیرد. بخشی از یک رابطه کل است که در آن جزء بدون کل نمی تواند وجود داشته باشد. اگر کل از بین برود، تمام اجزای آن نیز از بین می رود. این یک رابطه قوی تر است. به عنوان مثال: یک چند ضلعی و رئوس آن، یک نظم و جزء آن.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION