Re[7]: Динамическая классификация объектов
От: Sinclair Россия https://github.com/evilguest/
Дата: 05.10.04 08:44
Оценка:
Здравствуйте, Merle, Вы писали:
M>А что с динамическим удалением делать?
M>Если ты поменял статус и уже реализуешь интерфейс IDivorced, то методы IMarried, по идее, должны быть уже не доступны..
Так вот собственно это и есть попытка ответить на вопрос "что с динамическим удалением делать?". Идея именно в том, что удалять — невозможно. Т.е. мы и потом сможем выполнять приведение Sinclair as IMarried.
M>Скажем метод Sinclair.AskWifeToMakeBreakfast(Omelette), должен, как минимум, сгенерить исключение...
По идее да. Потомка от IllegalStateException.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[7]: Динамическая классификация объектов
От: Sinclair Россия https://github.com/evilguest/
Дата: 05.10.04 08:44
Оценка:
Здравствуйте, Dimonka, Вы писали:
D>Попахивает тем, что IPerson будет расширятся интерфейсом IAdultPerson с возможностью хранения History женитьб/замужеств и возможностью производить других IPerson
Не, ну тут все как бы от предметной области зависит. Если мы моделируем антропологию, то марьяж никого не интересует. А если финансы — то интересует не столько воспроизводство, сколько иждивение и прочие развлечения.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[7]: Динамическая классификация объектов
От: Dax  
Дата: 05.10.04 09:04
Оценка:
Здравствуйте, Merle, Вы писали:

S>>Дома подумал и придумал, что в таком специальном случае мы не убираем из списка реализуемых интерфейс IMarried, а добавляем IDivorced. (В предположении, что динамическое добавление мы уже реализовали).

M>А что с динамическим удалением делать? Если ты поменял статус и уже реализуешь интерфейс IDivorced, то методы IMarried, по идее, должны быть уже не доступны.. Скажем метод Sinclair.AskWifeToMakeBreakfast(Omelette), должен, как минимум, сгенерить исключение...

Угу, и потом это исключение повсеместно ловить и далее вызывать по цепочке:

Sinclair.AskMistressToMakeBreakfast(Omelette)
Sinclair.AskGirlFriendToMakeBreakfast(Omelette)
Sinclair.AskSelfToMakeBreakfast(Omelette)
Sinclair.AskSomebodyToOrderBreakfast(Omelette)

естественно с ловлей соответствующих исключений .

Здаецца мне, просто попросить в начале интерфейс и дернуть за его метод — не самый лучший вариант решения такого рода проблемы.
Лучше уж сразу задать вопрос Синклеру-объекту на предмет наличия соответствующего метода, потому как он уж точно знает свое текущее состояние и, в крайнем случае, зная того, кто просит, сам может продиспатчить вызов до AskSomebodyToOrderBreakfast. А это как-то на СмолТок сильно смахивает.

Имху, при таком подходе строгие интерфейсы нужны только для группового добавления/удаления соответствующий методов, и ссылка на проэкспарившийся интерфейс получена быть не может, только целиком на разведенного Синклера
... << silent >>
Re[4]: Динамическая классификация объектов
От: Borisman2 Киргизия  
Дата: 05.10.04 10:38
Оценка:
V>Может быть. Насколько я понимаю, с атрибутами проблем не будет, но пока не понятно, можно ли на Питоне сделать хитрую отработку методов (см. "Реализации интерфейсов при множественной классификации"). А в этом вся соль.

Вопрос не в том, можно ли, а в том, насколько удобно
Re: Роль != Элемент иерархии
От: Borisman2 Киргизия  
Дата: 05.10.04 10:55
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Здравствуйте, borisman2, Вы писали:


ГВ>Стоп! Первые два балла. Задача — модель предметной области. Совет N0 — никогда не моделируйте данные. Моделируйте предметную область.


Ок, понимаю что Вы имеете в виду. Это вопрос терминологии, конечно. Как Вы могли убедиться далее, я именно и пытался моделировать предметную область. Тем не менее, замечание точное и ценное.

ГВ>В корне неверно. Люди (Person) могут находиться по отношению к тем или иным подсистемам в тех или иных ролях. Роль — суть независимый объект предметной области.


Простите, но это Вы так считаете, это для Вашего решения при помощи ролей все в корне не верно. Нисколько не уменьшая достоинств решения при помощи ролей, считаю, что это далеко не единственное и, может быть, далеко не лучшее решение. Вообще у меня чем дальше, тем больше складывается впечатление, что решение с ролями отражает неспособность ОО моделирования описывать динамические иерархии.

B>>class Applicant {

B>> public Applicant applicant; // Имелось ввиду public Person person? — ГВ


B>>}
B>>[/ccode]
Сорри, очепятка. Имелось в виду
class Applicant {
  public Application application;
}


