|
|
  |
си, паттерны ооп, разбиение на объекты, parent's parent, детско-родительские отношения |
|
|
|
Aug 15 2012, 18:57
|
Местный
  
Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874

|
не использую си++, использую си, абстрактные типы данных через incomplete structure pointer-ы собственно вопрос, как правильно организовывать взаимодействие объектов, когда "вложенный объект" должен вызывать родителя родителя?  ну например, есть палета ящиков с помидорами, ящик с помидорами, и помидор помидор портится через неделю и вызывает владельца всей палеты, что я мол испорчен  что почитать на эту тему с учётом языка?
Сообщение отредактировал Idle - Aug 15 2012, 18:59
|
|
|
|
|
Aug 15 2012, 19:54
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551

|
QUOTE (Idle @ Aug 15 2012, 21:57)  помидор портится через неделю и вызывает владельца всей палеты, что я мол испорчен  что почитать на эту тему с учётом языка? Если речь о паттернах, то это похоже на обозреватель (он же наблюдаталь, он же подписчик) http://ru.wikipedia.org/wiki/Design_Patterns
|
|
|
|
|
Aug 15 2012, 20:17
|
Местный
  
Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874

|
Цитата(ig_z @ Aug 15 2012, 23:54)  Если речь о паттернах да, речь о том как правильно спроектировать - выделить модули и определить взаимодействие между ними, в литературе по си такого не встречал поясню вопрос из примера: помидор, при протухании должен вызвать функцию менеджера склада, сообщив, в какой палете он находится, но помидор, как объект, про палету ничего знать не должен, иначе или надо сохранять её номер при заполнении ящика (и протаскивать номер насквозь через модули) или открывать структуру ящика и палеты для помидора
|
|
|
|
|
Aug 16 2012, 05:03
|
Местный
  
Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866

|
Цитата(Idle @ Aug 16 2012, 00:17)  поясню вопрос из примера: помидор, при протухании должен вызвать функцию менеджера склада, сообщив, в какой палете он находится, но помидор, как объект, про палету ничего знать не должен, иначе или надо сохранять её номер при заполнении ящика (и протаскивать номер насквозь через модули) или открывать структуру ящика и палеты для помидора Callback обычный же.
--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
|
|
|
|
|
Aug 16 2012, 06:20
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(Lotor @ Aug 16 2012, 08:03)  Callback обычный же. Ага, щаз! Помидорр обращается с челобитной к самому Путину,не забыв при этом оставить свой адрес, а он, опускаясь по иерархии, идентифицирует все координаты несчастного. Долго (бюрократия, йо!), но остальные методы требуют накладных расходов. Зато голова списка подшефного хозяйства видна всем. Ага?
Сообщение отредактировал _Pasha - Aug 16 2012, 06:21
|
|
|
|
|
Aug 16 2012, 06:35
|
Местный
  
Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874

|
Цитата(_Pasha @ Aug 16 2012, 10:20)  Долго (бюрократия, йо!), но остальные методы требуют накладных расходов. Зато голова списка подшефного хозяйства видна всем. Ага? мда, сейчас я так и делаю - структура палеты открыта для всех, но её приходится протаскивать "насквозь" сверху донизу до последнего помидора, чтобы помидор указал хозяину на палету вот эта вся детско-родительская история наводняет мне интерфейсы, ломает абстракцию и мешает делать TDD вот я пришёл к выводу что я что-то делаю не так и чего-то не знаю
|
|
|
|
|
Aug 16 2012, 07:32
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(_Pasha @ Aug 16 2012, 12:20)  Помидорр обращается с челобитной к самому Путину,не забыв при этом оставить свой адрес Во-первых, это злостное нарушение субординации. Во-вторых, максимум, что известно помидору - это то, что он сидит в ящике. Поэтому так: помидор сообщает ящику, а тот - дальше по иерархии. Ответная реакция такая же, только вниз по цепочке.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Aug 16 2012, 07:38
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(AHTOXA @ Aug 16 2012, 10:32)  Во-первых, это злостное нарушение субординации. Во-вторых, максимум, что известно помидору - это то, что он сидит в ящике. Поэтому так: помидор сообщает ящику, а тот - дальше по иерархии. Ответная реакция такая же, только вниз по цепочке. Аа, точно! Злостная ошибка у меня. Без поля owner не получится. А также peer_next, peer_prev ... селяви. Иначе - поиски по деревьям роняют всю производительность.
Сообщение отредактировал _Pasha - Aug 16 2012, 07:39
|
|
|
|
|
Aug 16 2012, 08:22
|
Местный
  
Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874

