|
|
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
SiemarglZyK_BotaN вывод : 33. что я делаю не так? Ты код то покажи. Полный, где getSpace() описан.да не, площади-то у прямоугольника и квадрата вычисляются одинаково ( width*height ), этот пример будет работать корректно, все косяки связаны с размерами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 16:11 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
SiemarglZyK_BotaN вывод : 33. что я делаю не так? Ты код то покажи. Полный, где getSpace() описан. ага, забыл Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 18:23 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
egorychZyK_BotaNegorych[quot Siemargl]ZyK_BotaN, Хотим изменить сторону у квадрата, воспользовавшись функцией базового класса - "бам!" - на тебе произвольный прямоугольникгде? у базового класса(Rectangle) нет ф-и изменения стороны, есть только изменение ширины или высоты.0. про ромб пока забудем опять, говорим за прямоугольник. - изменяя ширину ( или высоту ) я надеюсь получить квадрат ( принцип наименьшего удивления ) где здесь принцип наименьшего удивление? есля я изменяю ширину, какого ... будет изменяться высота. есть метод setSide, его и юзай. egorych , пусть приведённый к типу родителя ( требование языка ). Но! либо я получаю прямоугольник и по типу, и по содержанию, что противоречит аксиоме квадрата. какой аксиоме? egorych Или я получаю квадрат ( переопределив сеттеры в наследнике ) и нарушаю аксиомы прямоугольника. Но противоречий ты технично не замечаешь. не делай так. egorych 2. по остальным пунктам обвинения сказать определённо нечего, ась? ;-)) я не понимаю, почему изменяя только ширину квадрата, Вы хотите получить квадрат. меня бы такое поведение удивило бы. подтверждением моей точки зрения является вечная ошибка новичков, которые не знают что 2/3 = 0. а в паскале все ок. 1/2 = 0.5 и я с господином Виртом согласен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 18:30 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
egorychSiemarglZyK_BotaN вывод : 33. что я делаю не так? Ты код то покажи. Полный, где getSpace() описан.да не, площади-то у прямоугольника и квадрата вычисляются одинаково ( width*height ), этот пример будет работать корректно, все косяки связаны с размерами. и я о том же. если сделать объекты фигур неизменяемые(частая практика: примитивные типы, строки) и не использовать виртуальных методов(они тогда не нунжны), то принцип Лисков нарушаться не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 18:32 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaN, Ты чего то опять забыл. У тебя в Square неоднозначность вызова getSpace(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 18:56 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
SiemarglZyK_BotaN, Ты чего то опять забыл. У тебя в Square неоднозначность вызова getSpace(). все ок, неоднозначность решается клиентом, Код: plaintext Код: plaintext 1. 2. 3. 4. 5. 6. 7. но это уже не обязательно. явное указание родителя, которому принадлежит метод - нормальная практика. например ее используют в языке F#. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 19:02 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
SiemarglZyK_BotaN, Ты чего то опять забыл. У тебя в Square неоднозначность вызова getSpace(). а ошибка у меня там математическая(в случае с ромбом), угол у меня храниться в градусах, а синус наверное ожидает радианы, но нашей дискуссии это не касается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 19:15 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
начнём с конца ZyK_BotaNя не понимаю, почему изменяя только ширину квадрата, Вы хотите получить квадрат. меня бы такое поведение удивило бы.потому что я хочу писать правильные, корректно работающие, понятные и легко сопровождаемые программы без излишнего оверхеда на ровном месте. Если я работаю только в рамках типа "квадрат", или "int", то я всегда хочу в этих рамках оставаться, и не испытывать проблем с чехардой типов. Целочисленное деление 1 на 2 должно мне возвращать 0, функция класса "квадрат" с говорящим названием SetWidth() должна возвращать мне "квадрат", а ещё лучше менять текущий объект и, может быть, возвращать ссылку на него. Назови её GetRectangleWithNewWidth() и мои претензии сразу пропадут. Динамическая смена типов приводит к усложнению программы, а как следствие - к трудноуловимым плохо локализуемым ошибкам. ZyK_BotaNподтверждением моей точки зрения является вечная ошибка новичков, которые не знают что 2/3 = 0. а в паскале все ок. 1/2 = 0.5 и я с господином Виртом согласен.Ну а я - нет ( правда удивительно?:)) )Проблемы новичков меня заботят мало, если им везде подстилать соломку, то они так и останутся новичками, а мне бы хотелось, чтобы профессионалов и знатоков в программировании становилось больше, их и так не хватает катастрофически. Заодно вспомним, что паскаль создавался именно как _учебный_ язык программирования. И тот факт, что он стал применяться ( и успешно ) в промышленных разработках, этого не отменяет. ZyK_BotaNegorychлибо я получаю прямоугольник и по типу, и по содержанию, что противоречит аксиоме квадрата. какой аксиоме?у квадрата высота и ширина _одинаковые_, отсюда следствие, что изменение высоты приводит к изменению ширины, и наоборот. Чингиз ссылку на них опубликовывал на второй странице этого обсуждения. >> есть метод setSide, его и юзай. я всё ещё жду комментария на этот вот простой пример. и ещё хочется услышать ответ на этот простой вопрос egorychхотим сделать квадрат из прямоугольника 3х4 - "бам!" - на тебе квадрат 4х4! почему именно такой, почему не 3х3?на основании какой из аксиом квадрата, прямоугольника, или, не дай бог, ромба, следует, что квадрат конструируется из высоты прямоугольника? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 20:29 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
_модtchingiz оказалось невозможное корректное выполнение цепочка а) преобразование из ребенка в родителя б) выполнение метода в) восстановление ребенка взад. А зачем делать а), если можно сразу сделать б) и не делать с) Другое дело, что выполнение б) может нарушить инвариант ребенка и вызовет ошибку, так это нормальное поведение, так и д.б. Похоже, проблемы то и нет. а нужно сделать, чтобы передать ребенка в ранее написанные программы для родителя ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 20:29 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaN, что ты делаешь с цитатами вечно? задолбался править тебя. сложи в зип весь код и прилепи сюда, а то не возможно бегать по постам . а нельзя его упростить, кстати. Хватит одного наследования для иллюстрации замечательной мысли про неизменяемые объекты. Лучше квадрат и прямоугольник оставить - меньше работать придется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 20:33 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
tchingizа нельзя его упростить, кстати. Хватит одного наследования для иллюстрации замечательной мысли про неизменяемые объекты. Лучше квадрат и прямоугольник оставить - меньше работать придется+1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 20:35 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
_модtchingizПотом ты пишешь ребенка, херишь аксиомы родителя, и подсовываешь тем программам, которые написаны в предположении похереных аксиом ребенка под видом родителя. В результате клиент умирает от удивления. Нарушен принцип подстановки Лисков. аксиомы родителя полностью сохраняются, только дополняются аксиомами ребенка. попытки применить методы родителя к ребенку никакого удивления вызывать не должны - ошибки ожидаемы и запрограммированы. если при наследовании происходит уменьшение домена типа например, как от вещественных к целым, или от целых к натуральным, а меньшее множество обладает свойством идеала относительно операции, скажем f : X >< X -> X, (где X домен родителя. а Y домен ребенка, Y входит в X) то есть, для любого x из X и y из Y f (y, x) попадает в Y, то можно вызывать методы родителя сколько угодно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 20:39 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
_модtchingiz(класс это пара (множество_допустимых_значений, множество_функций), множество_допустимых_значений - это тип данных, а вот множество_функций - очень расплывчато. Я могу написать очень много функций, использующих этот тип данных в качестве парметров или значений, не включая их в класс. И что это будет ? Итак мы плавно возвращаемся к модульности в терминах АДы. я с твоего позволения буду называть множество_допустимых_значений доменом типа, ибо тип - это спецификация класса, то есть, набор аксиом. пиши функции, не включая в класс. Это будут функции не включенные в класс. В классе вещественных есть сложение, умножение, деление, отнимание. а извлечения корня может не быть, экспоненты может не быть, синуса и косинуса. Среди множества всех написанных функций, желательно выделить подмножество таких, которые нельзя написать через другие, и их то и вносить в класс. Судьба остальных зависит от произвола проектировщика ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 20:45 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
egorychна основании какой из аксиом квадрата, прямоугольника, или, не дай бог, ромба, следует, что квадрат конструируется из высоты прямоугольника? а че не из площади или диагонали? )) кста, если добавить аксиому к тем четырем, то это будет новый тип Square, а не тот, с которого все началось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 20:50 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNSiemarglZyK_BotaN, Ты чего то опять забыл. У тебя в Square неоднозначность вызова getSpace(). все ок, неоднозначность решается клиентом, Код: plaintext Код: plaintext 1. 2. 3. 4. 5. 6. 7. но это уже не обязательно. явное указание родителя, которому принадлежит метод - нормальная практика. например ее используют в языке F#. Знаешь, такой стиль программирования побуждает меня тебя придушить. Но это наверное, уже оффтоп, не относящийся к правильному и тем более контрактному програмировнию )))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2010, 22:25 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
egorychначнём с конца ZyK_BotaNя не понимаю, почему изменяя только ширину квадрата, Вы хотите получить квадрат. меня бы такое поведение удивило бы.потому что я хочу писать правильные, корректно работающие, понятные и легко сопровождаемые программы без излишнего оверхеда на ровном месте. Если я работаю только в рамках типа "квадрат", или "int" ну и используйте в случае квадрата setSide, а в случае int-а div. egorych Целочисленное деление 1 на 2 должно мне возвращать 0, функция класса "квадрат" с говорящим названием SetWidth() должна возвращать мне "квадрат" вот именно что "целочисленное деление", а не обычное. вот и юзайте div. с квадратом то же самое, зачем себе придумывать проблемы, мы ведь знаем, что если setWidth будет изменять высоту, то у нас появятся проблемы. дак зачем нам эти проблемы? egorych а ещё лучше менять текущий объект и, может быть, возвращать ссылку на него. Назови её GetRectangleWithNewWidth() и мои претензии сразу пропадут. Динамическая смена типов приводит к усложнению программы, а как следствие - к трудноуловимым плохо локализуемым ошибкам. вот именно. где вы видели у меня динамическое приведение. я возвращаю новый объект. egorych Проблемы новичков меня заботят мало, если им везде подстилать соломку, то они так и останутся новичками, а мне бы хотелось, чтобы профессионалов и знатоков в программировании становилось больше, их и так не хватает катастрофически. вы противоречите сами себе. тов для вас работающий код не интуитивный. а теперь вы рассказываете что вам начхать на новичков. egorychхотим сделать квадрат из прямоугольника 3х4 - "бам!" - на тебе квадрат 4х4! почему именно такой, почему не 3х3? здесь я с вами абсолютно согласен: /topic/800476&pg=4#9674234 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 00:36 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
egorychZyK_BotaNметоды работающие с прямоугольником могут работать и с квадратом, возвращая абсолютно идентичный результат(принцип Лисков).это не правда, точнее, не вся правда. Правдой будет написать, что "методы, работающие с прямоугольником, будут скомпилированы и с квадратом, возвращая абсолютно непредсказуемый вариант". В пояснение простой пример: есть функция, которая вписывает произвольный прямоугольник в заданный и возвращает полученный прямоугольник. Я хочу ей воспользоваться, чтобы в заданный прямоугольник вписать квадрат, а потом дальше использовать его, как квадрат. Для пары Rectangle( 10, 2 ) + Square( 5 ) я получу правильный ответ, для пары Rectangle( 2, 10 ) + Square( 5 ) - неправильный. можете метод хотябы на псевдокоде написать? а то я суть не понял. egorych а потом дальше использовать его, как квадрат. в этом ваша проблема. вы хотите использовать результат ф-и работающей с прямоугольником в качестве квадрата. вас не смущает что sin(1) - не целое? здесь аналогично. вы понимаете что такое подтип? и что объект типа, не всегда можно без потери точности привести к подтипу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 00:42 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
egorychtchingizа нельзя его упростить, кстати. Хватит одного наследования для иллюстрации замечательной мысли про неизменяемые объекты. Лучше квадрат и прямоугольник оставить - меньше работать придется+1 что +1? а кто мне про ромб напомнил? хорошо, ромб удалю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 00:44 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
Siemargl Знаешь, такой стиль программирования побуждает меня тебя придушить. Но это наверное, уже оффтоп, не относящийся к правильному и тем более контрактному програмировнию )))) а можно конкретней. покажи мне исправленный код? что плохого в том, что явно задается имя класса где реализован метод? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 00:47 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
tchingizБолее того, точно такой же техникой на с++, какой записывалось порождение квадратов из прямоугольников, можно записать порождение прямоугольников из квадратов. нет, тогда код будет работать не корректно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 00:50 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
tchingizegorychна основании какой из аксиом квадрата, прямоугольника, или, не дай бог, ромба, следует, что квадрат конструируется из высоты прямоугольника? а че не из площади или диагонали? )) кста, если добавить аксиому к тем четырем, то это будет новый тип Square, а не тот, с которого все началось. не из площади ли диагонали потому, что это метод заказал ты, явно указал что нужно инорить ширину: tchingiz Так и у Мартина нет проблемы. Скопировал квадрат в прямоугольник, изменил его ширину и все. а мне это метод нафиг не надо. хорошо, выпилю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 00:52 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNegorychа потом дальше использовать его, как квадрат.в этом ваша проблема. вы хотите использовать результат ф-и работающей с прямоугольником в качестве квадратанеа, это твоя проблема, потому что ты используешь наследование там, где оно противоречит всему, кроме одного утверждения: квадрат - это частный случай прямоугольника. Чтобы доказать обратное ты создал такое количество ограничений, что пользоваться иерархией и не породить ошибку стало практически не возможно. Пришлось даже отказаться от использования виртуальных методов и изменяющих методов класса, и, чтобы это не выглядело совсем глупонепрезентабельно, рассказываешь истории про пользу функционального стиля программирования и занимаешься софистикой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 01:10 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
egorychZyK_BotaNegorychа потом дальше использовать его, как квадрат.в этом ваша проблема. вы хотите использовать результат ф-и работающей с прямоугольником в качестве квадратанеа, это твоя проблема, потому что ты используешь наследование там, где оно противоречит всему, кроме одного утверждения: квадрат - это частный случай прямоугольника. Чтобы доказать обратное ты создал такое количество ограничений, что пользоваться иерархией и не породить ошибку стало практически не возможно. Пришлось даже отказаться от использования виртуальных методов и изменяющих методов класса, и, чтобы это не выглядело совсем глупонепрезентабельно, рассказываешь истории про пользу функционального стиля программирования и занимаешься софистикой. ты часто пользуешься такими объектами как : int, double, string? ихнее поведение не отличается от моего. вот пример иерархии типов хаскелла, в подтверждение что не только я считаю Целые подтипом Вещественных: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 01:22 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaN ты часто пользуешься такими объектами как : int, double, string? ихнее поведение не отличается от моего. я здесь имел ввиду иммутабельность и отсутствие виртуальных методов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 01:24 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaN: >> ну и используйте в случае квадрата setSide, допустим, у меня есть легаси-код, работающий с прямоугольниками и, раз квадрат - наследник его, то я хочу, чтобы он работал с квадратами. Корректно работал. Обычно у меня это получается, если иерархия наследования составлена верно. и не получается, когда приходится помнить "здесь читать, здесь не читать, здесь рыбу заворачивать". >> а в случае int-а div. сами вы используйте свой div, мне инта вполне достаточно. Если в паскале нужен дополнительный "совсем целочисленный" тип, то это его проблема. У меня в С++ всё работает, как надо. >> вот именно что "целочисленное деление", а не обычное. вот и юзайте div. >> с квадратом то же самое, зачем себе придумывать проблемы, мы ведь знаем, что если setWidth >> будет изменять высоту, то у нас появятся проблемы. дак зачем нам эти проблемы? у нас возникают проблемы, потому что есть неразрешимое противоречие аксиом двух классов: прямоугольника и квадрата, других проблем не диагностируется >> вот именно. где вы видели у меня динамическое приведение. я возвращаю новый объект. а я и не говорил о динамическом приведении, я говорю о динамической смене типа. Я работаю с квадратом, а в какой-то момент получаю какой-то левый прямоугольник, если это не смена типов в момент работы программы, то я - испанский лётчик. >> вы противоречите сами себе. то для вас работающий код не интуитивный. а теперь вы >> рассказываете что вам начхать на новичков. как одно с другим связано я понять не могу.Неинтуитивный код одинаково непонятен как новичку, так и профессионалу, просто профи рано или поздно сможет в нём разобраться, а потом придти к тебе в кошмарном сне и будет портить карму ;-)) ZyK_BotaNegorychхотим сделать квадрат из прямоугольника 3х4 - "бам!" - на тебе квадрат 4х4! почему именно такой, почему не 3х3? здесь я с вами абсолютно согласен: /topic/800476&pg=4#9674234с чем согласен? это ведь ты этот метод породил, чтобы соблюсти формальное условие, наплевав на семантику обоих классов. И нечего на Чингиза пенять :)) Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.10.2010, 01:33 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=36921165&tid=1343356]: |
0ms |
get settings: |
11ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
186ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 203ms |
| total: | 463ms |

| 0 / 0 |