ГВ>Да прекратите Вы привязываться к "чёткой иерархии классов", которая ничего кроме путаницы не вносит. Давайте утвердимся в мысли, что иерархия — сугубо технологическое понятие. В реальной предметной области как правило можно выделить подобные по структуре элементы и на основании выделенного подобия построить некоторую иерархию. Но и не более того. Ответьте себе на вопрос — а зачем обязательно притягивать за уши иерархию?

Вот это меня жутко позабавило. Немного истории, откуда есмь полезли все эти проблемы.
Дело было так. Раньше я всегда работал с РСУБД для хранения данных и в таких условиях ОО иерархии действительно ничего кроме технологического момента не вносят. А тут под свою задачу, я, наивный, написал ООБД и радуюсь сижу — вот, мол, щас забабахаю крутую иерархию, и будет все пучком. Ан нет, не тут то было, как оказалось... Обидно, получается зря ООБД писал ??? Скока усилий зря...

ГВ>Да. всё верно. Можно изменить класс. Но как насчёт того, чтобы ИЗМЕНИТЬ МНОЖЕСТВЕННОСТЬ отношения экземпляров? Нам известно, что User определён для некоторого одного пользователя, Applicant — тоже. А что насчёт того, что один User может быть юзером в нескольких местах или подателем нескольких разновидностей заявлений?

Вот, опять мы возвращаемся к старой доброй реляционной модели...Хоть это все и верно, я все больше печалюсь.

ГВ>Да. И на будущее — НЕ ЧИТАЙТЕ НА НОЧЬ АДЕПТОВ ООП! И утром не читайте. И вообще не читайте.

Ну, как всегда, практика оказалась в отрыве от теории
Re[2]: Динамическая классификация объектов
От: Borisman2 Киргизия  
Дата: 05.10.04 11:00
Оценка:
Здравствуйте, eugals, Вы писали:

E>
E>def promote(obj, klass):
E>    class NewClass( obj.__class__, klass):
E>            pass
E>        obj.__class__ = NewClass
E>


Обнаружилось одно очень неприятное обстоятельство — таким образом сделанные классы нельзя пиклить (сериализовать). Оно и понятно — они ж ни в каком модуле не определены!
Короче есть, конечно, заплатка, но блин сложная и потенциально глючная очень. Я в печали.
Re[8]: Динамическая классификация объектов
От: Merle Австрия http://rsdn.ru
Дата: 05.10.04 11:17
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Так вот собственно это и есть попытка ответить на вопрос "что с динамическим удалением делать?". Идея именно в том, что удалять — невозможно. Т.е. мы и потом сможем выполнять приведение Sinclair as IMarried.

M>>Скажем метод Sinclair.AskWifeToMakeBreakfast(Omelette), должен, как минимум, сгенерить исключение...
S>По идее да. Потомка от IllegalStateException.
Угу, но тут вылезает тот факт, что для правильной генерации такого исключения методы IMarried должны, прямо или косвенно, знать о возможности появления метода IDivorce, что не гуд.
... [ RSDN@Home 1.1.4 revision 142 ]
Мы уже победили, просто это еще не так заметно...
Re[4]: Динамическая классификация объектов
От: eugals Россия  
Дата: 08.10.04 17:20
Оценка: 43 (4)
Здравствуйте, Sinclair, Вы писали:

S>Смущает меня только один вопрос. Вот взяли мы и сохранили где-то ссылку на полученный таким образом IMarried. Как выполнить развод? Фишка в том, что добавление ролей никак не нарушает типизации. В системах со сборкой мусора персона просто не сможет получить развод, пока хоть кто-то знает о том, что она была жената.

S>Хотя это, скорее, общефилософский вопрос к системам с динамической классификацией: как быть в случае отказа от исполнения роли?

А как эта проблема решается в реальной жизни?
Вот разводится человек... После этого события ещё долго существует какая-то группа родственников и знакомых, которые продолжают считать его женатым. По-хорошему, ему надо бы обойти и проинформировать всех, кому он когда-либо говорил, что женат.
Вопрос в том, нужно ли ему и им это?
Если нет (а чаще всего так оно и есть), то всё ок — предложенная ранее схема работает.

Если же да (то есть, персистентная достоверность информации критически важна), для этого придуманы специальные механизмы.
Централизованные службы регистрации изменений персонального состояния! По-простому ЗАГС
Именно там и только там должна храниться информация о семейном положении.
Соответственно, спрашивать интерфейс IMarried нужно не у самого человека (а вдруг он соврет), а у специальных сервисов:

public class CROffice
{
    public void    Marry   ( IPerson one, IPerson another);
    public IPerson SpouseOf( IPerson one);
}
... << RSDN@Home 1.1.4 beta 2 >>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.