powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Выгоды контрактного программирования (design by contract)
25 сообщений из 232, страница 6 из 10
Выгоды контрактного программирования (design by contract)
    #36921730
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychZyK_BotaN:
>> ну и используйте в случае квадрата setSide,
допустим, у меня есть легаси-код, работающий с прямоугольниками и, раз квадрат - наследник его, то я хочу, чтобы он работал с квадратами. Корректно работал. Обычно у меня это получается, если иерархия наследования составлена верно. и не получается, когда приходится помнить "здесь читать, здесь не читать, здесь рыбу заворачивать".
>> а в случае int-а div.
сами вы используйте свой div, мне инта вполне достаточно. Если в паскале нужен дополнительный "совсем целочисленный" тип, то это его проблема. У меня в С++ всё работает, как надо.


старый код будет работать с квадратом врено. я гарантирую это.

div - это не тип, а операция целочисленного деления.


egorych
>> вот именно. где вы видели у меня динамическое приведение. я возвращаю новый объект.
а я и не говорил о динамическом приведении, я говорю о динамической смене типа. Я работаю с квадратом, а в какой-то момент получаю какой-то левый прямоугольник, если это не смена типов в момент работы программы, то я - испанский лётчик.

вы таки испанский летчик? что-бы доказать обратное процитируйте код, где квадрат превращается в прямоугольник.

egorych
согласен? это ведь ты этот метод породил, чтобы соблюсти формальное условие,

нет. я не видел такого формального условия в описании принципа подстановки Лисков.

egorych

Код: plaintext
1.
2.
3.
4.
5.
6.
Square( const Rectangle &parent )
{
   if( parent.getWidth() != parent.getHeight() )
      throw exception( "I can't construct Square from this Rectangle. sorry!" );

   _width = _height = parent.getWidth();
}
тоже не идеал
этот код, не только не идиал, но в отличии от моего порождает ошибку и не соответствует принципу подстановки Лисков.
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921733
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNты часто пользуешься такими объектами как : int, double, string?
ихнее поведение не отличается от моего.у меня этих стрингов, как собак не резанных, в плюсах-то и у каждого - своё поведение А в сях так вообще строки нет, как таковой.
и int и double не порождают других типов при операциях с подобными себе, и это сильно отличается от представленного тобой

ЗЫ каламбур получился, кстати ))
ЗЫЫ за хаскель комментировать не буду, может оно там действительно надо
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921734
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNпроцитируйте код, где квадрат превращается в прямоугольник.

если быть точнее, где он перестает быть квадратом.
ведь прямоугольником он является всегда.
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921738
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych
и int и double не порождают других типов при операциях с подобными себе, и это сильно отличается от представленного тобой

ЗЫ каламбур получился, кстати ))
ЗЫЫ за хаскель комментировать не буду, может оно там действительно надо
ты наверное про си, а в паскале и в делфе, операция еделения определена надо вещественными типами.

как неявное преобразования int к double объяснить. наверное int все же должен быть подтипом double.

в хаскле оно нужно не более чем в си. просто хаскель более продуманный язык, и система типов там помощнее будет.

int, double и string я упомянул, что-бы оправдать иммутабельность.
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921741
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNстарый код будет работать с квадратом верно. я гарантирую это.зря подписался. Возвращаемся к примеру: Есть функция, обрабатывающая прямоугольники
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
вписать один прямоугольник в другой
параметры: base - прямоугольник, в который вписывают,
           changed - прямоугольник, который вписываем
возвращаемое значение: returned вписанный прямоугольник

 1 . если у changed ширина больше, чем у base - ширина returned = ширине base
 2 . если у changed высота больше, чем у base - высота returned = высоте base
 3 . возврат returned
вполне себе бессмысленная функция. Теперь я туда подаю следующие пары:
- base - Rectangle( 10, 2 ), changed = Square( 5 ) и получу правильный ответ
- base = Rectangle( 2, 10 ), changed = Square( 5 ) - неправильный.
кроме того, я получу хороший оверхед на том, что постоянно буду конструировать объекты вместо того, чтобы их изменять, но это вопрос уже из другой песни, оставим его пока
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921743
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNZyK_BotaNпроцитируйте код, где квадрат превращается в прямоугольник.

если быть точнее, где он перестает быть квадратом.
ведь прямоугольником он является всегда.да вот же:
Код: plaintext
1.
Square s = new Square(  5  );
Square except = s.SetWidth(  3  );// всё, это уже не квадрат

>> как неявное преобразования int к double объяснить. наверное int все же должен быть подтипом double.
1. никакого преобразования не происходит, если я выполняю операции в рамках одного типа.
2. как неявное преобразование double к int объяснить, наверное double всё же должен быть подтипом int ( самому не смешно? мне - смешно, например ))) )
3. эти неявные преобразования никакого отношения к наследованию не имеют

