|
|
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
egorychZyK_BotaN: >> ну и используйте в случае квадрата setSide, допустим, у меня есть легаси-код, работающий с прямоугольниками и, раз квадрат - наследник его, то я хочу, чтобы он работал с квадратами. Корректно работал. Обычно у меня это получается, если иерархия наследования составлена верно. и не получается, когда приходится помнить "здесь читать, здесь не читать, здесь рыбу заворачивать". >> а в случае int-а div. сами вы используйте свой div, мне инта вполне достаточно. Если в паскале нужен дополнительный "совсем целочисленный" тип, то это его проблема. У меня в С++ всё работает, как надо. старый код будет работать с квадратом врено. я гарантирую это. div - это не тип, а операция целочисленного деления. egorych >> вот именно. где вы видели у меня динамическое приведение. я возвращаю новый объект. а я и не говорил о динамическом приведении, я говорю о динамической смене типа. Я работаю с квадратом, а в какой-то момент получаю какой-то левый прямоугольник, если это не смена типов в момент работы программы, то я - испанский лётчик. вы таки испанский летчик? что-бы доказать обратное процитируйте код, где квадрат превращается в прямоугольник. egorych согласен? это ведь ты этот метод породил, чтобы соблюсти формальное условие, нет. я не видел такого формального условия в описании принципа подстановки Лисков. egorych Код: plaintext 1. 2. 3. 4. 5. 6. этот код, не только не идиал, но в отличии от моего порождает ошибку и не соответствует принципу подстановки Лисков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 01:41 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNты часто пользуешься такими объектами как : int, double, string? ихнее поведение не отличается от моего.у меня этих стрингов, как собак не резанных, в плюсах-то и у каждого - своё поведение А в сях так вообще строки нет, как таковой. и int и double не порождают других типов при операциях с подобными себе, и это сильно отличается от представленного тобой ЗЫ каламбур получился, кстати )) ЗЫЫ за хаскель комментировать не буду, может оно там действительно надо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 01:43 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNпроцитируйте код, где квадрат превращается в прямоугольник. если быть точнее, где он перестает быть квадратом. ведь прямоугольником он является всегда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 01:44 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
egorych и int и double не порождают других типов при операциях с подобными себе, и это сильно отличается от представленного тобой ЗЫ каламбур получился, кстати )) ЗЫЫ за хаскель комментировать не буду, может оно там действительно надо ты наверное про си, а в паскале и в делфе, операция еделения определена надо вещественными типами. как неявное преобразования int к double объяснить. наверное int все же должен быть подтипом double. в хаскле оно нужно не более чем в си. просто хаскель более продуманный язык, и система типов там помощнее будет. int, double и string я упомянул, что-бы оправдать иммутабельность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 01:49 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNстарый код будет работать с квадратом верно. я гарантирую это.зря подписался. Возвращаемся к примеру: Есть функция, обрабатывающая прямоугольники Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. - base - Rectangle( 10, 2 ), changed = Square( 5 ) и получу правильный ответ - base = Rectangle( 2, 10 ), changed = Square( 5 ) - неправильный. кроме того, я получу хороший оверхед на том, что постоянно буду конструировать объекты вместо того, чтобы их изменять, но это вопрос уже из другой песни, оставим его пока ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 02:01 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNZyK_BotaNпроцитируйте код, где квадрат превращается в прямоугольник. если быть точнее, где он перестает быть квадратом. ведь прямоугольником он является всегда.да вот же: Код: plaintext 1. >> как неявное преобразования int к double объяснить. наверное int все же должен быть подтипом double. 1. никакого преобразования не происходит, если я выполняю операции в рамках одного типа. 2. как неявное преобразование double к int объяснить, наверное double всё же должен быть подтипом int ( самому не смешно? мне - смешно, например ))) ) 3. эти неявные преобразования никакого отношения к наследованию не имеют >> int, double и string я упомянул, что-бы оправдать иммутабельность. тебе пришлось ввести иммутабельность, чтобы хоть как-то организовать наследование квадрата от прямоугольника, с изменяемыми объектами у тебя не выйдет ничего из этой затеи. Больше она низачем в данном случае, по крайней мере, не нужна. Это - факт! )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 02:09 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
egorych [/src]вполне себе бессмысленная функция. Теперь я туда подаю следующие пары: - base - Rectangle( 10, 2 ), changed = Square( 5 ) и получу правильный ответ - base = Rectangle( 2, 10 ), changed = Square( 5 ) - неправильный. кроме того, я получу хороший оверхед на том, что постоянно буду конструировать объекты вместо того, чтобы их изменять, но это вопрос уже из другой песни, оставим его пока Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. результат: Rectangle(5,2); Rectangle(2,5); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 02:10 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNэтот код, не только не идиал, но в отличии от моего порождает ошибку и не соответствует принципу подстановки Лисков.зато он хотя бы пытается хоть как-то проверить соответствие входящих параметров контракту класса, а не лепит непойми что из непойми чего по дефолту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 02:15 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
egorychZyK_BotaNZyK_BotaNпроцитируйте код, где квадрат превращается в прямоугольник. если быть точнее, где он перестает быть квадратом. ведь прямоугольником он является всегда.да вот же: Код: plaintext 1. это мой код? он не скомпилится. поясняю в очередной раз. зедесь нет подмены квадрата прямоукольником. мы берем метод setWidth, который возвращает прямоугольник основанный на объекте для которого его вызывают. нет здесь динамической подмены квадрата прямоугольником, а вернее квадрат остался квадратом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 02:16 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
egorychZyK_BotaNэтот код, не только не идиал, но в отличии от моего порождает ошибку и не соответствует принципу подстановки Лисков.зато он хотя бы пытается хоть как-то проверить соответствие входящих параметров контракту класса, а не лепит непойми что из непойми чего по дефолту. укажи мне, какой контракт мой код нарушает. я привел реализацию ф-и в которой ты ожидал ошибку. где эта ошибка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 02:17 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNрезультат: Rectangle(5,2); Rectangle(2,5);ога, блестяще. Теперь приведи 2й результат к квадрату и во втором случае ты получишь квадрат 5*5 и скажи мне, можно вписать квадрат 5*5 в прямоугольник 2*10? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 02:18 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
egorych кроме того, я получу хороший оверхед на том, что постоянно буду конструировать объекты вместо того, чтобы их изменять, но это вопрос уже из другой песни, оставим его пока на счет оферхеда, во сколько раз размер прямоугольника превосходит тип double? я думаю раза в 2. и что это за липовый оверхед? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 02:20 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
egorychZyK_BotaNрезультат: Rectangle(5,2); Rectangle(2,5);ога, блестяще. Теперь приведи 2й результат к квадрату и во втором случае ты получишь квадрат 5*5 и скажи мне, можно вписать квадрат 5*5 в прямоугольник 2*10? опять приведи к квадрату. ты забыл о чем мы говорили? мы говорили о старом коде который не знает о квадрате, и будет работать корректно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 02:21 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNtchingizegorychна основании какой из аксиом квадрата, прямоугольника, или, не дай бог, ромба, следует, что квадрат конструируется из высоты прямоугольника? а че не из площади или диагонали? )) кста, если добавить аксиому к тем четырем, то это будет новый тип Square, а не тот, с которого все началось. не из площади ли диагонали потому, что это метод заказал ты, явно указал что нужно инорить ширину: . во первых, когда? я про точное преобразование переживаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 02:21 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
egorych, найди мне в этой статье(или другой) - правило которому противоречит мой код. http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%BF%D0%BE%D0%B4%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B8_%D0%9B%D0%B8%D1%81%D0%BA%D0%BE%D0%B2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 02:23 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNмы берем метод setWidth, который возвращает прямоугольник основанный на объекте для которого его вызывают.назови его makeRectangle() и вопросы уйдут. Если я работаю с только с квадратами, на кой хрен мне сдался прямоугольник??? и да, я понимаю, что код не скомпилится, и я буду долго ломать голову, почему, потом, наконец, залезу с исходник твоего класса, если он у меня есть, или напишу тучу unit-тестов, чтобы выяснить, как работает твой класс. В конце концов я его выкину из проекта, как никуда не годный, и напишу свой квадрат, который всегда будет квадратом, и всем потом расскажу, какой плохой ты мне подсунул класс квадрата ;-)) но зато твой класс выполняет принцип подстановки Лисков, это единственная положительная в нём черта, правда практическая ценность которой, мне, к примеру, совершенно не очевидна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 02:24 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
tchingiz я про точное преобразование переживаю 1)я же процитировал тебя. 2) для неизменяемых объектов это не требуется. тот пример Милнера(или как его там) - доказал не состоятельность подхода при работе с изменяемыми объектами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 02:25 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
egorychZyK_BotaNмы берем метод setWidth, который возвращает прямоугольник основанный на объекте для которого его вызывают.назови его makeRectangle() и вопросы уйдут. Если я работаю с только с квадратами, на кой хрен мне сдался прямоугольник??? не надо прямоугольник? - юзай setWidth, но не надо забывать что квадрат является прямоугольником, и ты не можешь работать с квадратом не работая с прямоугольником, а на оборот можешь, в этом и разница между супертипом и подтипом. если ты не хочешь работать с прямоугольником - не наследуй от него квадрат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 02:27 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNegorychZyK_BotaNрезультат: Rectangle(5,2); Rectangle(2,5);ога, блестяще. Теперь приведи 2й результат к квадрату и во втором случае ты получишь квадрат 5*5 и скажи мне, можно вписать квадрат 5*5 в прямоугольник 2*10? опять приведи к квадрату. ты забыл о чем мы говорили? мы говорили о старом коде который не знает о квадрате, и будет работать корректно.и я об этом же. У меня есть квадрат и прямоугольник, мне нужно вписать в прямоугольник этот квадрат. И у меня есть функция, написанная для прямоугольников, логично ей воспользоваться, ты мне скажи? по мне, так логично. Берём, используем, всё компилируется, всё работает, и почти всегда корректно, за исключением некоторых данных, на которых результат получается неверным. Желаю приятных ночей в отладке такого бага ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 02:29 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
egorych но зато твой класс выполняет принцип подстановки Лисков, это единственная положительная в нём черта, правда практическая ценность которой, мне, к примеру, совершенно не очевидна. тема началась с контрактов и подстановки Лисков. я реализовал квадрат и прямоугольник, а вам не понравилось что он работает корректно. вы все время хотите нарушить контракт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 02:29 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNесли ты не хочешь работать с прямоугольником - не наследуй от него квадрат.Ес! Я тебе об том и говорю, что нельзя наследовать квадрат от прямоугольника, потому что это разные фигуры, с некоторыми похожими свойствами, не более того. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 02:31 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
автор >> как неявное преобразования int к double объяснить. наверное int все же должен быть подтипом double. 1. никакого преобразования не происходит, если я выполняю операции в рамках одного типа. 2. как неявное преобразование double к int объяснить, наверное double всё же должен быть подтипом int ( самому не смешно? мне - смешно, например ))) ) смешного, кстати, ничего нет. подкласс появляется когда в класс добавляют методы (функции) к группе целых по сложению добавили операцию умножения и деления и получили поле рациональных. В подклассе увеличился домен класса. и рациональные таки могут трактоваться как подкласс целых. А целые могут трактоваться как подкласс натуральных. К полугруппе натуральных по умножению добавили операция взятия обратного и получили группу целых. Более, того любой нормальное наследование которые вы делаете проходит по схеме увеличения домена класса. Доменом класса было декартово произведение длиной n, наследовали класс с добавлением одного поля. Получили домен класса из декартового произведения длинной n+1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 02:33 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNegorych но зато твой класс выполняет принцип подстановки Лисков, это единственная положительная в нём черта, правда практическая ценность которой, мне, к примеру, совершенно не очевидна. тема началась с контрактов и подстановки Лисков. я реализовал квадрат и прямоугольник, а вам не понравилось что он работает корректно. вы все время хотите нарушить контракт.предыдущий абзац остался не прочитанным, штоле? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 02:33 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
egorychZyK_BotaNegorychZyK_BotaNрезультат: Rectangle(5,2); Rectangle(2,5);ога, блестяще. Теперь приведи 2й результат к квадрату и во втором случае ты получишь квадрат 5*5 и скажи мне, можно вписать квадрат 5*5 в прямоугольник 2*10? опять приведи к квадрату. ты забыл о чем мы говорили? мы говорили о старом коде который не знает о квадрате, и будет работать корректно.и я об этом же. У меня есть квадрат и прямоугольник, мне нужно вписать в прямоугольник этот квадрат. И у меня есть функция, написанная для прямоугольников, логично ей воспользоваться, ты мне скажи? по мне, так логично. нет не логично. у меня есть ф-я sin, я подставляю целое, а получаю в результате дробь. здесь то же самое. пользуйся ф-й на здоровье, но она возвращает не квадрат а прямоугольник. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 02:34 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
egorychназови его makeRectangle() и вопросы уйдут. Если я работаю с только с квадратами, на кой хрен мне сдался прямоугольник??? и да, я понимаю, что код не скомпилится, и я буду долго ломать голову, почему, потом, наконец, залезу с исходник твоего класса, если он у меня есть, или напишу тучу unit-тестов, чтобы выяснить, как работает твой класс. что-бы выяснить как работает мой класс нужно миниммум усилий. нет ни виртуальных ф-й, ни исключительных ситуаций. На месте прямоугольника, квадрат работает точь-в-точь как прямоугольник. - это главный принцип. принцип подстановки Лисков. а то что ты предложил ему противоречит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 02:37 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=36921752&tid=1343356]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
209ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
95ms |
get tp. blocked users: |
1ms |
| others: | 247ms |
| total: | 604ms |

| 0 / 0 |
