UML Association vs Aggregation vs Composition
Perhatikan perbedaan dan persamaan classes objects berikut: pets, dogs, tails, owners.

Kita dapat melihat relationships/hubungan berikut:
owners(pemilik) memberi makanpets(hewan peliharaan),pets(hewan peliharaan) tolongowners(pemiliknya) (association(asosiasi))tail(ekor) merupakanpart(bagian) daridogs(anjing) dancats(kucing) (aggregation(agregasi) /composition(komposisi))cat(kucing) adalah sejenispet(hewan peliharaan) (inheritance(pewarisan) /generalization(generalisasi)).
Gambar di bawah menunjukkan tiga jenis association connectors: association, aggregation, dan composition. Kami akan membahas dalam panduan UML ini:
Gambar di bawah menunjukkan generalization. Kami akan membicarakan nanti di panduan UML ini:
Jika di bahasa pemprograman maksud dari generalization di atas adalah Class2 inheritance/mewarisi Class.
Association (Asosiasi)β
Jika dua classes dalam sebuah model perlu berkomunikasi satu sama lain, harus ada hubungan di antara mereka, dan hal ini dapat direpresentasikan dengan sebuah association (connector).
Association dapat direpresentasikan dengan sebuah garis antara kelas-kelas tersebut dengan panah yang menunjukkan arah navigasi. Jika ada panah di kedua sisi, association tersebut dikenal sebagai association dua arah (bidirectional association).
Kita dapat menunjukkan multiplicity dari sebuah association dengan menambahkan hiasan multiplicity pada garis yang menunjukkan association tersebut. Contohnya menunjukkan bahwa seorang Student memiliki satu atau lebih Instructor:
Seorang Student tunggal dapat berhubungan dengan beberapa Instructor (One to One or Many):
Contoh ini menunjukkan bahwa setiap Instructor memiliki satu atau lebih Student:
Kita juga dapat menunjukkan perilaku sebuah objek dalam sebuah association (misalnya, role sebuah objects) menggunakan nama peran (role names).
Studetbelajar dariInstructorInstructormengajariStudent
Association vs Aggregation vs Compositionβ
Asosiasi vs Agregasi vs Komposisi
Pertanyaan "Apa perbedaan antara association, aggregation, dan composition" sering ditanyakan belakangan ini.
aggregation dan composition adalah bagian dari association, yang berarti mereka adalah kasus khusus dari association. Dalam aggregation dan composition, objek dari satu kelas "memiliki" objek dari kelas lain. Namun, ada perbedaan halus:
aggregationmenunjukkan hubungan di mana child dapat exist secara independen dari parent. Contoh: classParent(parent) danStudent(child). Jika classParentdihapus, classStudenttetap ada.compositionmenunjukkan hubungan di mana child tidak dapat exist secara independen dari parent. Contoh:House(parent) danRoom(child).Roomtidak ada secara terpisah dariHouse.
Contoh composition:
Kita harus lebih spesifik dan menggunakan composition link dalam kasus di mana selain hubungan bagian dari antara Class A dan Class B - ada ketergantungan siklus hidup yang kuat di antara keduanya, yang berarti bahwa ketika Class A dihapus, maka Class B juga dihapus sebagai akibatnya.
Dapat dilihat contoh class Person di atas, jika Anda menghapus Person maka class Head, Hand, Leg akan ikutan terhapus karena menggunakan hubungan composition.
Contoh aggregation:
Penting untuk dicatat bahwa tautan aggregation tidak menyatakan dengan cara apa pun bahwa Class A memiliki Class B atau bahwa ada hubungan parent-child (ketika parent dihapus, semua children's dihapus sebagai akibatnya) antara keduanya. Sebenarnya, justru sebaliknya! Tautan aggregation biasanya digunakan untuk menekankan bahwa instance Class A bukan satu-satunya wadah dari instance Class B, karena sebenarnya instance Class B yang sama memiliki wadah lain.
Kesimpulan:
Secara ringkas, association adalah istilah yang sangat umum digunakan untuk menggambarkan ketika satu kelas menggunakan fungsionalitas yang disediakan oleh kelas lain. Kita menyebutnya composition jika objek kelas parent memiliki objek kelas child dan objek kelas child tersebut tidak dapat bermakna exist tanpa objek kelas parent. Jika bisa, maka disebut aggregation.
Generalization vs Specializationβ
Generalisasi vs Spesialisasi
Generalisasi adalah mekanisme untuk menggabungkan kelas-kelas objek yang serupa ke dalam satu kelas yang lebih umum. Generalisasi mengidentifikasi kesamaan di antara sekumpulan entitas. Kesamaan tersebut bisa berupa atribut, perilaku, atau keduanya. Dengan kata lain, sebuah kelas induk (superclass) memiliki atribut, operasi, dan hubungan yang paling umum yang dapat dibagikan dengan kelas turunan (subclass). Kelas turunan mungkin memiliki atribut dan operasi yang lebih spesifik.
Spesialisasi adalah proses kebalikan dari Generalisasi, yaitu menciptakan kelas turunan baru dari kelas yang sudah ada.
Contoh: Sebuah Bank Account memiliki dua jenis - Savings Account dan Credit Card Account. Savings Account dan Credit Card Account mewarisi properti umum/tergeneralisasi seperti Account Number, Account Balance, dll. Dari sebuah Bank Account dan juga memiliki properti khusus mereka sendiri seperti pembayaran yang belum diselesaikan, dll.

Generalization vs Inheritanceβ
Generalisasi vs Pewarisan
Generalisasi adalah istilah yang kita gunakan untuk menunjukkan abstraksi dari properti umum ke dalam kelas dasar dalam UML. Asosiasi generalisasi dalam diagram UML juga dikenal sebagai Inheritance/Pewarisan. Ketika kita mengimplementasikan Generalisasi dalam bahasa pemrograman, itu sering disebut sebagai Inheritance. Generalisasi dan pewarisan adalah hal yang sama. Terminologi ini hanya berbeda tergantung pada konteks penggunaannya.
Contoh dalam PHP Laravelβ
Association (Asosiasi) Aβ
Asosiasi adalah hubungan antara dua kelas yang memungkinkan satu kelas untuk berkomunikasi dengan kelas lain. Dalam konteks PHP Laravel, asosiasi bisa dilihat dalam bentuk relasi antara model.
Contoh:
Misalkan kita memiliki model User dan Profile. Seorang User dapat memiliki satu Profile.
- Diagram PlantUML
- Kode PlantUML
@startuml
class User {
+name: String
+email: String
}
class Profile {
+bio: String
+avatar: String
}
User "1" -- "1" Profile: HasOne
@enduml
// User.php
class User extends Model
{
public function profile(): HasOne
{
return $this->hasOne(Profile::class);
}
}
// Profile.php
class Profile extends Model
{
public function user(): BelongTo
{
return $this->belongsTo(User::class);
}
}
Aggregation (Agregasi)β
Agregasi adalah hubungan di mana satu objek dapat eksis secara independen dari objek lain. Misalnya, sebuah Course dapat memiliki banyak Student, tetapi menghapus Course tidak akan menghapus Student.
Contoh:
- Diagram PlantUML
- Kode PlantUML
@startuml
class Course {
+title: String
+description: String
}
class Student {
+name: String
+email: String
}
Course "1" o-- "*" Student: BelongsToMany
@enduml
// Course.php
class Course extends Model
{
public function students(): BelongToMany
{
return $this->belongsToMany(Student::class);
}
}
// Student.php
class Student extends Model
{
public function courses(): BelongToMany
{
return $this->belongsToMany(Course::class);
}
}
Composition (Komposisi)β
Komposisi adalah hubungan di mana satu objek tidak dapat eksis tanpa objek lain. Misalnya, sebuah Order memiliki beberapa Item, dan menghapus Order akan menghapus Item.
Contoh:
- Diagram PlantUML
- Kode PlantUML
@startuml
class Order {
+orderNumber: String
+totalAmount: Float
}
class Item {
+name: String
+price: Float
}
Order "1" *-- "many" Item: HasMany
@enduml
// Order.php
class Order extends Model
{
public function items(): HasMany
{
return $this->hasMany(Item::class);
}
}
// Item.php
class Item extends Model
{
public function order(): BelongsTo
{
return $this->belongsTo(Order::class);
}
}
Generalization vs Specialization (Generalisasi vs Spesialisasi)β
Generalisasi adalah proses mengabstraksi properti umum ke dalam kelas dasar. Spesialisasi adalah proses membuat sub-kelas dari kelas dasar tersebut.
Contoh:
Misalkan kita memiliki kelas dasar Account dengan kelas turunan SavingsAccount dan CreditCardAccount.
- Diagram PlantUML
- Kode PlantUML
@startuml
abstract class Account {
+accountNumber: String
+balance: Float
}
class SavingsAccount extends Account {
+interestRate: Float
}
class CreditCardAccount extends Account {
+creditLimit: Float
}
@enduml
// Account.php
abstract class Account extends Model
{
protected $accountNumber;
protected $balance;
// common methods
}
// SavingsAccount.php
class SavingsAccount extends Account
{
private $interestRate;
// specific methods
}
// CreditCardAccount.php
class CreditCardAccount extends Account
{
private $creditLimit;
// specific methods
}
Generalization vs Inheritance (Generalisasi vs Pewarisan)β
Generalisasi dalam UML dikenal sebagai Pewarisan dalam pemrograman. Ketika kita mengimplementasikan generalisasi dalam PHP, itu disebut pewarisan.
Contoh:
Misalkan kita memiliki kelas dasar Vehicle dan kelas turunan Car dan Bike.
- Diagram PlantUML
- Kode PlantUML
@startuml
abstract class Vehicle {
+make: String
+model: String
}
class Car extends Vehicle {
+numberOfDoors: int
}
class Bike extends Vehicle {
+type: String
}
@enduml
// Vehicle.php
abstract class Vehicle
{
protected $make;
protected $model;
// common methods
}
// Car.php
class Car extends Vehicle
{
private $numberOfDoors;
// specific methods
}
// Bike.php
class Bike extends Vehicle
{
private $type;
// specific methods
}