Обычная версия
Java форум JavaTalks
форум программистов

Поиск   Пользователи   Группы   Регистрация 
 Профиль   Личные сообщения 

 Вход 

Агрегация и композиция.
Список форумов
 ->  Основы языка Java


 
Начать новую тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
Wild_klas : 54
Новичок

СообщениеЯнв 22, 2012 19:35 
Ответить с цитатой
Здравствуйте! Я разбираюсь с агрегацией и композицией. Что это такое я вычитал из литературы и здесь на форуме очень хорошо расписано. Но есть одно но, я не могу понять как это все использовать в коде.
Кто знает объясните пожалуйста.
_________________
К началу Посмотреть профиль Отправить личное сообщение
Pomkine : 2
Новичок

СообщениеЯнв 22, 2012 21:13 
Ответить с цитатой
Например, у нас есть независимые друг от друга классы Car, Driver, Speed.
Создаём класс MovingCar :

Код:
public class MovingCar extends Car {
Driver driver;
Speed speed;
...
}
К началу Посмотреть профиль Отправить личное сообщение
мсье клоц : 556
Постоянный посетитель

СообщениеЯнв 22, 2012 22:07 
Ответить с цитатой
Pomkine писал(а):
Например, у нас есть независимые друг от друга классы Car, Driver, Speed.
Создаём класс MovingCar :

Код:
public class MovingCar extends Car {
Driver driver;
Speed speed;
...
}
И что это, агрегация или композиция?

Wild_klas писал(а):
Здравствуйте! Я разбираюсь с агрегацией и композицией. Что это такое я вычитал из литературы и здесь на форуме очень хорошо расписано. Но есть одно но, я не могу понять как это все использовать в коде.
Кто знает объясните пожалуйста.
Думаю, для начала будет неплохо уяснить для себя (мне, кстати, тоже), что именно означают термины агрегация и композиция в отрыве от контекста ООП. Предлагаю начать с этого: http://www.thefreedictionary.com/aggregate http://www.thefreedictionary.com/compose.

[from Old French composer, from Latin compōnere to put in place; see component]
[from Latin aggregāre to add to a flock or herd, attach (oneself) to, from grex flock]

Из этого можно сделать вывод, что композиция представляет собой объект, состоящий из компонентов, т.е. то, без чего ну никак нельзя (человек - печень), агрегация же, скорее, означает принадлежность к этому объекту (человек - номер телефона).


Не подумайте, что я издеваюсь, это на самом деле может многое прояснить.

p.s.

Я могу ошибаться, т.к. сам не имею четкого представления по этому поводу, но, как понимаю, использовать в коде можно вот так:

Код:

public class Person {
   String name;
   String phoneNumber;
   Liver liver;
   
   Person(String name, String phoneNumber){
      this.name = name;
      this.phoneNumber = phoneNumber;
      liver = new Liver();
   }
   
   public static void main(String[] args) {
      String phoneNumber = "555-SHOE";
      Person pa = new Person("Al", phoneNumber);
      Person ma = new Person("Peggy", phoneNumber);
      Person son = new Person("Bud", phoneNumber);
      Person daughter = new Person("Kelly", phoneNumber);
   }
}


Каждая персона имеет печень, имя и номер телефона, однако номер телефона они делят между собой, в то время как печень и имя у каждого свои. Мне кажется это логичным.
К началу Посмотреть профиль Отправить личное сообщение
Wild_klas : 54
Новичок

СообщениеЯнв 29, 2012 10:16 
Ответить с цитатой
Спасибо.
_________________
К началу Посмотреть профиль Отправить личное сообщение
Wild_klas : 54
Новичок

СообщениеЯнв 30, 2012 20:04 
Ответить с цитатой
В конечном итоге у меня получилось такое:

Код:
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
    }

}

class Computer{
    float chastota;
    float ram;
    String nameProc;
    float video;
    Keyboard kl;
    Computer(){
    }

}

class Keyboard {
    String name;
    int knopok;
    Button but1[];
    public Keyboard() {
    }

}

class Mouse{
    String name;
    MouseButton mb;
    public Mouse() {
    }

}

class MouseButton{
    int knopok;

    public MouseButton() {
    }


}

class Button{

    public Button() {
    }

}


Понятное определение:
Цитата:
Агрегация – это свободный тип отношения между объектами – как
между компьютером и его периферийным оборудованием.

Композиция – это очень строгий тип отношения между объектами –
как между деревом и его листьями.



