|
ООП. Удаление циклической связанности | ☑ | ||
---|---|---|---|---|
0
Ненавижу 1С
гуру
27.04.12
✎
12:07
|
Известный прием удаление циклических связей классов - это выделение у одного из классов родительского.
Пример https://docs.google.com/open?id=0B19WBINYOdkuejVRWU1hclZjQTA Слева циклические связи, справа - после преобразования. В связи с чем у меня два вопроса: 1. Всегда ли любую схему классов можно избавить от циклических связей? 2. В данном примере выделен супер-класс "справа", понятно, что в данном абстрактном примере разницы нет никакой, но в реальных ситуациях, какие критерии выделения "слева или справа" или даже у обоих? |
|||
1
Ненавижу 1С
гуру
27.04.12
✎
12:39
|
кто нибудь занимается проектированием классов?
|
|||
2
Ненавижу 1С
гуру
27.04.12
✎
14:02
|
злые..
|
|||
3
Джинн
27.04.12
✎
14:04
|
Тут все одноэсники. Вы ошиблись форумом.
|
|||
4
Avganec
27.04.12
✎
14:06
|
Не надо так говорить... мы не злые...
1. нет ничего невозможного 2. все по логике проектированием занимаются все, кто кода-нибудь разрабатывал с нуля |
|||
5
HeroShima
27.04.12
✎
14:38
|
неугомонный: http://www.rsdn.ru/forum/design/4718244.1.aspx
(0) всё ресурсоконтекстнозависимо |
|||
6
izekia
27.04.12
✎
14:41
|
а почему бы сразу без циклических ссылок не спроектировать?
|
|||
7
Ненавижу 1С
гуру
27.04.12
✎
14:42
|
(6) пример. Учитель сообщает ученику задание (учитель знает об ученике), ученик решает задание и говорит его ни кому нибудь, а именно своему учителю (ученик знает, кому надо сообщить)
|
|||
8
HeroShima
27.04.12
✎
14:44
|
(7) тут не о сабже
|
|||
9
HeroShima
27.04.12
✎
14:51
|
тишина...
(0) асинхронная обработка сообщений решит все ваши проблемы... |
|||
10
Ненавижу 1С
гуру
27.04.12
✎
14:53
|
(9) а это тут зачем?
|
|||
11
izekia
27.04.12
✎
14:54
|
(7) ссылка на учителя в задании, между учителем и учеником вообще не должно быть ссылок, у ученика есть коллекция заданий
|
|||
12
izekia
27.04.12
✎
14:56
|
у учителя есть ссылка на курсы, которые он ведет, у групп есть ссылки на курсы, у ученика есть ссылка на группу
|
|||
13
Ненавижу 1С
гуру
27.04.12
✎
14:56
|
(11) ок, тогда Задание ссылается на Учителя
Учитель имеет понятие, какое Задание он выдает и связь тоже есть В итоге снова цикл |
|||
14
Ненавижу 1С
гуру
27.04.12
✎
14:56
|
(12) ты не фантазируй, я тебе пример привел, разруливай
|
|||
15
HeroShima
27.04.12
✎
14:57
|
(10) а это глобально, или укажи язык, в пределах которого танцевать. IRL циклические зависимости везде!
|
|||
16
Ненавижу 1С
гуру
27.04.12
✎
14:58
|
(15) язык?можно любой из следующих: Delphi, C++, C#
|
|||
17
izekia
27.04.12
✎
14:58
|
(14) пример копропроектирования, если так проектировать, то конечно надо задумываться над темами типа (0)
|
|||
18
izekia
27.04.12
✎
14:58
|
(15) а что у нас ооп, сильно различается в контексте этой задачи в разных языках?
|
|||
19
HeroShima
27.04.12
✎
14:59
|
(18) внекоторых случаях сильно
|
|||
20
Ненавижу 1С
гуру
27.04.12
✎
15:00
|
(17) я прошу спроектировать решение для (7) или (13)
|
|||
21
HeroShima
27.04.12
✎
15:01
|
+(19) опять же, я говорю обо всех языках, в том числе о ещё не спроектированных
|
|||
22
izekia
27.04.12
✎
15:01
|
еще раз повторюсь, у ученика не должно быть ссылки на учителя, в лучшем случае на задание, но она может быть пустой, соответственно у нас тут нет проблемы циклических ссылок, чистим задание и можем удалять, опять же у учителя ссылка на ученика может быть пустой
в идеале, есть учитель, есть ученик и есть задание которое содержит ссылки на них обоих, это для целей учета заданий |
|||
23
Ненавижу 1С
гуру
27.04.12
✎
15:02
|
(21) твой концепт сильнее моего ))
|
|||
24
HeroShima
27.04.12
✎
15:02
|
(23) ;)
|
|||
25
izekia
27.04.12
✎
15:03
|
(21) конкретный пример различий можно?
|
|||
26
HeroShima
27.04.12
✎
15:04
|
(23) дело в том, что мы хотим адекватно представить предметную область и не нарваться при этом на грабли системы реализации. в циклических связях самих по себе ничего вредного нет
|
|||
27
ЗлобнийМальчик
27.04.12
✎
15:04
|
(0) а почему надо избавлятся от циклических ссылок?
|
|||
28
Ненавижу 1С
гуру
27.04.12
✎
15:04
|
(27) ну это такой пунктик, как с неопределено и NULL
|
|||
29
izekia
27.04.12
✎
15:05
|
(27) это к ненавижу, он видимо не только 1С ненавидит)
|
|||
30
HeroShima
27.04.12
✎
15:06
|
(25) wiki:Objective-C
|
|||
31
Ненавижу 1С
гуру
27.04.12
✎
15:06
|
(22) ссылка это не только поле/свойство класса, это осведомленность класса о другом классе
class Teacher { Job* CreateJob(); //учитель осведомлен о заданиях } class Job { Teacher* teacher; //задание знает, кто его выдал } |
|||
32
ЗлобнийМальчик
27.04.12
✎
15:07
|
(0) ну придумайте класс менеджер и вынесите всю логику туда
|
|||
33
izekia
27.04.12
✎
15:07
|
(30) я попросил конкретный пример различия в контексте данной задачи, а не ссылку на вики
|
|||
34
izekia
27.04.12
✎
15:09
|
(31) одна из сылок лишняя, вся проблема в том, что ты проектируешь исходя из какого-то абстрактного представления, что кто про кого должен знать.
А надо просто отталкиваться от необходимой функциональности и исходя из этого проектировать, иначе можно много всего напроектировать |
|||
35
izekia
27.04.12
✎
15:09
|
ссылок*
|
|||
36
Ненавижу 1С
гуру
27.04.12
✎
15:11
|
(34) показывай как надо
|
|||
37
HeroShima
27.04.12
✎
15:14
|
(33) на C++ и Lisp данную "задачу" можно обыграть очень по-разному
|
|||
38
toypaul
гуру
27.04.12
✎
15:15
|
есть учитель
есть ученик есть задача есть задача_выданная_учителем_ученику - это отдельный класс |
|||
39
izekia
27.04.12
✎
15:15
|
первый вариант: к примеру учителю надо раздать и собрать задания, в таком случае целесообразно хранить ссылки на задания у учителя, и методы раздать и собрать будут работать с приватными коллекциями
|
|||
40
Ненавижу 1С
гуру
27.04.12
✎
15:15
|
(38) хорошо начал
|
|||
41
izekia
27.04.12
✎
15:16
|
(38) простите, но класс с объектом не надо путать
|
|||
42
izekia
27.04.12
✎
15:16
|
(37) казалось бы причем тут лисп и ооп?
|
|||
43
Ненавижу 1С
гуру
27.04.12
✎
15:16
|
(41) он пока не путает ничего, имхо
|
|||
44
toypaul
гуру
27.04.12
✎
15:16
|
(41) а кто путает
|
|||
45
ЗлобнийМальчик
27.04.12
✎
15:17
|
(41) мммм?????
|
|||
46
HeroShima
27.04.12
✎
15:17
|
(41) почему?
|
|||
47
izekia
27.04.12
✎
15:17
|
второй вариант, ученик получает задание и сдает его учителю
в этом случае оптимально хранить ссылку на учителя в задании, а коллекцию заданий в классе ученик |
|||
48
HeroShima
27.04.12
✎
15:17
|
(42) угадай! )
|
|||
49
Ненавижу 1С
гуру
27.04.12
✎
15:17
|
(47) все равно циклы
|
|||
50
izekia
27.04.12
✎
15:18
|
(44) задача, и задача_выданная_учителем_ученику ... это что такое? либо избыточная иерархия, вообще не нужная для данной задачи, либо путаем класс и его инстанс)
|
|||
51
YV
27.04.12
✎
15:19
|
(0) ClassBX is a ClassCX, так что все эти манипуляции не имеют смысла.
|
|||
52
toypaul
гуру
27.04.12
✎
15:19
|
izekia у тебя в институте логику преподавали?
|
|||
53
izekia
27.04.12
✎
15:19
|
(49) ммм, где ты увидел, покажи?
|
|||
54
izekia
27.04.12
✎
15:20
|
(52) да, все кроме программирования
|
|||
55
Ненавижу 1С
гуру
27.04.12
✎
15:20
|
вот решение согласно схемы в (0)
сделаем супер-класс для учителя - супервайзер учитель оповещает ученика о задании и передает ссылку на себя ученику как ссылка на супервайзера ученик не знает ничего про учителя, но осведомлен о некоем супервайзере, сообщает ему о выполненном задании |
|||
56
Ненавижу 1С
гуру
27.04.12
✎
15:20
|
(51) ну да
|
|||
57
toypaul
гуру
27.04.12
✎
15:21
|
(54) чот не похоже. какую-то ахинею несешь.
в (6) мы выделяем объекты = это ученик, учитель, задача. и отношения. учитель выдал ученику задачу. это отношение, которое мы выделяем в отдельный класс в терминах С++. |
|||
58
ЗлобнийМальчик
27.04.12
✎
15:21
|
есть учитель
есть ученик есть задача есть задача_выданная_учителем_ученику - это отдельный класс добаляем класс - синглтон Менеджер задач - и вуаля. Учителю надо выдать ученику задачу - опращаемся в менеджер и тот создает инстанс класса задача_выданная_учителем_ученику Ученик хочет сдать задачу - обращается в менеджер и сдает устраивает? |
|||
59
ЗлобнийМальчик
27.04.12
✎
15:22
|
(55) а почему супервайзер - это суперкласс учителя а не ученика?
|
|||
60
izekia
27.04.12
✎
15:23
|
(55) угу, офигенно классно, а чтобы знать какому супервайзеру сообщить о задаче мы еще один класс создадим
в чем выигрыш? |
|||
61
ЗлобнийМальчик
27.04.12
✎
15:24
|
(60)НЕТ ЦИКЛИЧЕСКИМ ССЫЛКАМ!!!!
я так понимаю |
|||
62
izekia
27.04.12
✎
15:24
|
(57) то есть отношение просто хранит три ссылки?
|
|||
63
ЗлобнийМальчик
27.04.12
✎
15:25
|
(62) ну типа того. Прямой перенос таблицы отношений на структуру классов
|
|||
64
toypaul
гуру
27.04.12
✎
15:25
|
(62) угу
|
|||
65
izekia
27.04.12
✎
15:27
|
(64) мне не нравится такой подход к проектированию, так как в данном случае нет реального объекта соответствующего отношению, и будет некая проблема с распределением функциональности ...
с точки проектирования бд может это и хорошо, но с точки зрения ООП мне вообще такое не нравится |
|||
66
izekia
27.04.12
✎
15:28
|
(63) => (65) нет такого объекта, как отношение
|
|||
67
ЗлобнийМальчик
27.04.12
✎
15:30
|
(66) зато парсер писать не надо....
|
|||
68
HeroShima
27.04.12
✎
15:30
|
(66) есть. у него ещё и тонна свойств может быть
|
|||
69
ЗлобнийМальчик
27.04.12
✎
15:30
|
к тому же вопрос о том есть такой объект как отношение или нету - я для себя не решил. Может кто извеликих на эту тему высказывался?
|
|||
70
izekia
27.04.12
✎
15:32
|
(68) в Лиспе?)
|
|||
71
ЗлобнийМальчик
27.04.12
✎
15:32
|
(70) в C# например
|
|||
72
Aprobator
27.04.12
✎
15:33
|
(3) ну какой ты 1С ник?
|
|||
73
izekia
27.04.12
✎
15:34
|
(67) да как решение с точки построения бд, оно вполне изящно, просто классы не обязательно должны копировать структуру бд
|
|||
74
izekia
27.04.12
✎
15:34
|
(71) нене, надо в Лиспе)
|
|||
75
orefkov
27.04.12
✎
15:36
|
Вы пипец какие-то.
Неужели циклические ссылки кому-то мешают жить? Они ведь везде и всегда. Сын папу что, через его любовницу должен только знать? В схеме вообще непонятно что нарисовано - какие-то классы, хотя ссылки могут быть не у классов, а у объектов друг на друга. Никаких проблем нет с циклическими ссылками. сборщик мусора нормальный или sharedptr/weakedptr. |
|||
76
ЗлобнийМальчик
27.04.12
✎
15:36
|
(74) лисп - это для меня слишком сложно... да и денех за него не плотют вроде...
(73) не должны. Но часто копируют. Это же удобно базу то мы проектируем исходя из реальных объектов - вполне логичненько перенести эту структуру на слой бизнес логики |
|||
77
izekia
27.04.12
✎
15:37
|
(76) а где в твоем рассуждении структура бд?
|
|||
78
ЗлобнийМальчик
27.04.12
✎
15:38
|
(75) мы тут извращаемся в рамках поставленной автором задачи
я вот лично не представляю себе зачем в реальности мне бы понадобилось от них избавляться и заморачиваться по их поводу на этапе проектирования |
|||
79
izekia
27.04.12
✎
15:39
|
(76) лисп и ооп лежат в разных плоскостях
|
|||
80
ЗлобнийМальчик
27.04.12
✎
15:40
|
(77) это скорее мой прием как одноэснега бывшего по проектированию классов: сначала представь как бы ты хранил данные системы в таблицах. А потом преобразуй таблички в классы.
Но вы совершенно правы - в описании задачи нет никакого указания на базу данных |
|||
81
ЗлобнийМальчик
27.04.12
✎
15:40
|
(79) ок. Не знаю и ничего не желаю знать про лисп
|
|||
82
HeroShima
27.04.12
✎
15:42
|
(79) лисп - метаязык. он лежит более в области ооп чем С++, это уж точно
|
|||
83
Ненавижу 1С
гуру
27.04.12
✎
15:42
|
как это зачем? а классика? модель не должна ничего знать о представлении и т.д.
|
|||
84
izekia
27.04.12
✎
15:42
|
(81) да речь о том, что хирашима хотел решать поставленную абстрактную задачу про классы на лиспе, предварительно еще пихнув ссылку на обджектив си зачем-то
|
|||
85
HeroShima
27.04.12
✎
15:44
|
(84) её можно решать хоть на асме
|
|||
86
ЗлобнийМальчик
27.04.12
✎
15:45
|
(83) event спасет отца русской демократии. Это если вы про MVC
|
|||
87
izekia
27.04.12
✎
15:46
|
(82) пример класса кружка на лиспе можно?
три метода: Добавить, Отлить, ПолучитьОбъемЖидкости |
|||
88
Ненавижу 1С
гуру
27.04.12
✎
15:46
|
(86) это уже синтаксический сахар пошел, а если посмотреть как он реализуется внутри, то примерно схему с добавленными классами и получим
|
|||
89
izekia
27.04.12
✎
15:47
|
(85) не надоело еще чушь нести?
|
|||
90
ЗлобнийМальчик
27.04.12
✎
15:49
|
(88) наверное... я так глубоко не интересовался....
|
|||
91
HeroShima
27.04.12
✎
15:49
|
(89) ты ничерта не понимаешь в ООП
|
|||
92
ЗлобнийМальчик
27.04.12
✎
15:49
|
(87) а что, это сложно???? я совершенно искренне спрашиваю...
|
|||
93
izekia
27.04.12
✎
15:49
|
(88) ну ты почему не хочешь понять, что я уже давно написал ... ты привел пример трех объектов из реальной жизни, на самом деле у них может быть столько функциональности, которой их можно напичкать, и которая в рамках конкретной задачи вообще не будет нужна, нужно исходить из необходимой функциональности и проектировать соответственно
|
|||
94
izekia
27.04.12
✎
15:50
|
(91) лол
|
|||
95
HeroShima
27.04.12
✎
15:50
|
(94) "и он ещё улыбается")
|
|||
96
izekia
27.04.12
✎
15:53
|
(95) я смеюсь во весь голос скорее, видимо что означает данная аббревиатура, Вы так же хорошо знаете
можно пример такого класса на классическом лиспе? |
|||
97
izekia
27.04.12
✎
15:54
|
(92) wiki:Лисп
первых двух абзацев должно хватить для понимания того о чем речь |
|||
98
izekia
27.04.12
✎
15:55
|
(92) на самом деле для расширения кругозора, а не для заработков, я бы порекомендовал поизучать какой-нибудь функциональный язык, хотя я в свое время выбрал хаскелл
|
|||
99
ЗлобнийМальчик
27.04.12
✎
15:59
|
(97) ужас какой...
(98) мысль интересная. Хотя я обычно предпочитаю практическую отдачу от своего обучения |
|||
100
ЗлобнийМальчик
27.04.12
✎
15:59
|
+(99) желательно деньгами)))
|
|||
101
izekia
27.04.12
✎
16:00
|
(91) а если попытаться ответить на твое сообщение серьезно, то да, какие-то вариации лиспа, которых я никогда не видел, позволяют реализовать что-то похожее на ооп, и то это судя по статье в вики, сам такого не видел
и да, на асме можно соорудить некое подобие возможности использовать нечто похожее на ооп, но мощь ооп в том и заключается, что ты можешь рисовать классы используя средства языка, а не извращаться создавая дополнительные сложности пытаясь эмулировать конструкции для которых данный язык не предназначен |
|||
102
ЗлобнийМальчик
27.04.12
✎
16:02
|
(101)вы имели в виду "мощь языков, реализующих ООП" - не так ли?
|
|||
103
izekia
27.04.12
✎
16:02
|
(99) ну выбирай питон тогда, этот язык как раз на стыке функционального и ооп, приятный синтаксис и есть возможность заработать и применить практически)
|
|||
104
HeroShima
27.04.12
✎
16:02
|
(97) а ты не побрезгуй и почитай дальше...
|
|||
105
izekia
27.04.12
✎
16:03
|
(102) да, спасибо
|
|||
106
izekia
27.04.12
✎
16:04
|
(104) надоел уже этот бессмысленный спор, в (101) попытался ответить
|
|||
107
izekia
27.04.12
✎
16:04
|
+ (105) отвлекают, мысль потерял немного)
|
|||
108
HeroShima
27.04.12
✎
16:05
|
(103) в чём преимущество метаклассов и декораторов питона?
|
|||
109
Ненавижу 1С
гуру
27.04.12
✎
16:05
|
да пятнично просто
|
|||
110
Stim213
27.04.12
✎
16:06
|
сегодня что, пятница?
|
|||
111
HeroShima
27.04.12
✎
16:06
|
(106) но ответ оказался в (102)
|
|||
112
izekia
27.04.12
✎
16:08
|
(108) а что без них никак?)
мне этот язык нравится, осваивается легко, есть признаки функционального языка без декораторов и метаклассов вполне можно жить, его сила не в этом) |
|||
113
izekia
27.04.12
✎
16:08
|
(111) а иди ты в опу, надоело уже
|
|||
114
HeroShima
27.04.12
✎
16:10
|
(113) ты имел в виду "в оопу"? )
|
|||
115
HeroShima
27.04.12
✎
16:10
|
(112) зачем-то они там есть... мне он тоже нравится, если что...
|
|||
116
izekia
27.04.12
✎
16:11
|
нет, я имел в виду то слово, которое не пропускает фильтр, в одном ты угадал, недостающая буква - первая
но она не "о", поэкпериментируй, если не пропустит, то это то что я и написал |
|||
117
izekia
27.04.12
✎
16:12
|
(115) нет, тебе лисп нравится, не надо тут юлить
|
|||
118
HeroShima
27.04.12
✎
16:13
|
(116)(117) да пиши что хочешь, но понимание сути ооп у тебя на зачаточном уровне
|
|||
119
izekia
27.04.12
✎
16:16
|
(118) я бы расстроился, но сижу смеюсь, не знаешь в чем причина?
|
|||
120
HeroShima
27.04.12
✎
16:17
|
(119) "блаженное неведение")
|
|||
121
izekia
27.04.12
✎
16:18
|
лано, спасибо за хорошее настроение, пора поработать
|
|||
122
Ненавижу 1С
гуру
27.04.12
✎
16:46
|
Например в Delphi не допускаются циклические ссылки
|
|||
123
izekia
27.04.12
✎
16:48
|
(122) хорошо что я дельфи даже не трогал никогда
|
|||
124
Ненавижу 1С
гуру
28.04.12
✎
09:07
|
Хорошо, для 1С-ников специально:
Пользователь жмакает кнопку на форме, форма вызывает метод документа-объекта (проводит, например) Форма осведомлена о документе-объекте, а он нет о форме и это правильно Потому что Вызывателя (форму) можно подменить и сделать обработкой Правда видел умников, где осведомление циклическое и это плохо Так вот! |
|||
125
SUA
28.04.12
✎
12:20
|
так в чем принципиальный вопрос?
после ответов "менеджер задач" он же "класс отношений"? |
|||
126
Ненавижу 1С
гуру
28.04.12
✎
12:22
|
(125) а что он решает? к нему надо ведь обращаться
с другой стороны он должен хранить ссылку, чтобы дать ответ |
|||
127
Ненавижу 1С
гуру
28.04.12
✎
12:25
|
+(126) без наследования никак
|
|||
128
izekia
28.04.12
✎
13:38
|
менеджер задач,кстати - плохое решение
|
|||
129
HeroShima
28.04.12
✎
14:49
|
(182) назови хорошее
|
|||
130
HeroShima
28.04.12
✎
14:49
|
(129) -> (128)
|
|||
131
izekia
28.04.12
✎
14:49
|
я сейчас пьян, после праздников
|
|||
132
Лефмихалыч
28.04.12
✎
14:59
|
(0) и охота тебе...
|
|||
133
Ненавижу 1С
гуру
28.04.12
✎
15:08
|
(132) у каждого свои тараканы в голове
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |