Имя: Пароль:
IT
 
ООП. Удаление циклической связанности
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
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) у каждого свои тараканы в голове
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс