Apa gunanya Asosiasi, Agregasi dan Komposisi?

20

Saya telah melalui banyak teori tentang apa itu enkapsulasi dan tiga teknik penerapannya, yaitu Asosiasi, Agregasi dan Komposisi.

Apa yang saya temukan adalah :

Enkapsulasi

Enkapsulasi adalah teknik membuat bidang dalam kelas pribadi dan menyediakan akses ke bidang melalui metode publik. Jika bidang dinyatakan pribadi, itu tidak dapat diakses oleh siapa pun di luar kelas, sehingga menyembunyikan bidang di dalam kelas. Karena alasan ini, enkapsulasi juga disebut sebagai penyembunyian data.

Enkapsulasi dapat digambarkan sebagai penghalang pelindung yang mencegah kode dan data diakses secara acak oleh kode lain yang didefinisikan di luar kelas. Akses ke data dan kode dikontrol ketat oleh sebuah antarmuka.

Manfaat utama enkapsulasi adalah kemampuan untuk memodifikasi kode kami yang diterapkan tanpa melanggar kode orang lain yang menggunakan kode kami. Dengan fitur ini Enkapsulasi memberikan rawatan, fleksibilitas, dan ekstensibilitas ke kode kami.

Asosiasi

Asosiasi adalah hubungan di mana semua objek memiliki siklus hidupnya sendiri dan tidak ada pemilik. Mari kita ambil contoh Guru dan Siswa. Banyak siswa dapat bergaul dengan satu guru dan satu siswa dapat bergaul dengan banyak guru, tetapi tidak ada kepemilikan antara objek dan keduanya memiliki siklus hidup mereka sendiri. Keduanya dapat membuat dan menghapus secara mandiri.

Pengumpulan

Agregasi adalah bentuk khusus dari Asosiasi di mana semua objek memiliki siklus hidup mereka sendiri, tetapi ada kepemilikan dan objek anak tidak dapat milik objek orangtua lain. Mari kita ambil contoh Departemen dan guru. Seorang guru tidak dapat menjadi bagian dari banyak departemen, tetapi jika kami menghapus departemen, objek guru tidak akan hancur. Kita dapat menganggapnya sebagai hubungan "memiliki".

Komposisi

Komposisi sekali lagi merupakan bentuk khusus dari Agregasi dan kita dapat menyebutnya sebagai hubungan "kematian". Ini adalah tipe Agregasi yang kuat. Objek anak tidak memiliki siklus hidupnya dan jika objek induk menghapus semua objek anak juga akan dihapus. Mari kita ambil kembali contoh hubungan antara rumah dan kamar. Rumah dapat berisi beberapa kamar tetapi tidak ada kehidupan independen dari sebuah ruangan dan ruangan mana pun tidak dapat dimiliki oleh dua rumah yang berbeda. Jika kami menghapus rumah, ruangan akan secara otomatis dihapus.

Pertanyaannya adalah:

Sekarang ini semua adalah contoh dunia nyata. Saya mencari beberapa deskripsi tentang cara menggunakan teknik ini dalam kode kelas yang sebenarnya. Maksud saya apa gunanya menggunakan tiga teknik berbeda untuk enkapsulasi , Bagaimana teknik ini dapat diimplementasikan dan Bagaimana memilih teknik mana yang berlaku pada saat itu.

Sahil Mahajan Mj
sumber
1
Harap dicatat bahwa Agregasi, Komposisi dan Asosiasi bukan teknik untuk mengimplementasikan enkapsulasi. Enkapsulasi juga bisa ada bahkan jika hanya ada satu kelas / objek. Enkapsulasi hanyalah fitur penting dalam Orientasi Objek untuk menyembunyikan data objek Anda.
Maxood
1
"Seorang guru tunggal TIDAK BISA milik beberapa departemen" benar-benar? Tidakkah Anda perhatikan sumber daya Anda mengubah konten?
KNU
Saya telah berhasil menggunakan Komposisi untuk mengidentifikasi DDD Aggregate Roots dan Entitas mereka ketika melakukan Desain Berbasis Domain. Penggunaan baru untuk konvensi lama.
Jonn

Jawaban:

12

Perbedaan antara asosiasi, agregasi dan komposisi seperti yang Anda gambarkan adalah warisan yang kembali ke masa lalu manajemen memori manual. Sebagai contoh dalam C ++ memori yang digunakan oleh objek harus dilepaskan secara manual dan dengan demikian sangat penting untuk hati-hati merancang siklus hidup objek yang dikomposisikan. Sementara perbedaan antara agregasi dan komposisi masih diajarkan oleh banyak buku teks, pada dasarnya tidak relevan ketika pemrograman dalam lingkungan dengan manajemen memori otomatis. Jika Anda memiliki pengumpulan sampah, semuanya hanya komposisi, titik.

Enkapsulasi di sisi lain adalah prinsip yang jauh lebih umum daripada apa yang Anda gambarkan. Terutama ide tentang bundling data dan fungsi-fungsi yang beroperasi pada data ini dalam satu modul. Salah satu cara untuk mengimplementasikan ini adalah dengan menjaga status modul tetap pribadi dan mengekspos perubahan ke status itu melalui layanan publik. Jadi klien tidak dapat mengakses keadaan sendiri tetapi harus memberi tahu modul niat mereka dengan mengirim pesan. Jadi enkapsulasi tidak terbatas pada objek tetapi juga berlaku untuk layanan. Sebenarnya, salah satu cara memandang objek adalah dengan melihatnya sebagai layanan.

Inilah contoh enkapsulasi

public class Counter {
    private int n = 0;
    public int inc() { return n++; }
}

atau fungsi lambda yang sama

var counter = (function() {
    var n = 0;
    var inc = function() { return n++; }
    return inc;
})();

Dalam kedua kasus, data, yaitu variabel n, dibundel bersama dengan fungsi incyang beroperasi di dalamnya. Dan tidak mungkin ada fungsi lain yang bisa diakses n, jadi kami memiliki modul enkapsulasi yang menyediakan penghitungan sebagai layanan.

NB: mengekspos semua keadaan dalam suatu objek melalui accessors sebenarnya merupakan pelanggaran enkapsulasi. Sayangnya, itu adalah pelanggaran umum sehingga banyak orang akan bingung dengan desain berorientasi objek yang baik.

akuhn
sumber
2
Manajemen Memori Otomatis tidak ada hubungannya dengan hubungan objek. Diagram objek sendiri memberi tahu programmer cara membuat kode kelas, antarmuka dan metode mereka sesuai persyaratan sistem yang sedang dipertimbangkan.
Maxood
2
Ada juga pertimbangan di luar ingatan. Dalam desain data atau mungkin serialisasi. Dalam komposisi, Anda mungkin perlu memiliki batasan kunci asing yang berbeda dalam RDBMS, atau mungkin mengubah cara Anda menangani serialisasi objek jika memiliki anak-anak komposit versus anak-anak agregat atau objek terkait.
Chris
8

Enkapsulasi adalah teknik membuat bidang dalam kelas pribadi dan menyediakan akses ke bidang melalui metode publik. Jika bidang dinyatakan pribadi, itu tidak dapat diakses oleh siapa pun di luar kelas, sehingga menyembunyikan bidang di dalam kelas. Karena alasan ini, enkapsulasi juga disebut sebagai penyembunyian data.

    public class Test{

    private String name;

       private int age;

       public int getAge(){
          return age;
       }

       public String getName(){
          return name;
       }
    }

Rujuk pertanyaan ini juga .

Asosiasi menunjukkan hubungan antar objek. misal: Komputer menggunakan keyboard sebagai perangkat input.

Asosiasi digunakan ketika satu objek ingin objek lain melakukan layanan untuknya.

Agregasi adalah kasus khusus asosiasi. Hubungan terarah antara objek. Ketika sebuah objek 'memiliki-a' objek lain, maka Anda telah mendapat agregasi di antara mereka.

misal: Kamar memiliki meja, tetapi meja bisa ada tanpa ruangan.

    class Room {

      private Table table;

      void setTable(Table table) {
        this.table = table;
      }

    }

Komposisi adalah kasus agregasi khusus. Komposisi lebih membatasi. Ketika ada komposisi antara dua objek, objek yang dikomposisi tidak dapat ada tanpa objek lainnya. Pembatasan ini tidak ada dalam agregasi. misalnya: kamar di rumah, yang tidak bisa ada setelah masa pakai rumah.

    class House {

      private  Room room;

      House(Room roomSpecs) {
        room = new Room(roomSpecs);
      }

    }

Komposisi adalah teknik desain untuk menerapkan memiliki-hubungan di kelas, baik oleh Warisan atau objek Komposisi untuk penggunaan kembali kode.

Salah satu praktik terbaik dalam pemrograman Java adalah menggunakan komposisi melebihi pewarisan

kapil das
sumber
bagaimana ini menjawab pertanyaan yang diajukan?
Agak
1

Menggunakan teknik-teknik itu biasanya menghasilkan praktik desain seperti SOLID atau berbagai pola desain .

Inti dari penggunaan pola, praktik, dan semacamnya adalah untuk menggambarkan solusi bagi masalah khusus yang juga dapat dipertahankan dan diperluas. Anda hanya perlu mendapatkan pengalaman yang cukup untuk menentukan di mana harus menggunakan pola atau teknik mana.

Euforia
sumber
1

Sejujurnya saya merasa bahwa gagasan-gagasan yang diajarkan di akademis memiliki kepentingan mereka dalam konteks orientasi objek dan desain kelas. Konsep-konsep ini banyak membantu kita dalam hal pemodelan sistem dari awal. Asosiasi, Agregasi dan Komposisi secara eksklusif milik diagram kelas UML dan sepenuhnya independen dari kendala teknologi seperti masalah memori.

Selain itu, Anda juga harus mempertimbangkan level yang lebih tinggi atau sasaran bisnis dari sistem yang Anda modelkan. Kami memiliki objek seperti Rumah dan Kamar dalam sistem kami yang sedang dipertimbangkan, tetapi tidak dapat sangat terkait (melalui komposisi). Misalnya, jika saya memodelkan sistem real estat maka saya mungkin harus tahu kamar apa yang dimiliki rumah apa. Tetapi mari saya memodelkan sistem survei atau sensus di mana saya ingin tahu berapa banyak orang yang tinggal di setiap kamar rumah di daerah tertentu, maka saya tidak perlu menghubungkan kamar dengan rumah melalui komposisi.

Contoh lain bisa dari kebun buah dan jenis buah tertentu. Katakanlah saya hanya dapat mempertimbangkan kebun ketika saya menanam pohon apel di dalamnya. Intinya adalah bahwa persyaratan sistem secara keseluruhan sangat penting.

Enkapsulasi adalah salah satu pilar Desain Berorientasi Objek. Anda perlu menggabungkan data Anda dan operasi yang akan Anda lakukan pada data Anda. Anda juga harus menyembunyikan atribut tertentu dari objek Anda dari dunia luar agar objek tersebut dapat bertahan dalam keadaan yang valid. Ketika 2 objek berinteraksi, mereka harus berinteraksi satu sama lain melalui antarmuka. Dan itulah yang memastikan enkapsulasi ketika kita merancang sistem OO kita.

Berikut adalah bagaimana konsep-konsep ini diterapkan pada kode:

ASOSIASI: Asosiasi menunjukkan hubungan antara objek. Ini memungkinkan programmer mengetahui metode apa yang harus ditulis di kelas mereka untuk membuat mereka berinteraksi satu sama lain. Anda dapat menemukan beberapa contoh kode dan diagram kelas untuk memahami asosiasi. Dalam contoh Anda tentang Mengajar dan Siswa, ada hubungan mengajar dan diajar oleh . Jadi, Anda cukup menulis serangkaian metode (secara teknis disebut antarmuka) yang dengannya Anda dapat mengetahui siswa mana yang memiliki guru apa dan guru mana yang memiliki siswa apa. Asosiasi juga memungkinkan pemodel sistem untuk membantu perancang basis data tentang atribut dan bidang yang perlu disimpan dalam basis data.

KOMPOSISI: Jika satu objek merupakan bagian integral dari objek lain, maka saya mungkin harus menunjukkan hubungan ini dalam konstruktor objek lain. Misalnya, dalam skenario Rumah dan Kamar Anda, kami dapat menulis kode berikut jika kami ingin tahu kamar mana yang termasuk tipe rumah apa.

class House{
          string _HouseType;   
     public:    
    void setHouseType(string house_type)
     {
        this. _HouseType = house_type;
     } 

     string getHouseType()
    {
       return _HouseType;
    }
};



 House HouseObject = new House();


class Room{

 public: 
 Room(string HouseType) {
       this._HouseType = HouseObject.getHouseType();  //as in my system a room cannot exist without a house

 } 

};

Programmer juga akan memastikan saat memanggil destruktor objek, bahwa destuctor objek lain juga akan dipanggil. Ini sangat penting.

AGREGASI: Mari kita katakan jika hubungan antara objek lemah maka kita untuk programmer, itu berarti menggunakan variabel contoh sebagai gantinya untuk menunjukkan hubungan. Dan kemudian menulis sebuah fungsi mutator (setter) untuk memberikan nilai pada objek itu dari yang lain.

class Department{

 string dept_name;

public:
   void setDeptName(string name)
   {
        this.dept_name=name;
   }

   string getDeptName()
   {
        return dept_name; 
   }

};



 Department DepartmentObject = new Department();

class Teacher{

 string dept_name;

public:

  setDeptName(string name)
  {
     this.dept_name = DepartmentObject.getDeptName();  //You only need to invoje this method when needed (aggregation)
  }
}

};
Maxood
sumber
1

OK, mari kita petakan ini ke beberapa properti inti daripada konsep abstrak yang hanya masuk akal setelah Anda mengerti apa artinya. Seperti beberapa komentator saya tidak setuju dengan jawaban yang diterima, saya katakan ini adalah konsep yang tidak tergantung pada manajemen memori.

Enkapsulasi

Anda ingin menyembunyikan kerumitan dari klien, hanya menerbitkan hal-hal yang penting dari sudut pandang klien, membuat segalanya lebih mudah bagi klien. Sebagai bonus, Anda mendapatkan kepastian bahwa tidak ada yang dapat mengacaukan kode enkapsulasi. Selama Anda menghormati antarmuka dan fungsionalitasnya, Anda dapat mengerjakan ulang hal-hal dan yakinlah Anda tidak akan merusak apa pun. Ketergantungan hanya pada antarmuka yang dipublikasikan.

Enkapsulasi adalah salah satu pilar utama orientasi objek. Itu bukan pola, itu adalah prinsip dan mungkin berlaku untuk logika dan data. Ini hanyalah manfaat dasar menggunakan kelas di tempat pertama, bukan sesuatu yang Anda akan lihat secara eksplisit dinyatakan dalam diagram atau dokumen desain.

Asosiasi

Ini adalah konsep yang sangat longgar yang pada dasarnya hanya menggambarkan ketergantungan antara objek. Satu objek tahu tentang keberadaan objek lain dan dapat menggunakan fungsinya di beberapa titik. Dalam diagram, asosiasi akan memberi tahu Anda bahwa ada ketergantungan dan bahwa mengubah satu objek dapat berdampak lainnya. Ini bukan teknik untuk diterapkan ketika Anda memiliki beberapa masalah untuk dipecahkan, itu lebih seperti fakta kehidupan yang harus Anda sadari ketika itu ada. Itu adalah sebuah hubungan. Seperti faktur yang memiliki properti Pesanan. Baik Pesanan dan Faktur memiliki siklus hidup sendiri. Yang satu adalah tentang barang dan yang lainnya adalah tentang pembayaran, yang pada dasarnya membuat mereka mandiri tetapi penting untuk mengetahui barang apa yang dibayar.

Penahanan

Saya menambahkan ini karena termasuk dalam seri dan akan membuat agregasi lebih bermakna. Saya tidak mendengar istilah yang digunakan dalam konteks SE banyak lagi tapi saya pikir itu masih berguna. Containment menyiratkan enkapsulasi tetapi secara ketat tentang instance objek pribadi ke kelas yang berisi. Fungsionalitas objek yang terkandung diekspos secara selektif melalui antarmuka publik. Kelas yang mengandung mengontrol siklus hidup dari objek yang dikendalikan. Anda menggunakan ini ketika Anda membutuhkan beberapa fitur dari kelas yang ada untuk membuat kelas yang mengandung fungsional. Ini bisa menjadi parser XML dan klien dari kelas yang berisi mungkin tidak pernah melihat atau tahu apa pun yang terkait dengan XML. Sebagai metafora, pikirkan objek yang terkandung sebagai pekerja kantor. Klien tidak pernah bertemu orang-orang ini namun mereka diperlukan untuk menyediakan layanan.

Pengumpulan

Ini sangat mirip penahanan kecuali untuk kontrol siklus hidup dan visibilitas objek agregat. Objek agregat sudah tersedia dalam konteks yang berbeda dan dikelola oleh entitas yang berbeda. Agregator hanya menawarkan fasad, portal ke objek agregat. Ketika klien menangani agregat, ia mendapatkan antarmuka objek agregat itu sendiri, bukan pembungkus di sekitarnya. Inti dari kelompok agregasi adalah menawarkan pengelompokan logis hal-hal. Pikirkan titik akses ke layanan atau objek pembungkus lainnya.

Komposisi

Tampaknya bagi saya ini adalah istilah yang lebih kontemporer untuk penahanan, mungkin karena ia diciptakan dalam sebuah buku populer yang relatif baru. Dimana penahanan fokus pada aspek teknis dari hubungan objek, komposisi biasanya digunakan dalam konteks keputusan desain, lebih khusus sebagai alternatif yang lebih fleksibel untuk warisan.

Itu tidak mengatakan banyak tentang sifat hubungan objek atau kepemilikan, itu hanya menunjukkan bahwa fungsi diimplementasikan dengan menggabungkan fungsi dari kelas yang ada. Oleh karena itu saya berpendapat itu tidak termasuk dalam seri ini karena tidak mengatakan apa-apa tentang aspek teknis dari implementasi di mana yang lain lakukan.

Martin Maat
sumber