Дифференциация состава и агрегации программно - PullRequest
0 голосов
/ 01 мая 2018

Я проходил по ссылке ниже, чтобы понять разницу между составом и агрегацией.

https://www.geeksforgeeks.org/association-composition-aggregation-java/

Я могу понять, что Композиция подразумевает отношения, в которых ребенок не может существовать независимо от родителя, тогда как Агрегация подразумевает отношения, в которых ребенок может существовать независимо от родителя. Но не в состоянии понять, как я могу дифференцировать это программно. Ниже приведен пример Агрегации и Композиции, приведенный в ссылке. В обоих случаях классы имеют одинаковую структуру, за исключением того, что в классе Student и Department есть дополнительная переменная «name». Так как в Composition «дочерний элемент не может существовать независимо от родителя», но здесь я могу создать отдельный объект Book и использовать его, не добавляя его в библиотеку.

Aggregation

// student class
class Student 
{
    String name;
    int id ;
    String dept;

    Student(String name, int id, String dept) 
    { 
        this.name = name;
        this.id = id;
        this.dept = dept;
    }
}



/* Department class contains list of student
Objects. It is associated with student
class through its Object(s). */
class Department 
{
    String name;
    private List<Student> students;

    Department(String name, List<Student> students) 
    {
        this.name = name;
        this.students = students;    
    }

    public List<Student> getStudents() 
    {
        return students;
    }
}

Состав

class Book 
{
    public String title;
    public String author;

    Book(String title, String author)
    {
        this.title = title;
        this.author = author;
    }
}

// Libary class contains 
// list of books.
class Library 
{
    // reference to refer to list of books.
    private final List<Book> books;

    Library (List<Book> books)
    {
        this.books = books; 
    }

    public List<Book> getTotalBooksInLibrary()
    {
       return books;  
    }

}

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Насколько я могу судить (и, возможно, кто-то другой может дать лучший ответ), вы не можете оценить, является ли взаимосвязь агрегацией или композицией, просто взглянув на код Java. Это наоборот.

Сначала вы создаете концептуальную модель мира. В библиотеках есть книги, а у машин есть колеса. Тогда вы думаете - имеет ли смысл для книги существовать без библиотеки или для колеса существовать без автомобиля, в контексте, в котором я работаю в . Так, например, если вы пишете автомобильные гонки, вы не будете использовать колеса вне автомобилей. Но если вы пишете приложение для авторемонта, вы будете иметь дело с колесами независимо от конкретного автомобиля.

Итак, сначала вы решаете, нужна ли вам агрегация или композиция, а затем внедряете ее в свой код. Реализация может состоять в том, что объект Car имеет List<Wheel>, но вы не можете сказать, является ли это составом или агрегацией только из этого. Ключ заключается в том, что вы интерпретируете код (реализацию) на основе вашей концептуальной модели, а затем используете его в соответствии с этим.

Если это композиция, использование может иметь некоторые ограничения:

  • Ни один объект, кроме Car, не будет содержать ссылку на Wheel.
  • Wheel может быть даже закрытым или закрытым для пакета классом.
  • Если Car сохраняется в базе данных, при его удалении вы также автоматически удаляете все его Wheel s.

Но вы должны применить эти ограничения, если решите, что это композиция.

0 голосов
/ 01 мая 2018

В реальном мире книга может действительно существовать сама по себе, не будучи владельцем библиотеки. Но что если вместо этого у вас есть класс LibraryBook с полями типа dateAcquired и currentBorrower? Используя ваш дизайн, вы все равно сможете создать экземпляр LibraryBook без библиотеки.

Здесь языки наподобие C ++ могут быть более понятны в отношении композиции: в C ++ объект может содержать свои части значением . В Java каждый объект обрабатывается указателем (ОК, люди Java не называют их указателями; вместо этого они называют их ссылками.) Это затрудняет различие между составом и агрегацией. В Java вы делаете это, используя тщательный дизайн.

Например, мы можем сделать класс LibraryBook только экземпляром с помощью метода Library:

class Library {
    class LibraryBook {
        private LibraryBook() {/*private constructor prevents independent instantiation*/}
    }
    LibraryBook createBook(String title, etc...);
}

Кроме того, если мы сделаем методы-мутаторы LibraryBook доступными только для класса Library, мы сможем гарантировать, что книга останется частью своей собственной библиотеки.

...