>> int, double и string я упомянул, что-бы оправдать иммутабельность.
тебе пришлось ввести иммутабельность, чтобы хоть как-то организовать наследование квадрата от прямоугольника, с изменяемыми объектами у тебя не выйдет ничего из этой затеи. Больше она низачем в данном случае, по крайней мере, не нужна. Это - факт! ))
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921744
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 f(Rectangle base, Rectangle changed) {
		return Rectangle((changed.getWidth()>base.getWidth()?base.getWidth():changed.getWidth()),
			(changed.getHeight()>base.getHeight()?base.getHeight():changed.getHeight()));
	}

int _tmain(int argc, _TCHAR* argv[])
{
	Rectangle r1 = f(Rectangle( 10 ,  2 ), Square( 5 ));
	Rectangle r2 = f(Rectangle( 2 ,  10 ), Square( 5 ));
	showRectangle(r1); 
	showRectangle(r2);
	return  0 ;
}

результат:
Rectangle(5,2);
Rectangle(2,5);
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921745
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNэтот код, не только не идиал, но в отличии от моего порождает ошибку и не соответствует принципу подстановки Лисков.зато он хотя бы пытается хоть как-то проверить соответствие входящих параметров контракту класса, а не лепит непойми что из непойми чего по дефолту.
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921746
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychZyK_BotaNZyK_BotaNпроцитируйте код, где квадрат превращается в прямоугольник.

если быть точнее, где он перестает быть квадратом.
ведь прямоугольником он является всегда.да вот же:
Код: plaintext
1.
Square s = new Square(  5  );
Square except = s.SetWidth(  3  );// всё, это уже не квадрат

это мой код?
он не скомпилится.

поясняю в очередной раз.
зедесь нет подмены квадрата прямоукольником.
мы берем метод setWidth, который возвращает прямоугольник основанный на объекте для которого его вызывают.

нет здесь динамической подмены квадрата прямоугольником, а вернее квадрат остался квадратом.
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921747
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychZyK_BotaNэтот код, не только не идиал, но в отличии от моего порождает ошибку и не соответствует принципу подстановки Лисков.зато он хотя бы пытается хоть как-то проверить соответствие входящих параметров контракту класса, а не лепит непойми что из непойми чего по дефолту.
укажи мне, какой контракт мой код нарушает.
я привел реализацию ф-и в которой ты ожидал ошибку. где эта ошибка?
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921748
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNрезультат:
Rectangle(5,2);
Rectangle(2,5);ога, блестяще. Теперь приведи 2й результат к квадрату и во втором случае ты получишь квадрат 5*5 и скажи мне, можно вписать квадрат 5*5 в прямоугольник 2*10?
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921750
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych
кроме того, я получу хороший оверхед на том, что постоянно буду конструировать объекты вместо того, чтобы их изменять, но это вопрос уже из другой песни, оставим его пока

на счет оферхеда, во сколько раз размер прямоугольника превосходит тип double? я думаю раза в 2. и что это за липовый оверхед?
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921751
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychZyK_BotaNрезультат:
Rectangle(5,2);
Rectangle(2,5);ога, блестяще. Теперь приведи 2й результат к квадрату и во втором случае ты получишь квадрат 5*5 и скажи мне, можно вписать квадрат 5*5 в прямоугольник 2*10?

опять приведи к квадрату.
ты забыл о чем мы говорили?
мы говорили о старом коде который не знает о квадрате, и будет работать корректно.
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921752
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNtchingizegorychна основании какой из аксиом квадрата, прямоугольника, или, не дай бог, ромба, следует, что квадрат конструируется из высоты прямоугольника?
а че не из площади или диагонали?
))
кста, если добавить аксиому к тем четырем, то это будет новый тип Square,
а не тот, с которого все началось.
не из площади ли диагонали потому, что это метод заказал ты, явно указал что нужно инорить ширину:
.
во первых, когда?
я про точное преобразование переживаю
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921754
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921755
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNмы берем метод setWidth, который возвращает прямоугольник основанный на объекте для которого его вызывают.назови его makeRectangle() и вопросы уйдут. Если я работаю с только с квадратами, на кой хрен мне сдался прямоугольник??? и да, я понимаю, что код не скомпилится, и я буду долго ломать голову, почему, потом, наконец, залезу с исходник твоего класса, если он у меня есть, или напишу тучу unit-тестов, чтобы выяснить, как работает твой класс. В конце концов я его выкину из проекта, как никуда не годный, и напишу свой квадрат, который всегда будет квадратом, и всем потом расскажу, какой плохой ты мне подсунул класс квадрата ;-))
но зато твой класс выполняет принцип подстановки Лисков, это единственная положительная в нём черта, правда практическая ценность которой, мне, к примеру, совершенно не очевидна.
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921756
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingiz
я про точное преобразование переживаю
1)я же процитировал тебя.
2) для неизменяемых объектов это не требуется.
тот пример Милнера(или как его там) - доказал не состоятельность подхода при работе с изменяемыми объектами.
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921757
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychZyK_BotaNмы берем метод setWidth, который возвращает прямоугольник основанный на объекте для которого его вызывают.назови его makeRectangle() и вопросы уйдут. Если я работаю с только с квадратами, на кой хрен мне сдался прямоугольник???
не надо прямоугольник? - юзай setWidth, но не надо забывать что квадрат является прямоугольником, и ты не можешь работать с квадратом не работая с прямоугольником, а на оборот можешь, в этом и разница между супертипом и подтипом.

если ты не хочешь работать с прямоугольником - не наследуй от него квадрат.
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921759
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNegorychZyK_BotaNрезультат:
Rectangle(5,2);
Rectangle(2,5);ога, блестяще. Теперь приведи 2й результат к квадрату и во втором случае ты получишь квадрат 5*5 и скажи мне, можно вписать квадрат 5*5 в прямоугольник 2*10?

опять приведи к квадрату.
ты забыл о чем мы говорили?
мы говорили о старом коде который не знает о квадрате, и будет работать корректно.и я об этом же. У меня есть квадрат и прямоугольник, мне нужно вписать в прямоугольник этот квадрат. И у меня есть функция, написанная для прямоугольников, логично ей воспользоваться, ты мне скажи? по мне, так логично. Берём, используем, всё компилируется, всё работает, и почти всегда корректно, за исключением некоторых данных, на которых результат получается неверным. Желаю приятных ночей в отладке такого бага )))
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921760
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych
но зато твой класс выполняет принцип подстановки Лисков, это единственная положительная в нём черта, правда практическая ценность которой, мне, к примеру, совершенно не очевидна.
тема началась с контрактов и подстановки Лисков.
я реализовал квадрат и прямоугольник, а вам не понравилось что он работает корректно.
вы все время хотите нарушить контракт.
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921762
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNесли ты не хочешь работать с прямоугольником - не наследуй от него квадрат.Ес! Я тебе об том и говорю, что нельзя наследовать квадрат от прямоугольника, потому что это разные фигуры, с некоторыми похожими свойствами, не более того.
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921763
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
>> как неявное преобразования int к double объяснить. наверное int все же должен быть подтипом double.
1. никакого преобразования не происходит, если я выполняю операции в рамках одного типа.
2. как неявное преобразование double к int объяснить, наверное double всё же должен быть подтипом int ( самому не смешно? мне - смешно, например ))) )

смешного, кстати, ничего нет.

подкласс появляется когда в класс добавляют методы (функции)
к группе целых по сложению добавили операцию умножения и деления и получили поле рациональных. В подклассе увеличился домен класса.
и рациональные таки могут трактоваться как подкласс целых.
А целые могут трактоваться как подкласс натуральных.
К полугруппе натуральных по умножению добавили операция взятия обратного и получили группу
целых.

Более, того любой нормальное наследование которые вы делаете проходит по схеме увеличения домена класса.
Доменом класса было декартово произведение длиной n, наследовали класс с добавлением одного поля. Получили домен класса из декартового произведения длинной n+1
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921764
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNegorych
но зато твой класс выполняет принцип подстановки Лисков, это единственная положительная в нём черта, правда практическая ценность которой, мне, к примеру, совершенно не очевидна.
тема началась с контрактов и подстановки Лисков.
я реализовал квадрат и прямоугольник, а вам не понравилось что он работает корректно.
вы все время хотите нарушить контракт.предыдущий абзац остался не прочитанным, штоле?
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921765
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychZyK_BotaNegorychZyK_BotaNрезультат:
Rectangle(5,2);
Rectangle(2,5);ога, блестяще. Теперь приведи 2й результат к квадрату и во втором случае ты получишь квадрат 5*5 и скажи мне, можно вписать квадрат 5*5 в прямоугольник 2*10?

опять приведи к квадрату.
ты забыл о чем мы говорили?
мы говорили о старом коде который не знает о квадрате, и будет работать корректно.и я об этом же. У меня есть квадрат и прямоугольник, мне нужно вписать в прямоугольник этот квадрат. И у меня есть функция, написанная для прямоугольников, логично ей воспользоваться, ты мне скажи? по мне, так логично.

нет не логично.
у меня есть ф-я sin, я подставляю целое, а получаю в результате дробь.
здесь то же самое. пользуйся ф-й на здоровье, но она возвращает не квадрат а прямоугольник.
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921767
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychназови его makeRectangle() и вопросы уйдут. Если я работаю с только с квадратами, на кой хрен мне сдался прямоугольник??? и да, я понимаю, что код не скомпилится, и я буду долго ломать голову, почему, потом, наконец, залезу с исходник твоего класса, если он у меня есть, или напишу тучу unit-тестов, чтобы выяснить, как работает твой класс.

что-бы выяснить как работает мой класс нужно миниммум усилий. нет ни виртуальных ф-й, ни исключительных ситуаций.
На месте прямоугольника, квадрат работает точь-в-точь как прямоугольник. - это главный принцип. принцип подстановки Лисков.
а то что ты предложил ему противоречит.
...
Рейтинг: 0 / 0
25 сообщений из 232, страница 6 из 10
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Выгоды контрактного программирования (design by contract)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]