В моем примере:
Компьютер - клавиатура - это агрегация.
Мишка - кнопки мишки - композиция. Клавиатура - кнопки клавиатуры - тоже композиция.

Может кому - то пригодиться.
_________________
К началу Посмотреть профиль Отправить личное сообщение
__teoREtik__ : 64
Новичок

СообщениеЯнв 30, 2012 20:56 
Ответить с цитатой
Да, уж.

А если проще: композиция - это разновидность жесткой взаимосвязи между объектами, составляющими класс. Когда объект уничтожается, объекты, составляющие его, также уничтожаются.

Агрегация - это вид взаимосвязи объектов в классе, когда при уничтожении объекта этого класса, они могут и не уничтожиться (на них ссылаются в другом месте программы).
К началу Посмотреть профиль Отправить личное сообщение
Taky_ : 491
Бывалый

СообщениеЯнв 31, 2012 14:57 
Ответить с цитатой
На практике, важное различие - время жизни.
Если время жизни у объектов одинаковое, то это композиция и отношение можно рассматривать как "владение".
Если время жизни разное, то это просто агрегация. Мы осведомлены об этом объекте, однако он живет сам по себе.
К началу Посмотреть профиль Отправить личное сообщение
Староверъ : 7620
Ктапубеп
Откуда: Elfland

СообщениеЯнв 31, 2012 16:14 
Ответить с цитатой
Имеет смысл заметить, что некоторые книги (пока я знаю только одну - по DDD) утверждают наоборот.
_________________
JTalks Open Source Project, JT Webinars, JT Interview
К началу Посмотреть профиль Отправить личное сообщение Отправить e-mail
Taky_ : 491
Бывалый

СообщениеЯнв 31, 2012 17:06 
Ответить с цитатой
Т.е. там утверждается обратное про время жизни?
Но не опровергается тот факт, что композиция является более сильным отношением, относительно агрегации?
К началу Посмотреть профиль Отправить личное сообщение
Староверъ : 7620
Ктапубеп
Откуда: Elfland

СообщениеЯнв 31, 2012 23:50 
Ответить с цитатой
Нет, именно что эти понятия ставят наоборот - агрегация более сильная, чем композиция.
_________________
JTalks Open Source Project, JT Webinars, JT Interview
К началу Посмотреть профиль Отправить личное сообщение Отправить e-mail
Taky_ : 491
Бывалый

СообщениеФев 01, 2012 11:14 
Ответить с цитатой
Цитата из UML основы, Фаулера:
Цитата:
При композиции объект-часть может принадлежать только единственному целому; кроме того как правило, жизненый цикл частей совпадает с жизненным циклом целого: части живут и умирают вместе с целым.

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

Если обратиться к "UML. Руководтсво пользователя". То она дает следующие отношения агрегирования и композиции:
Цитата:
Агрегирование - специальный вид ассоциации, описывающий отношение между агрегатом(целым) и компонентом (частью).
Композиция - форма агрегирования, в котором целое владеет своими частями, имеющими одинаковое время жизни.

У меня это расхождение ни раз вызывало путаницу.

А нечто обратное надо полагать сказано в: http://www.ozon.ru/context/detail/id/5497184/

Domain-Driven Design. Tackling Complexity in the Heart of Software
Автор: Эрик Эванс
Переводчик В. Бродов

P.S. Я немного сконфужен, казалось бы базовые понятия...
К началу Посмотреть профиль Отправить личное сообщение
javadranik : 18
Новичок

СообщениеФев 01, 2012 21:30 
Ответить с цитатой
Сразу скажу, то что написано ниже может быть не верным.

Я воспринимаю так:
Есть класс Дом(я имею ввиду 16-этажку) и есть класс Квартира.

Дом состоит из Квартир. Квартира и Дом - очень взаимосвязанные, одно без другого существовать не может, нельзя взять и выбросить из дома квартиру.
Если не будет дома, не будет и квартир. Если удалят дом, то и квартиры пропадут тоже.
Это композиция, жесткая связь.

И есть Мебель. Мебель обычно принято иметь в Квартире, но если ее не будет, то мир от этого не разрушиться.
Это агрегация.

Если я воспринимаю неправильно, исправьте пожалуйста.
К началу Посмотреть профиль Отправить личное сообщение
 
Начать новую тему  Ответить на тему
Страница 1 из 1
Список форумов
 -> Основы языка Java


 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru