Модераторы: Се ля ви
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> прототипы в UML - расширение или агрегация, как отображать иерархию 
:(
    Опции темы
rene
Дата 23.4.2008, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 31.10.2006
Где: г. Висагинас, р. Литва

Репутация: нет
Всего: нет



По  аналогии с языками основанными на классах 
можно попробовать строить модель системы, которая будет
реализована на  JavaScript, как  диаграмму классов UML.
Но возникают сомнения: как отображать отношение объектов-конструкторов,
если одни из них является прототипом другого.
Как расширение(extend) или как агрегация(aggregation)?

Например, два объекта-конструктора:
Person и Employee(см рисунок).
Можно представить, что Employee расширяет
Person.  Person более общий объект, а Employee является более специализированным
и, наследуя все его свойства и методы, расширяет его.
Любой  служащий  являются человеком.

Но, так же можно представить, что работник любого
предприятия является человеком и поэтому группа
люди(Person) включает в себя всех тех,
кто являются служащими. Тогда Person агрегирует
в себя Employee.

Вычислитеольная модель наследования основана на понятии класса. Однако можно положить
в основу вычислительной модели понятие объекта. Объектно-оринетрированная вычислительная
модель структуирует объекты в виде агрегативных иерархий. Всякий раз, когда составной
объект(внешний объект) не в состоянии выполнить задание самостоятельно, он может вызвать методы
одного из его компонентных объектов(внутренних объектов) - это называется делегированием
(delegation).

Лешек А. Мацяшек "Анализ требований и проектирование систем" изд. "Вильямс", 2002 . - 428 с. М.
стр. 229-230 "Делегирование или наследование"


Как отображать пототипирование в диаграммах классов UML?

Присоединённый файл ( Кол-во скачиваний: 29 )
Присоединённый файл  all.JPG 14,30 Kb
PM MAIL ICQ   Вверх
Sardar
Дата 24.4.2008, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: нет
Всего: 317



Во первых потребуется понятие "уникальный объект", т.е. объект, интерфейс которого собирается по задаче на лету. Обычно мы не рассматриваем такой объект как нечто "полноценное", скорее как набор конфигов, к примеру:

Код
//jQuery
$.ajax({
   url: "someurl.php",  //поле
   success: function() {} //метод
});

Иногда такие объекты не заслуживают особого внимания, но чаще всего в силу вступает понятие "ожидаемый интерфейс", т.е. мы ожидаем некоторое поведение от объекта, не задумываясь что он есть на самом деле. Пойдём дальше, видим что принцип ожидаемого интерфейса используется всюду, мы даже часто проверяем есть ли какой особый метод, нет, пускаем исполнение по другой ветке, что естественно для динамически типизированных (duck typing) языков.

Выходит Employee это ожидаемый интерфейс, но совершенно не обязательно, что бы были какие либо "родственные" отношения с Person. Мало того, совершенно нету разницы как создать объект, по конструктору или литерально (если только скрипт не пользуется instanceof, что нужно в очень редких случаях). Значит то, как ты отобразишь эти два типа применительно к JS, зависит только от твоего вкуса - дизайн проги таки должен быть понятным, но в случае с JS, он не должен как либо ограничивать программинг (да и код с диаграмки просто так не сгенеришь).

Далее обсуждение в соответствующем разделе.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
rene
Дата 24.4.2008, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 31.10.2006
Где: г. Висагинас, р. Литва

Репутация: нет
Всего: нет



Цитата(Sardar @ 24.4.2008,  11:02)
 Значит то, как ты отобразишь эти два типа применительно к JS, зависит только от твоего вкуса - дизайн проги таки должен быть понятным, но в случае с JS, он не должен как либо ограничивать программинг (да и код с диаграмки просто так не сгенеришь).

Статья на wikepedia Объектно-ориентированное программирование говорит:

Прототипное программирование

Примерами языков программирования, где используется прототипное программирование, являются Self и JavaScript.

    * Создание новых объектов через клонирование прототипов.
    * Повторное использование кода достигается не через наследование, а с помощью делегирования.

А  статья Шаблон делегирования:

шаблон делегирования (англ. delegation pattern) — это способ, которым объект внешне выражает некоторое поведение, но в реальности передаёт ответственность за выполнение этого поведения связанному объекту. Шаблон делегирования является фундаментальной абстракцией которая поддерживает композицию (также называемую агрегацией), примеси (mixins) и аспекты (aspects).


Так может показывать ассоциации объектов-конструкторов как агрегирование?
PM MAIL ICQ   Вверх
AKS
Дата 24.4.2008, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Участник форума
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 20.9.2006

Репутация: нет
Всего: 52



Цитата(rene @  23.4.2008,  15:29 Найти цитируемый пост)
...как отображать отношение объектов-конструкторов,если одни из них является прототипом другого.

Какой смысл в том, что конструктор является чьим-либо прототипом?

PM MAIL   Вверх
Zeroglif
Дата 24.4.2008, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: нет
Всего: 66



Цитата(rene @  23.4.2008,  15:29 Найти цитируемый пост)
можно попробовать строить модель системы

Уже строят.

Цитата(rene @  23.4.2008,  15:29 Найти цитируемый пост)
Как расширение(extend) или как агрегация(aggregation)?

Первое. Вы же, видимо, строите модель на базе конструкторов, выдавая их за традиционные классы.

Цитата(rene @  24.4.2008,  11:52 Найти цитируемый пост)
Так может показывать ассоциации объектов-конструкторов как агрегирование?

Конструкторы в топку, если уж показывать, так объект+цепь прототипов, только вряд ли при этом можно назвать объект составным, в котором обитают "внутренние" объекты-прототипы. Не так же это.
PM MAIL WWW   Вверх
rene
Дата 24.4.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 31.10.2006
Где: г. Висагинас, р. Литва

Репутация: нет
Всего: нет



Цитата(AKS @ 24.4.2008,  12:00)
Цитата(rene @  23.4.2008,  15:29 Найти цитируемый пост)
...как отображать отношение объектов-конструкторов,если одни из них является прототипом другого.

Какой смысл в том, что конструктор является чьим-либо прототипом?

Ошибся. 
Если один из объектов является прототипом для другого
объекта-конструктора.

Код

function Person()
{
    this.name = new String()
}

function Employee()
{
   this.position =  new String()
}

Employee.prototype = new Person() 


PM MAIL ICQ   Вверх
Zeroglif
Дата 24.4.2008, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: нет
Всего: 66



Цитата(rene @  24.4.2008,  13:11 Найти цитируемый пост)
Если один из объектов является прототипом для другого
объекта-конструктора.

Если объект, созданный одним конструктором, является прототипом объекта, созданного другим конструктором.
PM MAIL WWW   Вверх
rene
Дата 24.4.2008, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 31.10.2006
Где: г. Висагинас, р. Литва

Репутация: нет
Всего: нет



Цитата(Zeroglif @ 24.4.2008,  13:21)
Цитата(rene @  24.4.2008,  13:11 Найти цитируемый пост)
Если один из объектов является прототипом для другого
объекта-конструктора.

Если объект, созданный одним конструктором, является прототипом объекта, созданного другим конструктором.

Извиняюсь, глуплю.
Код получаем следующий:
Код

function Person()
{
    this.name = new String()
}
function Employee()
{
   this.position =  new String()
}
Employee.prototype = new Person() 

employee = new Employee()


В UML-диаграмме классов отображаем только сами объекты(employee, person),
показывая, что employee расширяет person?


Присоединённый файл ( Кол-во скачиваний: 18 )
Присоединённый файл  extendObjects.jpg 6,88 Kb
PM MAIL ICQ   Вверх
rene
Дата 24.4.2008, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 31.10.2006
Где: г. Висагинас, р. Литва

Репутация: нет
Всего: нет



Цитата(Zeroglif @ 24.4.2008,  13:07)
Конструкторы в топку, если уж показывать, так объект+цепь прототипов, только вряд ли при этом можно назвать объект составным, в котором обитают "внутренние" объекты-прототипы. Не так же это.

Показываем агрегацию(ссылочная семантика), а не композицию(семантика значений).
То есть объект не включает внутрь себя прототип, прототип прототипа и т.д.

Ведь в JavaScript прототипирование это и есть как раз определение спецальной
ссылки на объект-прототип. При запросе к объекту, если свойство или метод
не найдены, то происходит обращение по ссылке prototype к объекту-прототипу.
При этом мы можем говорить, что объект делегирует часть своего поведения своему
объекту-прототипу. А это ведь и есть  агрегация!
PM MAIL ICQ   Вверх
Zeroglif
Дата 24.4.2008, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: нет
Всего: 66



Цитата(rene @  24.4.2008,  13:57 Найти цитируемый пост)
А это ведь и есть  агрегация!

Не знаю, что вы подразумеваете под термином "агрегация", обычно это "целое->часть" или "has-a" и т.п., то, что вы описываете можно скорее обобщить под ооп-термином "наследование", коим собсно и является делегирование в javascript...
PM MAIL WWW   Вверх
rene
Дата 25.4.2008, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 31.10.2006
Где: г. Висагинас, р. Литва

Репутация: нет
Всего: нет



Цитата(Zeroglif @ 24.4.2008,  14:39)
Цитата(rene @  24.4.2008,  13:57 Найти цитируемый пост)
А это ведь и есть  агрегация!

Не знаю, что вы подразумеваете под термином "агрегация", обычно это "целое->часть" или "has-a" и т.п., то, что вы описываете можно скорее обобщить под ооп-термином "наследование", коим собсно и является делегирование в javascript...

В JavaScript  можно говорить, что эффект аналогичный механизму наследованию классов
достигается через прототипирование. Нет классов, а есть только объекты.
объекты связываются через прототипирование-делегирование, которое:

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


и там же:


Покажем, что с помощью делегирования можно моделировать наследование и наоборот.
Это значит, что одни и те же функциональные возможности можно реализовать
как с помощью наследования, так и делегирования. Согласие в этом вопросе
впервые было достигнуто на конференции в США в городе Орландо, штат Флорида, в
1987 году и теперь известно как Орландское соглашение

Лешек А. Мацяшек "Анализ требований и проектирование систем" изд. "Вильямс", 2002 . - 428 с. М.
стр. 229-230 "Делегирование или наследование"


Эту главу можно прочитать здесь.

Это сообщение отредактировал(а) rene - 25.4.2008, 14:08
PM MAIL ICQ   Вверх
rene
Дата 30.4.2008, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 31.10.2006
Где: г. Висагинас, р. Литва

Репутация: нет
Всего: нет



Еще идея.

Связывание объектов  интерпретатором JavaScript через прототипирование приводит к тому, что объекты делегируют друг другу свойства и методы. Это, если мы говорим о внутренних механизмах
работы JavaScript. 

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



PM MAIL ICQ   Вверх
ida
Дата 14.5.2008, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


замужем
****


Профиль
Группа: Завсегдатай
Сообщений: 2277
Регистрация: 14.5.2002
Где: Санкт-Петербург

Репутация: 6
Всего: 58



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

Зачем вам еще форум?...
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Системный анализ, проектирование и UML"
Се ля ви

Форум "Системный анализ, проектирование и UML" предназначен для обсуждения вопросов, так или иначе связанных с этапами жизненного цикла автоматизированных (программных, информационных, автоматических) систем:

• предпроектные обследования объектов автоматизации;

• разработка концепции создания систем;

• моделирование бизнес-процессов (в т.ч. на UML);

• проектирование архитектуры систем;

• управление проектами;

• управление качеством;

• CASE-средства;

• реинжиниринг.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Се ля ви.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Системный анализ, проектирование и UML | Следующая тема »


 




[ Время генерации скрипта: 0.0605 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.