Russian Qt Forum
Ноябрь 22, 2024, 16:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: c++ 11/14 vs "старый c++"  (Прочитано 15269 раз)
AzazelloAV
Гость
« Ответ #15 : Июнь 22, 2017, 15:27 »


Это понятия ООП. Между объектами могут существовать отношения.
Одним из видов отношений являются ассоциации. Ассоциация означает, что экземпляры одного класса связаны с экземплярами другого класса.
Экземпляр ассоциации (связь) состоит из полюсов, связанных с объектами.
Часто ассоциативная связь реализуется в виде, когда её полюсы принадлежат одному и более объектам, участвующим в ассоциативной связи.

Частным случаем ассоциаций являются биполярные ассоциации.
Частным случаем биполярной ассоциации является ассоциация агрегации (отношение Часть/Целое). Целое определяет время жизни Части.
Со стороны Целого полюс ассоциативной может быть либо unique (уникальная или композитная агрегация), либо shared (обобщенная агрегация).
Со стороны Части может либо не быть полюса, либо быть none (полюс не агрегации).

Хотя в стандарт и ввели unique_ptr и shared_ptr, но кроме названий ничего общего полюсами уникальной (композитной) и обобщенной агрегации они не имеют.
При этом они могут быть использованы при реализации этих самых полюсов ассоциативных связей (наравне с raw указателем)) ).

Это какой то адский треш. Я всегда думал, что патерны придумали, чтобы разрабочикам было легче общатся. Не "делаю то-то, то-то, то-то, то-то", а использую петерн "название". Но со временем ситуация изменилась. Не патерны для прогеров, а прогеры для патернов. Теперь мне их хоть раз в пол года повторяй. И что самое инетересно - у всех они уже на подсознательном уровне. Проще это сделать, чем заучить вышенаписанное.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #16 : Июнь 22, 2017, 15:32 »

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

Ну это просто термины дурацкие и незапоминающиеся (я до сих пор не могу запомнить кто сильнее - композиция или агрегация). То ли дело в uml - закрашенный ромбик (композиция) сильнее незакрашенного (агрегация)
Записан
AzazelloAV
Гость
« Ответ #17 : Июнь 22, 2017, 15:49 »


Почему нет? (Абстрагируемся о том, что исключения вообще с Qt кодом не дружат (я уже давно не пишу на Qt, к сожалению)). Это единственный способ сообщить об ошибке в конструкторе. Альтернативой будет только богомерзкий метод bool init(); который можно внезапно забыть вызвать. Или вызвать дважды. В общем, вы поняли, придётся писать много документации о том, как использовать ваш класс. Вместо банального инстанцирования.

Тут с Вами готов поспорить. Вы же согласны, что конструктор нужно осторожно писАть, когда в нем может быть исключение. Вообщем это заманчиво на самом деле, но я (и Вы), как старпёры (в плохом смысле старпёры) поняли  - чем проще - тем лучше. В любом объекте, в котором конструктор может вызвать исключение есть критичные данные, без которых он не сможет функционировать - ошибки не будет, но и результата тоже. Вместо метода init спокойно можно использовать метод наподобие setData(...), чем грешат очееень многие. К тому же плюс такого подхода - вызвов виртуального метода.
« Последнее редактирование: Июнь 22, 2017, 15:51 от AzazelloAV » Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #18 : Июнь 22, 2017, 15:56 »

Частным случаем биполярной ассоциации является ассоциация агрегации (отношение Часть/Целое). Целое определяет время жизни Части.
Кажется, тут вы врёте. Из вики:
Цитировать
Агрегация (агрегирование по ссылке) — отношение «часть-целое» между двумя равноправными объектами, когда один объект (контейнер) имеет ссылку на другой объект. Оба объекта могут существовать независимо: если контейнер будет уничтожен, то его содержимое — нет.
Цитировать
Композиция (агрегирование по значению) — более строгий вариант агрегирования, когда включаемый объект может существовать только как часть контейнера. Если контейнер будет уничтожен, то и включённый объект тоже будет уничтожен.
Цитировать
Aggregation differs from ordinary composition in that it does not imply ownership. In composition, when the owning object is destroyed, so are the contained objects. In aggregation, this is not necessarily true

В чем расхождение?
Если часть является композитом целого, то удаление целого означает удаление части. Если агрегатом, то часть не удаляется (хотя часть бывает целесообразно удалять часть при удалении всех связанных экземпляров целого).
И в википедии не вполне корректные определения, лучше пользоваться определениями спецификации UML http://www.omg.org/spec/UML/, http://www.uml-diagrams.org/association.html

Вместо терминов агрегация, композиция, как видов ассоциаций, к концам ассоциаций целесообразнее применять понятия уникальная агрегация (unique), совместная агрегация (shared), не агрегация (none).
Сам экземпляр ассоциативной связи Link является совокупностью всех концов. Один конец не определяет ассоциативную связь.

Нет никакого обязательного соответствия, что агрегация это только ссылка, указатель или что-то еще; или что композиция это только inplace значение (расположенное непосредственно в экземпляре целого), и не может быть реализовано посредством raw, unique_ptr, shared_ptr, reference_wrapper или любого другого указателя, контейнера или ссылки.
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #19 : Июнь 24, 2017, 09:18 »

ИМХО 2-й пример добавляет работы процессору и его надо использовать там, где это действительно необходимо.
Такая избыточность должна быть использована с умом.
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #20 : Июнь 24, 2017, 21:14 »

ИМХО 2-й пример добавляет работы процессору и его надо использовать там, где это действительно необходимо.
Такая избыточность должна быть использована с умом.
вы это о чем вапще?
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #21 : Июнь 26, 2017, 08:11 »

ИМХО 2-й пример добавляет работы процессору и его надо использовать там, где это действительно необходимо.
Такая избыточность должна быть использована с умом.

ИМХО) это заблуждение. Что raw указатель, что unique_ptr работают одинаково быстро. Вся "избыточность" исчезает на этапе компиляции.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #22 : Июнь 26, 2017, 09:50 »


ИМХО) это заблуждение. Что raw указатель, что unique_ptr работают одинаково быстро. Вся "избыточность" исчезает на этапе компиляции.

Нет, там чуть больше инструкций. Кто-то из кутешников выкладывал куда-то (возможно, в рассылку) дизассемблированный код.
Из-за обработки исключений, нужно корректно сворачивать стек.
Но я на самом деле разочарую - это экономия на спичках; аналогичный код вставляется при использовании любого не-POD типа (ну представьте, есть 2 строки в классе, первая сконструирвалась, а вторая тровнула. Первую надо удалить. И так на каждый мембер)
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.213 секунд. Запросов: 23.