|
|
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
вот так он поломался. Не код, а объект. Был квадрат, а стороны стали разными. теперь его нельзя назад преобразовать. Почему Мартину это ясно, я не знаю. Это мистический ооп туман. Если назад пробразовывать не надо - нет проблем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 03:51 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNtchingiz, но в моем ведь коде этой проблемы нет. из за этого Код: plaintext 1. так это явное преобразование любого кого попало в квадрат ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 03:54 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
tchingizвот так он поломался. Не код, а объект. Был квадрат, а стороны стали разными. теперь его нельзя назад преобразовать. Почему Мартину это ясно, я не знаю. Это мистический ооп туман. Если назад пробразовывать не надо - нет проблем. у меня ничего не ломается. потому, что я использую неизменяемые объекты. пускай и Мартин их узает и не парит себе башку. а если использовать изменяемые объекты и/или виртуальные методы, то принцип лисков будет нарушен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 03:55 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
tchingizZyK_BotaNtchingiz, но в моем ведь коде этой проблемы нет. из за этого Код: plaintext 1. так это явное преобразование любого кого попало в квадрат это не старый код. этот код новый, ведь мы уже знаем о типе Square и явно к нему приводим. я добавил приведение только потому, что ты попросил. можно удалить этот конструктор, и избавиться от проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 03:56 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
у тебя не ломается, потому что ты используешь явное преобразование. Поэтому принцип Лисков и нафиг не нужен вообще. можно строку в квадрат преобразовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 03:57 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
tchingizу тебя не ломается, потому что ты используешь явное преобразование. Поэтому принцип Лисков и нафиг не нужен вообще. можно строку в квадрат преобразовать. если удалить этот конструктор, принцип нарушаться будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 03:58 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
пользователь может написать: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 04:03 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
вот тут надо писать Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. у тебя foo выдает родителя, которого нельзя приводить к ребенку Код: plaintext 1. 2. 3. правильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 04:16 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNпользователь может написать: Код: plaintext 1. а это типа еще короче? чем? Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 04:19 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
вот эти твои комбинации называны в шаго 0 анафемой програмирования. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 04:22 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaN, У тебя нет клиента, полагающегося на аксиоматику базового класса. Потому и не ломается - нечему ))) Заведи в базовом классе ф-цию расчета площади (Она будет клиентом). Без ее явного переписывания (override) в наследниках работать будет неверно. Вариант 2 предъявления проблемы. Возьми сторонний класс, который получает фигуры, например коллекцию. И напиши функцию суммирования площади хранимых объектов. Если соблюсти DbC, то при работе программы правильно сформулированный инвариант родителя обломится, и ты узнаешь о проблеме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 09:34 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaN> class Square: public Rectangle, public Rhomb странное наследование. Чего хотим получить, козловерблюда? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 09:40 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNметоды работающие с прямоугольником могут работать и с квадратом, возвращая абсолютно идентичный результат(принцип Лисков).это не правда, точнее, не вся правда. Правдой будет написать, что "методы, работающие с прямоугольником, будут скомпилированы и с квадратом, возвращая абсолютно непредсказуемый вариант". В пояснение простой пример: есть функция, которая вписывает произвольный прямоугольник в заданный и возвращает полученный прямоугольник. Я хочу ей воспользоваться, чтобы в заданный прямоугольник вписать квадрат, а потом дальше использовать его, как квадрат. Для пары Rectangle( 10, 2 ) + Square( 5 ) я получу правильный ответ, для пары Rectangle( 2, 10 ) + Square( 5 ) - неправильный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 09:45 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
SiemarglZyK_BotaN, У тебя нет клиента, полагающегося на аксиоматику базового класса.у него нет ни одной проверки инвариантов ни для прямоугольника, ни для квадрата. Хотим изменить сторону у квадрата, воспользовавшись функцией базового класса - "бам!" - на тебе произвольный прямоугольник, хотим сделать квадрат из прямоугольника 3х4 - "бам!" - на тебе квадрат 4х4! почему именно такой, почему не 3х3? - потому что гладиолус! какие уж тут "контракты" ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 09:56 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
tchingiz оказалось невозможное корректное выполнение цепочка а) преобразование из ребенка в родителя б) выполнение метода в) восстановление ребенка взад. А зачем делать а), если можно сразу сделать б) и не делать с) Другое дело, что выполнение б) может нарушить инвариант ребенка и вызовет ошибку, так это нормальное поведение, так и д.б. Похоже, проблемы то и нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 12:20 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
tchingiz(класс это пара (множество_допустимых_значений, множество_функций), множество_допустимых_значений - это тип данных, а вот множество_функций - очень расплывчато. Я могу написать очень много функций, использующих этот тип данных в качестве парметров или значений, не включая их в класс. И что это будет ? Итак мы плавно возвращаемся к модульности в терминах АДы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 12:26 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
tchingizвот аксиомы обоих классов http://www.sql.ru/forum/actualthread.aspx?tid=756625&pg=4#9543464 Просто для квадрата SetWidthe и SetHeight должны вызываться одновременно (как один оператор или транзакция) и с одной и то же величиной, чтобы не разрушить квадрат. Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 12:32 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
tchingizПотом ты пишешь ребенка, херишь аксиомы родителя, и подсовываешь тем программам, которые написаны в предположении похереных аксиом ребенка под видом родителя. В результате клиент умирает от удивления. Нарушен принцип подстановки Лисков. аксиомы родителя полностью сохраняются, только дополняются аксиомами ребенка. попытки применить методы родителя к ребенку никакого удивления вызывать не должны - ошибки ожидаемы и запрограммированы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 12:37 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
tchingizвот тут надо писать Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. у тебя foo выдает родителя, которого нельзя приводить к ребенку в коде, где знают только о существовании суперкласса не могут использовать ф-и для работы с подкласом(showSquarе(foo(s))) зато клиент который вызывает старую ф-и(возвращающую прямоугольник), понимает что результат доанной ф-и не всегда можно привести к наследнику без потери точности. геде в принципе Лисков сказано о том, что родителя можно приводить к ребенку? tchingiz Код: plaintext 1. 2. 3. правильно? да ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 13:00 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
tchingizZyK_BotaNпользователь может написать: Код: plaintext 1. а это типа еще короче? чем? Код: plaintext 1. нет, просто можно обойтись и без приведения типов. во втором случае нет неоднозначностей, мы явно игнорируем угол ромба. в первом случае, перерасчет сторон квадрата не однозначен, ведь ф-я приведения может быть реализована по разному(например сохранять площадь фигуры). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 13:02 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
tchingizвот эти твои комбинации называны в шаго 0 анафемой програмирования. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. мы говорим о принципе Лисков? значит этот принцип предан анафеме как может выполняться принцип Лисков, если мы будем использовать виртуальные ф-и? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 13:04 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
SiemarglZyK_BotaN, У тебя нет клиента, полагающегося на аксиоматику базового класса. Потому и не ломается - нечему ))) Заведи в базовом классе ф-цию расчета площади (Она будет клиентом). Без ее явного переписывания (override) в наследниках работать будет неверно. Вариант 2 предъявления проблемы. Возьми сторонний класс, который получает фигуры, например коллекцию. И напиши функцию суммирования площади хранимых объектов. Если соблюсти DbC, то при работе программы правильно сформулированный инвариант родителя обломится, и ты узнаешь о проблеме. перерасчет будет работать верно, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. что я делаю не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 13:17 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
egorych[quot Siemargl]ZyK_BotaN, Хотим изменить сторону у квадрата, воспользовавшись функцией базового класса - "бам!" - на тебе произвольный прямоугольник где? у базового класса(Rectangle) нет ф-и изменения стороны, есть только изменение ширины или высоты. у базового класса Rhomb - есть ф-я изменения стороны и она работает коректно, гарантировано возвращая квадрат(так как угол тоно не измениться). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 13:20 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaN вывод : 33. что я делаю не так? Ты код то покажи. Полный, где getSpace() описан. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 13:40 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNegorych[quot Siemargl]ZyK_BotaN, Хотим изменить сторону у квадрата, воспользовавшись функцией базового класса - "бам!" - на тебе произвольный прямоугольникгде? у базового класса(Rectangle) нет ф-и изменения стороны, есть только изменение ширины или высоты.0. про ромб пока забудем опять, говорим за прямоугольник. 1. теперь по буквам: - мы говорим: квадрат - это прямоугольник ( отнаследовали квадрат от прямоугольника ). - у прямоугольника есть ширина и высота ( аксиома прямоугольника ), - у квадрата есть ширина и высота ( аксиома наследования ). - у квадрата ширина и высота совпадают ( аксиома квадрата ). - изменяя ширину ( или высоту ) я надеюсь получить квадрат ( принцип наименьшего удивления ), пусть приведённый к типу родителя ( требование языка ). Но! либо я получаю прямоугольник и по типу, и по содержанию, что противоречит аксиоме квадрата. Или я получаю квадрат ( переопределив сеттеры в наследнике ) и нарушаю аксиомы прямоугольника. Но противоречий ты технично не замечаешь. 2. по остальным пунктам обвинения сказать определённо нечего, ась? ;-)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 16:08 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=36919370&tid=1343356]: |
0ms |
get settings: |
5ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
223ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 209ms |
| total: | 527ms |

| 0 / 0 |
