JavaRush /وبلاگ جاوا /Random-FA /اصول کپسولاسیون در جاوا

اصول کپسولاسیون در جاوا

در گروه منتشر شد
سلام! سخنرانی امروز به کپسولاسیون اختصاص داده خواهد شد و ما بلافاصله آن را با مثال هایی شروع خواهیم کرد :) در مقابل شما یک دستگاه نوشابه آشنا است. من یک سوال از شما دارم: چگونه کار می کند؟ سعی کنید با جزئیات پاسخ دهید: لیوان از کجا می آید، دمای داخل چگونه حفظ می شود، یخ در کجا ذخیره می شود، چگونه دستگاه می فهمد چه شربتی باید اضافه کند و غیره. به احتمال زیاد، شما پاسخی برای این سوالات ندارید. خوب، شاید همه از چنین ماشین‌هایی استفاده نکنند؛ این ماشین‌ها امروزه چندان محبوب نیستند. بیایید سعی کنیم مثال دیگری بزنیم. چیزی که می دانید هر روز بارها از آن استفاده می کنید. اوه، من یک ایده دارم! به ما بگویید موتور جستجوی گوگلاصول کپسولاسیون - 2 چگونه کار می کند . دقیقاً چگونه اطلاعات را بر اساس کلماتی که وارد کرده اید جستجو می کند؟ چرا این نتایج در راس هستند و سایر نتایج نیستند؟ حتی اگر هر روز از گوگل استفاده می کنید، احتمالاً آن را نمی دانید. اما مهم نیست. پس از همه، شما نیازی به دانستن این موضوع ندارید. شما می توانید پرس و جوها را در یک موتور جستجو وارد کنید بدون اینکه فکر کنید دقیقاً چگونه کار می کند. شما می توانید نوشابه را از یک دستگاه خودکار بدون اینکه بدانید چگونه کار می کند خریداری کنید. شما می توانید بدون بررسی عملکرد موتور احتراق داخلی، و بدون دانستن فیزیک، حتی در سطح مدرسه، یک ماشین رانندگی کنید. همه اینها به لطف یکی از اصول اصلی برنامه نویسی شی گرا امکان پذیر است - کپسوله سازی . در حین مطالعه مقالات مختلف در مورد این موضوع، احتمالاً به این واقعیت برخورد کرده اید که دو مفهوم رایج در برنامه نویسی وجود دارد - encapsulation و hiding . و با کلمه "کپسولاسیون" منظور نویسندگان یک چیز یا چیز دیگری است (همانطور که اتفاق می افتد). ما هر دو اصطلاح را تجزیه می کنیم تا درک کاملی داشته باشید. معنی اصلی کلمه encapsulation در برنامه نویسی ترکیبی از داده ها و روش های کار با این داده ها در یک بسته (کپسول) است . در جاوا، کلاس به عنوان یک بسته کپسول عمل می کند . یک کلاس شامل داده ها (فیلدهای کلاس) و متدهایی برای کار با این داده است. این برای شما بدیهی به نظر می رسد، اما در سایر مفاهیم برنامه نویسی همه چیز متفاوت عمل می کند. به عنوان مثال، در برنامه نویسی تابعی، داده ها به شدت از عملیات روی آن جدا می شوند. در OOP (برنامه نویسی شی گرا)، برنامه ها از کلاس های کپسولی تشکیل شده اند که هم داده و هم توابعی برای کار با آن هستند. حالا بیایید در مورد پنهان شدن صحبت کنیم . چگونه است که ما از انواع مکانیسم های پیچیده استفاده می کنیم بدون اینکه بفهمیم آنها چگونه کار می کنند و کار آنها بر چه اساسی است؟ ساده است: سازندگان آنها یک رابط کاربری ساده و کاربرپسند ارائه کرده انداصول کپسولاسیون - 3. در دستگاه نوشابه، رابط دکمه های روی یک پانل است. با فشردن یک دکمه، حجم لیوان را انتخاب می کنید. با فشردن مورد دوم، شربت را انتخاب می کنید. سومی مسئول افزودن یخ است. و این تنها کاری است که باید انجام دهید. مهم نیست که دستگاه دقیقاً چگونه در داخل طراحی شده است. نکته اصلی این است که به گونه ای طراحی شده است که برای دریافت نوشابه، کاربر باید سه دکمه را فشار دهد . در مورد ماشین هم همینطور است. مهم نیست درون او چه می گذرد. نکته اصلی این است که وقتی پدال سمت راست را فشار می دهید، ماشین جلو می رود و وقتی پدال سمت چپ را فشار می دهید سرعتش کم می شود . این دقیقاً ماهیت پنهان کاری است. تمام "درون" برنامه از کاربر پنهان است. برای او، این اطلاعات اضافی و غیر ضروری است. کاربر به نتیجه نهایی نیاز دارد نه فرآیند داخلی. بیایید به عنوان مثال به کلاس نگاه کنیم Auto:
public class Auto {

   public void gas() {

       /*some complicated things are happening inside the car
       as a result of which it goes forward*/
   }

   public void brake() {

       /*some complicated things are happening inside the car
       as a result of which it slows down*/
   }

   public static void main(String[] args) {

       Auto auto = new Auto();

       // How everything looks to the user

       //pressed one pedal - went
       auto.gas();

       //pressed another pedal - braked
       auto.brake();
   }
}
این چیزی است که پنهان سازی پیاده سازی در یک برنامه جاوا به نظر می رسد. همه چیز مانند زندگی واقعی است: یک رابط (روش ها) به کاربر ارائه می شود. اگر برای انجام یک عمل به ماشین موجود در برنامه نیاز دارد، فقط باید روش مورد نظر را فراخوانی کند. و آنچه در داخل این روش ها اتفاق می افتد اطلاعات غیر ضروری است، نکته اصلی این است که همه چیز همانطور که باید کار می کند. در اینجا ما در مورد پنهان کردن پیاده سازی صحبت کردیم . علاوه بر این، جاوا همچنین دارای مخفی کردن داده ها است . ما در سخنرانی در مورد گیرندگان و ستترها در مورد آن نوشتیم ، اما یادآوری شما ضرری ندارد. به عنوان مثال، ما یک کلاس داریم Cat:
public class Cat {

   public String name;
   public int age;
   public int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }


}
شاید از آخرین سخنرانی به یاد داشته باشید که مشکل این کلاس چیست؟ اگر نه، یادمان باشد. مشکل این است که داده ها (فیلدهای) او برای همه باز است و برنامه نویس دیگری می تواند به راحتی یک گربه بی نام در برنامه با وزن 0 و سن -1000 سال ایجاد کند:
public static void main(String[] args) {

   Cat cat = new Cat();
   cat.name = "";
   cat.age = -1000;
   cat.weight = 0;

}
در چنین شرایطی، می توانید از نزدیک نظارت کنید که آیا یکی از همکاران شما در حال ایجاد اشیاء با حالت اشتباه است یا خیر، اما بسیار بهتر است که احتمال ایجاد چنین "اشیاء اشتباه" را حذف کنید. اصول کپسولاسیون - 4 آنها به ما در پنهان کردن داده ها کمک می کنند:
  1. اصلاح کننده های دسترسی ( خصوصی ، محافظت شده ، پیش فرض بسته
  2. گیرنده و تنظیم کننده
در آنجا می‌توانیم، برای مثال، بررسی کنیم که آیا کسی می‌خواهد یک عدد منفی را به عنوان سن گربه نسبت دهد. همانطور که قبلاً گفتیم، منظور نویسندگان مقالات مختلف در مورد کپسوله‌سازی یا کپسوله‌سازی (ترکیب داده‌ها و روش‌ها)، یا پنهان کردن یا هر دو است. جاوا هر دو مکانیسم را دارد (الزاماً در سایر زبان های OOP اینطور نیست)، بنابراین گزینه دوم صحیح ترین است. استفاده از کپسولاسیون چندین مزیت مهم به ما می دهد:
  1. نظارت بر وضعیت صحیح جسم. نمونه هایی از این بالا وجود داشت: به لطف تنظیم کننده و اصلاح کننده خصوصی، ما از برنامه خود در برابر گربه هایی با وزن 0 محافظت کردیم.

  2. کاربرپسند بودن به دلیل رابط کاربری. ما فقط روش‌ها را «خارج» برای دسترسی کاربر می‌گذاریم. تنها کاری که او باید انجام دهد این است که با آنها تماس بگیرد تا نتیجه را بگیرد، و اصلاً نیازی به کندوکاو در جزئیات کار آنها نیست.

  3. تغییرات در کد تاثیری بر کاربران ندارد. ما همه تغییرات را در روش ها ایجاد می کنیم. این روی کاربر تأثیری نخواهد داشت: او auto.gas() را برای گاز ماشین نوشت، بنابراین آن را خواهد نوشت. و این واقعیت که ما چیزی را در عملکرد متد gas() تغییر دادیم برای او نامرئی می ماند: او، مانند قبل، به سادگی نتیجه دلخواه را دریافت خواهد کرد.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION