جاوا

جلسه ۲۶: درک مفهوم کپسوله سازی با کمک مثال در جاوا

// User Class
class User {

  // Public Fields
  public String userName;
  public String password;

  // Parameterized Constructor to create new users
  public User(String userName, String password) { 
    this.userName = userName;
    this.password = password;
  }

  public void login(String userName, String password) {
    //Check if the username and password match
    if (this.userName.toLowerCase().equals(userName.toLowerCase()) && this.password.equals(password)) { 
    // .toLowrcase converts all the characters to lowercase & .equals checks if two strings match

      System.out.println("Access Granted against the username: "+this.userName +" and password: "+this.password);
    }
    else System.out.println("Invalid Credentials!"); //Else invalid credentials
  }

}

class Main {
  
  public static void main(String[] args) {
    User educative = new User("Educative","12345"); //Creates a new user and stores the password and username

    educative.login("Educative","12345"); //Grants access because credentials are valid

    educative.login("Educative", "3456"); //Does not grant access because the credentials are invalid

    educative.password = "3456"; //OOPS SOMEONE ACCESSED THE PASSWORD FIELD

    educative.login("Educative", "3456"); // GRANTS ACCESS BUT THIS SHOULD NOT HAVE HAPPENED!
  }
  
}
در کدهای مثال فوق ، می توان مشاهده کرد که هرکسی می تواند از طریق متد ()main مستقیماً به فیلد های رمز عبور (password) و نام کاربری (userName) دسترسی داشته باشد و آنها را تغییر دهد یا چاپ کند. این دسترسی ها در مورد این کلاس کاربری خطرناک است زیرا هیچ کپسوله سازی در اطلاعات کاربری وجود ندارد و هر کسی می تواند با دستکاری در داده های ذخیره شده به حساب دیگران دسترسی پیدا کند. بنابراین در کدهای فوق یک روش مناسب بکار نرفته است.

یک مثال خوب

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

// User Class
class User {

  // Private fields
  private String userName; 
  private String password;     

  //Parameterzied constructor to create a new users
  public User(String userName, String password) {    
    this.userName = userName;
    this.password = password;
  }

  public void login(String userName, String password) {
    //Check if the username and password match
    if (this.userName.toLowerCase().equals(userName.toLowerCase()) && this.password.equals(password)) { 
    // .toLowrcase converts all the characters to lowercase & .equals checks if two strings match

      System.out.println("Access Granted against the username: "+this.userName +" and password: "+this.password);
    }
    else System.out.println("Invalid Credentials!"); //Else invalid credentials
  }

}

class Main {
  
  public static void main(String[] args) {
    User educative = new User("Educative","12345"); //Creates a new user and stores the password and username

    educative.login("Educative","12345"); //Grants access because credentials are valid

    educative.login("Educative", "3456"); //Does not grant access because the credentials are invalid

    //educative.password = "3456"; //Uncommenting this line will give an error
                                   //Fields of User class cannot be accessed now
  }
  
}
در مثال بالا ، فیلدهای userName و password به صورت private (خصوصی) اعلام شده است. به عنوان یک قاعده کلی ، در یک کلاس ، تمام متغیرهای عضو باید خصوصی اعلام شوند و برای دسترسی به آن داده ها یا استفاده از آن داده ها می توان متدهای عمومی مانند متدهایی برای خواندن داده ها (getter) ، تغییر داده ها (setter) و سایر متدهای سفارشی را پیاده سازی کرد. این مفهوم کپسول سازی است. تمامی فیلدهای حاوی داده ها خصوصی هستند و متدهای ارائه دهنده رابط برای دسترسی به داده ها ، عمومی هستند.در این جلسه، با کمک چند مثال ، مفهوم کپسوله سازی در جاوا را بهتر درک می کنیم. موارد زیر را بیان خواهیم کرد
  • یک مثال بد
  • یک مثال خوب
