Toplama ve Kompozisyon arasındaki kavramsal farklılıkların farkındayım. Birisi bana Java'daki uygulama farkını örneklerle söyleyebilir mi?
Toplama ve Kompozisyon arasındaki kavramsal farklılıkların farkındayım. Birisi bana Java'daki uygulama farkını örneklerle söyleyebilir mi?
Yanıtlar:
Kompozisyon
final class Car {
private final Engine engine;
Car(EngineSpecs specs) {
engine = new Engine(specs);
}
void move() {
engine.work();
}
}
Toplama
final class Car {
private Engine engine;
void setEngine(Engine engine) {
this.engine = engine;
}
void move() {
if (engine != null)
engine.work();
}
}
Kompozisyon söz konusu olduğunda, Motor tamamen Araba tarafından kaplanmıştır. Dış dünyanın Motora referans almasının bir yolu yok. Motor araba ile birlikte yaşar ve ölür. Birleştirme ile, Araba ayrıca bir Motor aracılığıyla işlevlerini yerine getirir, ancak Motor her zaman Arabanın dahili bir parçası değildir. Motorlar değiştirilebilir veya hatta tamamen çıkarılabilir. Sadece bu da değil, dış dünya yine de Motora referans verebilir ve Arabanın içinde olup olmadığına bakılmaksızın onu kurcalayabilir.
new Engine(EngineSpecs)
, araba olmasa bile çağrı kullanılarak bir motor hala oluşturulabilir . Kompozisyon elde etmenin yolu, Engine'i bir iç sınıf olarak oluşturmaktır, böylece bir motor nesnesi her zaman bir Araba Nesnesine referansla oluşturulur
Güzel bir UML örneği kullanırdım.
1 ila 20 farklı bölümü olan ve her bölümün 1 ila 5 profesörü olan bir üniversiteyi alın. Üniversite ile bölümleri arasında bir kompozisyon bağı vardır. Bir departman ve onun profesörleri arasında bir toplama bağlantısı vardır.
Kompozisyon sadece GÜÇLÜ bir toplamadır, eğer üniversite yıkılırsa bölümler de yok edilmelidir. Ancak kendi bölümleri ortadan kalksa bile hocaları öldürmemeliyiz.
Java'da:
public class University {
private List<Department> departments;
public void destroy(){
//it's composition, when I destroy a university I also destroy the departments. they cant live outside my university instance
if(departments!=null)
for(Department d : departments) d.destroy();
departments.clean();
departments = null;
}
}
public class Department {
private List<Professor> professors;
private University university;
Department(University univ){
this.university = univ;
//check here univ not null throw whatever depending on your needs
}
public void destroy(){
//It's aggregation here, we just tell the professor they are fired but they can still keep living
for(Professor p:professors)
p.fire(this);
professors.clean();
professors = null;
}
}
public class Professor {
private String name;
private List<Department> attachedDepartments;
public void destroy(){
}
public void fire(Department d){
attachedDepartments.remove(d);
}
}
Bunun etrafında bir şey.
DÜZENLEME: istendiği gibi bir örnek
public class Test
{
public static void main(String[] args)
{
University university = new University();
//the department only exists in the university
Department dep = university.createDepartment();
// the professor exists outside the university
Professor prof = new Professor("Raoul");
System.out.println(university.toString());
System.out.println(prof.toString());
dep.assign(prof);
System.out.println(university.toString());
System.out.println(prof.toString());
dep.destroy();
System.out.println(university.toString());
System.out.println(prof.toString());
}
}
Üniversite sınıfı
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class University {
private List<Department> departments = new ArrayList<>();
public Department createDepartment() {
final Department dep = new Department(this, "Math");
departments.add(dep);
return dep;
}
public void destroy() {
System.out.println("Destroying university");
//it's composition, when I destroy a university I also destroy the departments. they cant live outside my university instance
if (departments != null)
departments.forEach(Department::destroy);
departments = null;
}
@Override
public String toString() {
return "University{\n" +
"departments=\n" + departments.stream().map(Department::toString).collect(Collectors.joining("\n")) +
"\n}";
}
}
Bölüm sınıfı
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Department {
private final String name;
private List<Professor> professors = new ArrayList<>();
private final University university;
public Department(University univ, String name) {
this.university = univ;
this.name = name;
//check here univ not null throw whatever depending on your needs
}
public void assign(Professor p) {
//maybe use a Set here
System.out.println("Department hiring " + p.getName());
professors.add(p);
p.join(this);
}
public void fire(Professor p) {
//maybe use a Set here
System.out.println("Department firing " + p.getName());
professors.remove(p);
p.quit(this);
}
public void destroy() {
//It's aggregation here, we just tell the professor they are fired but they can still keep living
System.out.println("Destroying department");
professors.forEach(professor -> professor.quit(this));
professors = null;
}
@Override
public String toString() {
return professors == null
? "Department " + name + " doesn't exists anymore"
: "Department " + name + "{\n" +
"professors=" + professors.stream().map(Professor::toString).collect(Collectors.joining("\n")) +
"\n}";
}
}
Profesör sınıfı
import java.util.ArrayList;
import java.util.List;
public class Professor {
private final String name;
private final List<Department> attachedDepartments = new ArrayList<>();
public Professor(String name) {
this.name = name;
}
public void destroy() {
}
public void join(Department d) {
attachedDepartments.add(d);
}
public void quit(Department d) {
attachedDepartments.remove(d);
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Professor " + name + " working for " + attachedDepartments.size() + " department(s)\n";
}
}
Uygulama, oluşturma, işe alma silme vb. İşlemlerle nasıl başa çıkmanız gerektiğine bağlı olduğundan, uygulama tartışmaya açıktır.
Aşağıda verilen url'de harika bir açıklama var.
http://www.codeproject.com/Articles/330447/Understanding-Association-Aggregation-and-Composit
Lütfen kontrol edin!!!
Basit bir Kompozisyon programı
public class Person {
private double salary;
private String name;
private Birthday bday;
public Person(int y,int m,int d,String name){
bday=new Birthday(y, m, d);
this.name=name;
}
public double getSalary() {
return salary;
}
public String getName() {
return name;
}
public Birthday getBday() {
return bday;
}
///////////////////////////////inner class///////////////////////
private class Birthday{
int year,month,day;
public Birthday(int y,int m,int d){
year=y;
month=m;
day=d;
}
public String toString(){
return String.format("%s-%s-%s", year,month,day);
}
}
//////////////////////////////////////////////////////////////////
}
public class CompositionTst {
public static void main(String[] args) {
// TODO code application logic here
Person person=new Person(2001, 11, 29, "Thilina");
System.out.println("Name : "+person.getName());
System.out.println("Birthday : "+person.getBday());
//The below object cannot be created. A bithday cannot exixts without a Person
//Birthday bday=new Birthday(1988,11,10);
}
}
Şartları belirleyelim. Toplama, UML standardında bir metatermdir ve sadece paylaşılan olarak adlandırılan HER İKİSİ bileşimi ve paylaşılan toplama anlamına gelir . Çoğu zaman yanlış "toplama" olarak adlandırılır. KÖTÜ, çünkü kompozisyon da bir kümelenmedir. Anladığım kadarıyla "paylaşılan" demek istiyorsun.
UML standardından daha fazlası:
bileşik - Özelliğin bileşik olarak toplandığını, yani bileşik nesnenin, oluşturulan nesnelerin (parçaların) varlığı ve depolanmasından sorumlu olduğunu belirtir.
Yani, üniversiteden kathedralara derneği bir kompozisyondur, çünkü cathedra üniversite dışında yoktur (IMHO)
Paylaşılan toplamanın kesin anlam bilgisi, uygulama alanı ve modelleyiciye göre değişir.
Yani, diğer tüm dernekler, yalnızca kendinizin veya başka birinin bazı ilkelerini takip ediyorsanız, paylaşılan toplamalar olarak çizilebilir. Ayrıca buraya bakın .
Öncelikle arasında aslında fark nedir bahsetmek gerekir Aggregation
ve Composition
aynı sayfada olmaktır.
Toplama, ilişkili varlığın ilişkilendirmeden bağımsız olarak var olabileceği bir ilişkilendirmedir. Örneğin, bir Kişi bir Kuruluşla ilişkilendirilebilir ancak sistemde bağımsız bir varlığı olabilir.
buna karşılık
Kompozisyon, ilişkili varlıklardan birinin diğeriyle güçlü bir şekilde ilişkili olduğu ve diğerinin varlığı olmadan var olamayacağı bir durumu ifade eder. Aslında o varlığın kimliği her zaman diğer nesnenin kimliğiyle ilişkilidir. Örneğin, arabadaki tekerlekler.
Şimdi, toplama, bir varlığın mülkünün diğerinde aşağıdaki gibi tutulmasıyla gerçekleştirilebilir:
class Person {
Organisation worksFor;
}
class Organisation {
String name;
}
class Main {
public static void main(String args[]) {
//Create Person object independently
Person p = new Person();
//Create the Organisation independently
Organisation o = new Organisation();
o.name = "XYZ Corporation";
/*
At this point both person and organisation
exist without any association
*/
p.worksFor = o;
}
}
Kompozisyon için, bağımlı nesnenin her zaman ilişkili nesnesinin kimliğiyle yaratılması gerekir. Aynı şekilde bir iç sınıfı da kullanabilirsiniz.
class Car {
class Wheel {
Car associatedWith;
}
}
class Main {
public static void main() {
//Create Car object independently
Car car = new Car();
//Cannot create Wheel instance independently
//need a reference of a Car for the same.
Car.Wheel wheel = car.new Wheel();
}
}
Lütfen aynı kullanım senaryosunun uygulama senaryosuna bağlı olarak birleştirme / bileşim kapsamına girebileceğini unutmayın. Örneğin, bir kuruluşta çalışan kişiler için bir uygulama geliştiriyorsanız ve kuruluşa başvuru kaydolmak için zorunlu ise Kişi-Kuruluş vakası kompozisyon haline gelebilir. Benzer şekilde, bir Arabanın parçaları için envanter tutuyorsanız, Araba-Tekerlek ilişkisi birleştirme olabilir.
Toplama ve Kompozisyon
Toplama , çocuğun ebeveynden bağımsız olarak var olabileceği bir ilişki anlamına gelir . Örneğin, Banka ve Çalışan, Bankayı silin ve Çalışan hala mevcuttur.
Kompozisyon ise çocuğun ebeveynden bağımsız olamayacağı bir ilişkiyi ifade eder . Örnek: İnsan ve kalp, bir İnsandan ayrı varolmaz.
Toplulaştırma ilişkisi "has-a" ve bileşim "parçası" ilişkisidir.
Kompozisyon güçlü bir İlişkilendirme iken Toplama zayıf bir İlişkilendirme'dir.
Her iki tür de elbette ilişkilendirmelerdir ve bunun gibi dil öğeleriyle tam olarak eşleştirilmemiştir. Aradaki fark amaç, bağlam ve sistemin nasıl modellendiğidir.
Pratik bir örnek olarak, iki farklı sistem türünü benzer varlıklarla karşılaştırın:
Öncelikle arabaları ve sahiplerini vb. Takip eden bir araba tescil sistemi . Burada motorla ayrı bir varlık olarak ilgilenmiyoruz, ancak yine de güç ve yakıt türü gibi motorla ilgili özelliklere sahip olabiliriz. Burada Motor , araba varlığının kompozit bir parçası olabilir .
Araba parçalarını yöneten, arabalara servis veren ve parçaları değiştiren, belki de komple motorları yöneten bir araba servisi mağazası yönetim sistemi . Burada motorlarımız stoklanmış olabilir ve onları ve diğer parçaları ayrı ayrı ve arabalardan bağımsız olarak takip etmemiz gerekebilir. Burada Motor , araba varlığının birleştirilmiş bir parçası olabilir .
Bunu kendi dilinizde nasıl uygulayacağınız küçük bir endişe kaynağıdır, çünkü bu düzeyde okunabilirlik gibi şeyler çok daha önemlidir.