Java'da Toplama ve Kompozisyon arasındaki uygulama farkı


103

Toplama ve Kompozisyon arasındaki kavramsal farklılıkların farkındayım. Birisi bana Java'daki uygulama farkını örneklerle söyleyebilir mi?


3
Bu bağlantıyı takip ederek gönderilerinize yanıt alabilirsiniz [Toplama ve Kompozisyon arasındaki fark] [1] [1]: stackoverflow.com/a/1468285/1353243
gks



Nesneler arasında herhangi bir ilişkimiz olduğunda buna İlişkilendirme denir. Toplama ve Bileşim, her ikisi de özel bir İlişkilendirme biçimidir. Kompozisyon yine Aggregation'ın uzmanlaşmasıdır. javabench.in/2011/08/difference-between-association.html
Raúl

daha fazla cevabı burada
hamed moosaei

Yanıtlar:


222

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.


7
Harika örnek! Aynı zamanda bileşimi güçlü bir ilişki (bir Araba bir Motor olmadan anlam ifade etmez) ve kümelenmeyi zayıf bir ilişki (Motorsuz bir Araba tamamen mantıklıdır, hatta yapıcısında buna ihtiyaç duymaz) gösterir. Hangisini kullanmalı? Bağlama bağlıdır.
Federico Pugnali

@Anand Aggregation'da verdiğiniz örnek bu bağımlılık örneği değil mi? Bağımlılık, daha zayıf bir ilişki biçimidir ve kod terimleriyle, bir sınıfın parametre veya dönüş türüne göre başka bir sınıf kullandığını gösterir.
OOkhan

@Anand: Neden söylediğinizi daha fazla açıklayabilir misiniz: Kompozisyon söz konusu olduğunda dış dünyanın Motora referans almasının bir yolu yoktur, toplama ile dış dünya Motora referans verebilir mi? Kod örneğinde, dış dünyanın motora nasıl referans olabileceğini veya olamayacağını gösterebilir misiniz? teşekkürler
O Connor

9
Bu doğru bir örnek değil. Dış dünya, iç nesneye erişebilir, ancak kimliği her zaman dış nesneyle ilişkilendirilirken, kümelenme halinde iç nesne, araba olmasa bile bağımsız olarak var olabilir. Bu durumda 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
mickeymoon

@mickeymoon harika yakala. bizi daha iyi bir örneğe yönlendirebilir misin?
Gayan Weerakutti

20

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.


Umarım başlatılmamış listeler ve kurucuların olmaması hakkında herhangi bir yorum almam. Bunu hızlı bir şekilde yazdım, eksik kısımlar sağduyu ama sorulursa çözümü tamamlayacağım
TecHunter

Teşekkürler! Örneğiniz tamamen açık. Ama kod örneğinizi anlayamadım. Bana ikisi arasındaki temel uygulama farkını söyleyebilir misiniz ? Toplama veya kompozisyon uygulamam gerekirse, Java'da hangi kavramları kullanmalıyım?
Rajath

sınıf hakkında konuşursanız, bu tamamen aynı uygulama, ANCAK kompozisyon, benim düzenlememdeki gibi örnekleri yönetme şeklinize yansıtılmalıdır
TecHunter

TecHunter, bu örneği arıyordum. Üniversite örneğinde ilişkilendirmeyi göstermek için java kodunu da genişletebilir misiniz? Örnek, main () yönteminde nasıl çalışmalıdır? (Üniversite oluşturma ve profesörleri silme senaryolarını gösterebilir). Lütfen yardım edin
deepakl. 2000

@ deepakl.2000 bunu yapmanın birçok yolu. Hangi sınıfın güce sahip olduğunu tanımlamalısınız. Profesör bir üniversiteye katılıyor olabilir, daha sonra birden fazla bölüme katılıyor olabilir veya üniversite bir profesörü işe alıp sonra bölümden kaydolmasını istiyor olabilir. her şey ihtiyaçlarınız için daha mantıklı olan şeyle ilgili.
TecHunter

4

Aşağıda verilen url'de harika bir açıklama var.

görüntü açıklamasını buraya girin

http://www.codeproject.com/Articles/330447/Understanding-Association-Aggregation-and-Composit

Lütfen kontrol edin!!!


Merhaba Rahul, bu bağlantı soruyu cevaplayabilirken, cevabın temel kısımlarını buraya eklemek ve referans için bağlantı sağlamak daha iyidir. Bağlantılı sayfa değişirse, yalnızca bağlantı yanıtları geçersiz hale gelebilir. Lütfen buraya bir göz atın: Bazı yanıtlar neden ve nasıl silinir?
bummi

3

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);

    }
}

Ayrıca, Oluşturma bölümünde açıkladığınız gibi tüm senaryoları açıklayan ve İlişkilendirme ve Toplama için çalışan java kodunu da ekleyebilir misiniz? 1. Silinen Senaryolar İlişkilendirmede? 2. Üst nesne silindiğinde Toplamadaki senaryolar?
deepakl. 2000

3

Aradaki fark, herhangi bir bileşimin bir kümelenme olması ve bunun tersi olmamasıdır.

Ş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 .


3

Basit bir ifadeyle:

Hem Bileşim hem de Toplama İlişkilendirmelerdir. Kompozisyon -> Güçlü Bir İlişkiye Sahiptir -> Zayıf Bir İlişkiye Sahiptir.


2

Öncelikle arasında aslında fark nedir bahsetmek gerekir Aggregationve Compositionaynı 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.


1

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.


0

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.