|
эволюция примерно такая, сначала всё изолированно и отлично тестируется, в конце всё наводняется родителем родителя, т.к. менеджером дело-то не ограничивается, взаимодействия-то могут происходить не только с менеджером, а ещё с уборщицей, которая это всё дело протухшее будет убирать и т.п. собственно вопрос не в том, как "моргнуть светодиодом", а как это делается - ссылки, ссылки  CODE -------------------------------------------------------------------------------- /* * manager doesn't care about the box */ tomato.c --- struct tomato { int weight; /* ... */ }; struct tomato *tomato_create(void) void tomato_destroy(struct tomato *tomato); int tomato_set_weight(struct tomato *tomato, int weight); int tomato_get_weight(const struct tomato *tomato); /* ... */ static void tomato_rot(struct tomato *tomato) { manager_call(); }
box.c --- struct box { struct tomato *tomatos; int count; /* .. */ };
struct box *box_create(void); int box_destroy(struct box *box); int box_add(struct box *box, struct tomato *tomato); -------------------------------------------------------------------------------- /* * manager does care about the box */ tomato.c --- struct tomato { struct box *parent; /* ... */ }; struct tomato *tomato_create(const struct *box) { /* ... */ tomato->parent = box; /* ... */ } static void tomato_rot(struct tomato *tomato) { manager_call(box); } -------------------------------------------------------------------------------- /* * pallet comes into play! */
pallet.h --- struct pallet { struct box *box; /* ... */ }
box.c --- struct box { struct pallet *pallet; struct tomato *tomatos; int count; /* .. */ };
struct box *box_create(struct pallet *pallet); int box_destroy(struct pallet *pallet, struct box *box); int box_add(struct pallet *pallet, struct box *box, struct tomato *tomato);
tomato.c --- struct tomato { struct pallet *pallet; /* instead of the box */ /* ... */ }; struct tomato *tomato_create(struct pallet *pallet) { /* ... */ tomato->pallet = pallet /* ... */ } void tomato_destroy(struct pallet *pallet, struct tomato *tomato); int tomato_set_weight(struct pallet *pallet, struct tomato *tomato, int weight); int tomato_get_weight(struct pallet *pallet, const struct tomato *tomato); /* ... */ static void tomato_rot(struct tomato *tomato) { manager_call(tomato->pallet); }
Сообщение отредактировал Idle - Aug 16 2012, 08:23
|
|
|
|
|
Aug 16 2012, 09:29
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(Idle @ Aug 16 2012, 01:57)  не использую си++, ................ что почитать на эту тему с учётом языка? А вот про исключения и их распространение в С++ и почитать. И вообще про механизм исключений (exeptions) в других языках. Ибо то, что хочется это и есть типичное применение этого механизма, который можно и на С реализовать, если очень захотеть.
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Aug 16 2012, 09:47
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
имхо, все с ног на голову! яйцо курице ничего не сообщает, это курица за яйцом следит, поворачивает его, греет и т.д.! помидор понятия не имеет, кто им владеет, и НЕ ДОЛЖЕН (имхо) никому САМ сообщать о своем самочувствии! палетта, тарелка, повар или иной владелец помидора должен запросить его состояние сам.
в этом раскладе отсутствует необходимость СНИЗУ ВВЕРХ знать своих "владельцев". СКЛАД имеет коллекцию СТЕЛЛАЖЕЙ, стеллаж - коллецию ПАЛЛЕТ, паллета - коллекцию ЯЩИКОВ, а ящик - коллецию ОВОЩЕЙ. каждые имеет метод GetState(). Начинается все с того, что мы запрашиваем СКЛАД.GetState(). В этом методе склад делает для каждого элемента коллекции стеллажей СТЕЛЛАЖ[i].GetState() и так далее.
по-моему, так гораздо логичнее.
P.S. кстати, тут отношения владелец-объект, а вовсе не родитель-ребенок. помидор никак не может быть ребенком палетты или ящика.
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Aug 16 2012, 09:56
|
Местный
  
Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874

|
Цитата(_Pasha @ Aug 16 2012, 12:57)  Тот, кому по должностной инструкции положено, обрабатывает сообщение и убирает. обрабатывать положено объекту менеджера, тут вопрос как правильно довести сообщение до менеджера от вложенной сущности палеты так, чтобы сохранить абстракции и избежать "сквозняка" будь он хоть в виде проходных обратных пробросов по цепочке родителей, хоть в виде проходного сохранения главного родителя внизу Цитата(_Pasha @ Aug 16 2012, 12:57)  А Вы хотите их сразу же удобно типизировать  . ну менеджер(компоненты системы) типизирован и абстрагирован без меня, моё дело - палета и ниже а внутри я удобно типизирую ввиду тестирования и tdd из-за оболваненности западной пропагандой  Цитата(SSerge @ Aug 16 2012, 13:29)  А вот про исключения и их распространение в С++ и почитать. И вообще про механизм исключений (exeptions) в других языках. Ибо то, что хочется это и есть типичное применение этого механизма, который можно и на С реализовать, если очень захотеть. посмотрю, спасибо Цитата(ARV @ Aug 16 2012, 13:47)  имхо, все с ног на голову! яйцо курице ничего не сообщает ... по-моему, так гораздо логичнее. это всё классно, но "поллинг" штука накладная, поэтому в спецификации на склад мне специфицировали именно "прерывание" но если именно так и принято, то спасибо за ответ
|
|
|
|
|
Aug 16 2012, 10:03
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Цитата(Idle @ Aug 16 2012, 13:56)  это всё классно, но "поллинг" штука накладная, поэтому в спецификации на склад мне специфицировали именно "прерывание" но если именно так и принято, то спасибо за ответ принято или нет - это вопрос вкуса. лично я учился ООП по парадигме "ООП лучше отражает структуру реального мира". В реальном мире никогда помидор никому о себе ничего не сообщает, разве что вонью на весь склад  и если бы я решал эту задачу, я бы сводил ее к созданию иерархии классов, наиболее адекватно отражающей объекты реального мира. в случае с "сообщениями" вы просто вынуждены породить некий класс "диспетчера", который должен знать, как с сообщениями поступать и т.д. в конечном счете, обработка очереди сообщений - тот же поллинг, только вынесенный в отдельный объект, наделенный особыми свойствами. В реальном мире диспетчер тоже есть - менеджер, но в реальном мире он сам решает, когда и откуда взять данные о состоянии склада, палетты и т.д. а в вашей модели вы заставляете гнилые помидоры самостоятельно жаловаться менеджеру... имхо, как-то не нормально это...
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|