Friday, July 27, 2018

অবজেক্ট অরিয়েন্টেড প্রোগ্রামিং - ৮ঃ এসোসিয়েশন রিলেশনশিপ


একটা ক্লাসের অবজেক্টকে যদি অন্য ক্লাসে ডাটা ফিল্ড হিসেবে ইউজ করতে চাই সেক্ষেত্রে দুই ক্লাসের মধ্যে যে সম্পর্ক তৈরী হয় তাই হল এ্যাসোসিয়েশন রিলেশনশীপ।

আমরা ইন্টেজার ডাটা রাখার জন্য ভেরিয়েবল ইউজ করি, নাম বা স্ট্রিং রাখার জন্য স্ট্রিং ডাটা ভেরিয়েবল ইউজ করি। কিন্তু আমরা যদি চাই স্টুডেন্ট টাইপ ডাটা রাখতে? যেহেতু সেরকম কোন ডাটা টাইপ নাই সেহেতু আমরা সেই ডাটা টাইপ বানাতে পারবো। আমরা অলরেডি জানি ক্লাস দিয়ে সেই ডাটা টাইপ বানানো যায়। তাহলে আমরা সে ডাটা টাইপ টা বানিয়ে ফেলি যা যা প্রয়োজন তা দিয়ে। এটাকে কাস্টমাইজড ডাটা টাইপও বলা চলে।

আমরা প্রিমিটিভ ডাটা যেমন integer, double, float ইত্যাদি টাইপের ডাটা রাখার জন্য সিমপ্লি ঐ নামের ভেরিয়েবল ডিক্লেয়ার করলেই কাজ হয়ে যায়। কাজটা অনেক সোজা কারন ইন্টেজার, ডাবল, ফ্লোট এসব প্রিমিটিভ টাইপ এবং এদেরকে ভাংলে অন্য কোন ডাটা টাইপ খুঁজে পাওয়া যাবেনা। এদেরকে সরাসরি অ্যসাইনমেন্ট অপারেটর দিয়ে অ্যাসাইন করে ফেলা যায়। কিন্তু কাস্টমাইজড ডাটা টাইপের ভেতর অনেকগুলো প্রিমিটিভ ডাটা ফিল্ড এবং মেথড থাকতে পারে। সেটা ডট দিয়ে অ্যাক্সেস করা যায় তা আমরা অলরেডি জানিই।

এ্যাসোসিয়েশন মোটামুটি ২ ধরনের-

১। এগ্রেগেশন(Aggregation) 

আমরা জানি, একটা ইউনিভার্সিটির প্রতিটা ডিপার্টমেন্ট এর আন্ডারে অনেকগুলো স্টুডেন্ট থাকে। সেহেতু ডিপার্টমেন্ট এর আন্ডারে একটা স্টুডেন্ট এর লিস্ট থাকবে। ব্যপারটা UML আকারে দেখার চেষ্টা করি-


এই দুটির জন্য দুটো ক্লাস আমরা কোডে লিখার চেষ্টা করবো-

 public class Student {  
   private String studentId;   
   private String studentName;   
   private String studentDept;   
   public Student(String studentId, String studentName, String studentDept) {   
      this.studentId= studentId;   
      this.studentName= studentName;   
      this.studentDept= studentDept;   
   }  
      public String getStudentId() {  
           return studentId;  
      }  
      public String getStudentName() {  
           return studentName;  
      }  
      public String getStudentDept() {  
           return studentDept;  
      }  
 }  

 import java.awt.List;  
 import java.util.ArrayList;  
 public class Department {  
    private String departmentName;   
    private ArrayList<Student> studentList;   
    public Department(String departmentName, ArrayList<Student> studentList) {   
      this.departmentName = departmentName ;   
      this.studentList = studentList;   
    }   
    public ArrayList<Student> getAllStudents() {   
      return studentList;   
    }   
 }  

 import java.awt.List;  
 import java.util.ArrayList;  
 public class MainClass {  
      public static void main(String[] args) {  
           Student student1 = new Student("111", "Rakib", "CSE");  
           Student student2 = new Student("222", "Sakib", "CSE");  
           Student student3 = new Student("333", "Rigan", "CSE");  
           Student student4 = new Student("444", "Sezan", "CSE");  
           ArrayList<Student> studentList = new ArrayList<Student>();  
           studentList.add(student1);  
           studentList.add(student2);  
           studentList.add(student3);  
           studentList.add(student4);  
           Department cse_department = new Department("CSE", studentList);  
           ArrayList<Student> allStudent = cse_department.getAllStudents();  
           for(Student aStudent: allStudent) {  
                System.out.println(aStudent.getStudentName()+" "+ aStudent.getStudentDept());  
           }  
      }  
 }  

মেইন ক্লাস থেকে কল পরার নিন্মোক্ত আউটপুট আসবেঃ

 Rakib CSE  
 Sakib CSE  
 Rigan CSE  
 Sezan CSE  


যেহেতু আমরা Student ক্লাস Department ক্লাসে ডাটা ফিল্ড হিসেবে ইউজ করেছি সেহেতু Student ক্লাস এবং Department ক্লাসের মধ্যে এ্যাসোসিয়েশন রিলেশনশীপ তৈরি হল। একটা ডিপার্টমেন্টে অনেকগুলো রাখার জন্য আমরা অ্যারে লিস্ট ব্যবহার করেছি।

যেহেতু এই রিলেশনশীপ একমুখী অথ্যাৎ ডিপার্টমেন্ট ক্লাস স্টুডেন্ট ক্লাসের উপর ডিপেন্ডেন্ট কিন্তু স্টুডেন্ট ক্লাস ডিপার্টমেন্ট ক্লাসের উপর ডিপেন্ডেন্ট নয়। মানে হল ডিপার্টমেন্ট ক্লাস যদি না থাকে তাহলে স্টুডেন্ট ক্লাসের কিছু হবেনা কিন্তু স্টুডেন্ট ক্লাস না থাকলে ডিপার্টমেন্ট ক্লাস দিয়ে লাভ হবেনা। কারন ডিপার্টোমেন্ট ক্লাস স্টুডেন্ট ক্লাসকে ব্যবহার করেছে বা স্টুডেন্ট ক্লাসের উপর ডিপেন্ডেন্ট আছে। একে Aggregation বলা হয়।

২। কম্পোজিশন(Compotion)

কম্পোজিশনে দুইটা এন্টিটি বা ক্লাস পরস্পর পরস্পরের উপর ডিপেন্ডেন্ট। অথ্যাৎ, কোন একটা বাদ দিলে প্রোগ্রাম সঠিকভাবে কাজ করবেনা। ব্যপারটা অনেকোটা লাইব্রেরীর মত। আমরা জানি প্রতিটা লাইব্রেরিতে অনেকগুলো বই থাকে, লাইব্রেরী ছাড়া বই কল্পনা যায়না তার মানে লাইব্রেরীর উপর বই ডিপেন্ডেন্ট। আবার বই ছাড়া কি লাইব্রেরী কল্পনা করা যায়? বই থাকে বলেই একে লাইব্রেরী বলা হয়। সো, এখানে পরস্পর পরস্পরের উপর হাইলি ডিপেন্ডেন্ট। 

একটা বই এর নাম এবং টাইটেল থাকতে পারে। আবার একটা লাইব্রেরিতে থাকতে পারে বই এর লিস্ট। এটাও আমরা UML এর মাধ্যমে দেখার চেষ্টা করি-



পুরো ব্যপারটা আমরা কোডে লিখার চেষ্টা করি-

 public class Book {  
      private String name;  
      private String author;  
      public Book(String title, String author) {  
           this.name = title;  
           this.author = author;  
      }  
      public String getName() {  
           return name;  
      }    
      public String getAuthor() {  
           return author;  
      }   
 }  

 import java.awt.List;  
 import java.util.ArrayList;  
 public class Library {  
      private ArrayList<Book> bookList;  
      public Library(ArrayList<Book> bookList) {  
           this.bookList = bookList;  
      }  
      public ArrayList<Book> getAlllBooksFromLibrary(){  
          return bookList;   
       }  
 }  

 import java.util.ArrayList;  
 public class MainClass {  
     public static void main(String[] args) {  
     Book book1 = new Book("Complete Reference Java", "Herbert Schield");  
     Book book2 = new Book("Under the Sea", "Daniel Dipo");  
     ArrayList<Book> bookList = new ArrayList<Book>();  
     bookList.add(book1);  
     bookList.add(book2);  
     Library aLibrary = new Library(bookList);  
     ArrayList<Book> allBooks = aLibrary.getAlllBooksFromLibrary();  
     for(Book book : allBooks){  
       System.out.println(book.getName() + " by " + book.getAuthor());  
     }  
      }  
 }  

মেইন ক্লাস থেকে কল করার পর নিন্মোক্ত আউটপুট পাওয়া যাবেঃ
OUTPUT
Complete Reference Java by Herbert Schield  
 Under the Sea by Daniel Dipo  

No comments:

Post a Comment