|
|
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
Обсуждение технологии. Зачем она нужна в практических применениях. Описание тут http://ru.wikipedia.org/wiki/Контрактное_программирование Мое мнение - обязательна для больших проектов, разделения проекта на библиотечную часть и код верхнего уровня. Альтернативное мнение. Гаджимурадов РустамP.S. Для несведущих - это всего лишь очередной лозунг. Маркетинга там в разы больше, чем пользы. А в тех случаях, когда это действительно нужно, оно, в общем-то, применялось задолго до появления самого лозунга. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2010, 23:31 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
Ну, Рустам мастер сам лозунгами бросаться. В дизайне по контракту совершенно на теоретико множественных пальцах (то есть понятно) рассказывают, почему в примере Роберта Мартина с квадратами и прямоугольниками нельзя делать наследование. Потому, что сужается область определения функций SetWidth. Нарушается простое формальное правило. А другие авторы, включая Роберта Мартина, нагоняют мистический ооп туман. ///topic/756625&pg=5#9543547 // http://www.sql.ru/forum/actualthread.aspx?tid=756625&pg=5#9590420 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.10.2010, 23:50 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
tchingizВ дизайне по контракту совершенно на теоретико множественных пальцах (то есть понятно) рассказывают, почему в примере Роберта Мартина с квадратами и прямоугольниками нельзя делать наследование. Равенство сторон - это инвариант, который усилен в подтипе. Так что все правильно - квадрат подтип прямоугольника. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 11:51 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
_модtchingizВ дизайне по контракту совершенно на теоретико множественных пальцах (то есть понятно) рассказывают, почему в примере Роберта Мартина с квадратами и прямоугольниками нельзя делать наследование. Равенство сторон - это инвариант, который усилен в подтипе. Так что все правильно - квадрат подтип прямоугольника.так же как и подтип ромба. Так чего же выбрать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 12:05 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
egorychтак же как и подтип ромба. Так чего же выбрать? А не надо ничго выбирать. Просто методы ромба можно попытаться применить к квадрату. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 12:56 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
_модegorychтак же как и подтип ромба. Так чего же выбрать? А не надо ничго выбирать. Просто методы ромба можно попытаться применить к квадрату. а нафига все эти нагромаждения? нет никаких методов ни у ромба ни у квадрата ни какого то угольника ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 13:01 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
egorych_модtchingizВ дизайне по контракту совершенно на теоретико множественных пальцах (то есть понятно) рассказывают, почему в примере Роберта Мартина с квадратами и прямоугольниками нельзя делать наследование. Равенство сторон - это инвариант, который усилен в подтипе. Так что все правильно - квадрат подтип прямоугольника.так же как и подтип ромба. Так чего же выбрать? множественное наследование ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 13:40 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNмножественное наследованиеэто чтобы запутаться окончательно :-)) и ещё, до кучи, виртуально отнаследоваться от класса "четырёхугольники" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 14:06 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ViPRosнет никаких методов ни у ромба ни у квадрата ни какого то угольника Это верно. Есть процедуры/функции, у которых параметры имеют заданный тип (например прямоугольник). Их можно применять к подтипам (к квадратам), но с учетом инвариантов подтипа (равенство сторон). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 14:15 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
egorychZyK_BotaNмножественное наследованиеэто чтобы запутаться окончательно :-)) и ещё, до кучи, виртуально отнаследоваться от класса "четырёхугольники" уже неявно это сделали. от читырех угольников и равносторонних фигур отнаследовали ромб. от равноугольного многоугольника и четырехугольника отнаследовали прямоугольник. от от ромба и прямоугольника отнаследовали квадрат. чтобы избежать проблем, например у четырех угольника можно менять стороны независимо, а у квадрата стороны равные, объекты нужно сделать иммутабельными. также при вызове конструктора Rectangle(w = 5, h = 5), будет создан прямоугольник, а не квадрат, аналогично тому что 1.0 - double, а не int. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 14:16 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
_модViPRosнет никаких методов ни у ромба ни у квадрата ни какого то угольника Это верно. Есть процедуры/функции, у которых параметры имеют заданный тип (например прямоугольник). Их можно применять к подтипам (к квадратам), но с учетом инвариантов подтипа (равенство сторон). если ввести понятия иммутабельности, то метод работающий с прямоугольником, не обязан знать о существовании типа квадрат, все по аналогии с примитивными типами double и int. если в ф-ю корня передать целое число, то она вернет значиние типа double. так и тут, если метод возвращает модифицированную фигуру(например увеличивает ширину в 2 раза), то никаких проблем не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 14:21 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNметод работающий с прямоугольником, не обязан знать о существовании типа квадрат конечно, не обязан ZyK_BotaNесли в ф-ю корня передать целое число, то она вернет значиние типа double. так и тут, если метод возвращает модифицированную фигуру(например увеличивает ширину в 2 раза), то никаких проблем не будет. Со значениями функций проблем нет - они возвращают заданный для них тип. Проблемы есть при передаче параметром подтипа вместо заданного типа - может сработать инвариант подтипа и процедура выдаст ошибку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 15:00 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaN, Иммутабельность тут ни при чем. Начали с проверки инвариантов объекта. Инварианты могут разными, в зависимости от задачи: -вариант 1. Все стороны равны. -вариант 2. Все углы прямые -вариант 3. Сторон не больше 4х. Структура инвариантов должна идти строго параллельно со структурой наследования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 15:04 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
_модПроблемы есть при передаче параметром подтипа вместо заданного типа - может сработать инвариант подтипа и процедура выдаст ошибку. я уже выше написал - решение неизменяемость объектов. или я я заблуждаюсь? укажи мне пример, где будет ошибка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 15:06 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
_модСо значениями функций проблем нет - они возвращают заданный для них тип. Проблемы есть при передаче параметром подтипа вместо заданного типа - может сработать инвариант подтипа и процедура выдаст ошибку. 1. Это на уровне языка должно быть определено (забыл термин), что допускается возвращать наследников. 2. Если даже возвращается родительский тип, будет проверен инвариант этого типа. И ошибки не будет. Если наследуются типы с инвариантами, проверяются все инварианты всех родителей. По очереди. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 15:07 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
SiemarglZyK_BotaN, Иммутабельность тут ни при чем. Начали с проверки инвариантов объекта. Инварианты могут разными, в зависимости от задачи: -вариант 1. Все стороны равны. -вариант 2. Все углы прямые -вариант 3. Сторон не больше 4х. Структура инвариантов должна идти строго параллельно со структурой наследования. ну у квадрата все стороны равны, какому из инвариантов прямоугольника это противоречит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 15:07 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaN, Если наследник - прямоугольник, то подходят 2 и 3. Если наследник ромб - то 1 и 3. А кто будет наследником у прямоугольника или ромба??? Тогда может и будет окончательный выбор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 15:18 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
SiemarglZyK_BotaN, Если наследник - прямоугольник, то подходят 2 и 3. Если наследник ромб - то 1 и 3. чей наследник? Siemargl А кто будет наследником у прямоугольника или ромба??? например квадрат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 15:21 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaN, Я пример приводил, если квадрат - родитель. Ну я думаю, что идею пояснил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 15:43 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNя уже выше написал - решение неизменяемость объектов. Это да. Только это уже чисто функциональное программирование. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 16:01 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
SiemarglZyK_BotaN, Я пример приводил, если квадрат - родитель. Ну я думаю, что идею пояснил. а, тогда все ок. квадрат ведь не родитель, а дочерний класс классов ромб и прямоугольник. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 16:06 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
SiemarglИнварианты могут разными, в зависимости от задачи: -вариант 1. Все стороны равны. -вариант 2. Все углы прямые -вариант 3. Сторон не больше 4х.-вариант 4. Величины длины и ширины могут меняться независимо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 16:26 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
egorychSiemarglИнварианты могут разными, в зависимости от задачи: -вариант 1. Все стороны равны. -вариант 2. Все углы прямые -вариант 3. Сторон не больше 4х.-вариант 4. Величины длины и ширины могут меняться независимо Где тут инвариант = условие для проверки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 16:31 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
SiemarglГде тут инвариант = условие для проверки?ну да, не инвариант, но постусловие для соответстующего сеттера -Изменение ширины не влияет на значение длины -Изменение длины не влияет на значение ширины их мы тоже в DbC надо проверять, кмк? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 16:39 |
|
||
|
Выгоды контрактного программирования (design by contract)
|
|||
|---|---|---|---|
|
#18+
egorych, Да. Но это чуть другое из DbC. -Изменение ширины не влияет на значение длины - это отсутствие побочных эффектов. А инвариант - это корректность объекта в целом. Т.е. например, инвариантом может допускаться side effect, если после вызова объет остался верен инварианту, например квадратом (пусть и увеличенным вдвое). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2010, 16:45 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=36917750&tid=1343356]: |
0ms |
get settings: |
8ms |
get forum list: |
24ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
178ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
| others: | 201ms |
| total: | 500ms |

| 0 / 0 |