همانطور که قبلاً بحث شد ، کپسوله سازی به مفهوم قرار دادن (مقید کردن) داده ها و متدهای مربوط به آن داده ها در یک واحد منفرد به نام کلاس اشاره دارد. هدف این است که از دسترسی ناخواسته توسط کدهای خارج از این کلاس به این داده های مقید جلوگیری شود. این هدف را با استفاده از یک مثال ابتدایی از کلاس کاربر (User) بیشتر بررسی می کنیم. فرض کنید که ما درحال طراحی یک برنامه و در مرحله مدل سازی ورود به سیستم در آن برنامه هستیم. ما می دانیم که یک کاربر برای ورود به برنامه به نام کاربری و رمزعبور نیاز دارد. یک کلاس کاربر بسیار ابتدایی به صورت زیر مدل می شود:
  • داشتن فیلدی برای نام کاربری (userName)
  • داشتن فیلدی برای رمز عبور (password)
  • متدی به نام ()login برای ورود به سیستم
هر زمان که کاربر جدیدی می آید ، می توان با ارسال userName و password به سازنده این کلاس ، یک شی جدید ایجاد کرد.

یک مثال بد

اکنون زمان پیاده سازی کلاس User است.

کد مطابق با تصویر بالا در زیر آورده شده است:
// User Class
class User {

  // Public Fields
  public String userName;
  public String password;

  // Parameterized Constructor to create new users
  public User(String userName, String password) { 
    this.userName = userName;
    this.password = password;
  }

  public void login(String userName, String password) {
    //Check if the username and password match
    if (this.userName.toLowerCase().equals(userName.toLowerCase()) && this.password.equals(password)) { 
    // .toLowrcase converts all the characters to lowercase & .equals checks if two strings match

      System.out.println("Access Granted against the username: "+this.userName +" and password: "+this.password);
    }
    else System.out.println("Invalid Credentials!"); //Else invalid credentials
  }

}

class Main {
  
  public static void main(String[] args) {
    User educative = new User("Educative","12345"); //Creates a new user and stores the password and username

    educative.login("Educative","12345"); //Grants access because credentials are valid

    educative.login("Educative", "3456"); //Does not grant access because the credentials are invalid

    educative.password = "3456"; //OOPS SOMEONE ACCESSED THE PASSWORD FIELD

    educative.login("Educative", "3456"); // GRANTS ACCESS BUT THIS SHOULD NOT HAVE HAPPENED!
  }
  
}
در کدهای مثال فوق ، می توان مشاهده کرد که هرکسی می تواند از طریق متد ()main مستقیماً به فیلد های رمز عبور (password) و نام کاربری (userName) دسترسی داشته باشد و آنها را تغییر دهد یا چاپ کند. این دسترسی ها در مورد این کلاس کاربری خطرناک است زیرا هیچ کپسوله سازی در اطلاعات کاربری وجود ندارد و هر کسی می تواند با دستکاری در داده های ذخیره شده به حساب دیگران دسترسی پیدا کند. بنابراین در کدهای فوق یک روش مناسب بکار نرفته است.

یک مثال خوب

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

// User Class
class User {

  // Private fields
  private String userName; 
  private String password;     

  //Parameterzied constructor to create a new users
  public User(String userName, String password) {    
    this.userName = userName;
    this.password = password;
  }

  public void login(String userName, String password) {
    //Check if the username and password match
    if (this.userName.toLowerCase().equals(userName.toLowerCase()) && this.password.equals(password)) { 
    // .toLowrcase converts all the characters to lowercase & .equals checks if two strings match

      System.out.println("Access Granted against the username: "+this.userName +" and password: "+this.password);
    }
    else System.out.println("Invalid Credentials!"); //Else invalid credentials
  }

}

class Main {
  
  public static void main(String[] args) {
    User educative = new User("Educative","12345"); //Creates a new user and stores the password and username

    educative.login("Educative","12345"); //Grants access because credentials are valid

    educative.login("Educative", "3456"); //Does not grant access because the credentials are invalid

    //educative.password = "3456"; //Uncommenting this line will give an error
                                   //Fields of User class cannot be accessed now
  }
  
}
در مثال بالا ، فیلدهای userName و password به صورت private (خصوصی) اعلام شده است. به عنوان یک قاعده کلی ، در یک کلاس ، تمام متغیرهای عضو باید خصوصی اعلام شوند و برای دسترسی به آن داده ها یا استفاده از آن داده ها می توان متدهای عمومی مانند متدهایی برای خواندن داده ها (getter) ، تغییر داده ها (setter) و سایر متدهای سفارشی را پیاده سازی کرد. این مفهوم کپسول سازی است. تمامی فیلدهای حاوی داده ها خصوصی هستند و متدهای ارائه دهنده رابط برای دسترسی به داده ها ، عمومی هستند.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا