powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Выгоды контрактного программирования (design by contract)
25 сообщений из 232, страница 5 из 10
Выгоды контрактного программирования (design by contract)
    #36920769
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglZyK_BotaN
вывод : 33.
что я делаю не так?
Ты код то покажи. Полный, где getSpace() описан.да не, площади-то у прямоугольника и квадрата вычисляются одинаково ( width*height ), этот пример будет работать корректно, все косяки связаны с размерами.
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921145
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
class Rhomb {
	double a, side;
public:
	double getSpace() {
		return sin(a)*side*side;
	}
};

class Rectangle {
	double w,h;
public:
	
	double getSpace() {
		return w*h;
	}
};
class Square: public Rectangle, public Rhomb {
public:	
	
	
};
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921162
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychZyK_BotaNegorych[quot Siemargl]ZyK_BotaN,

Хотим изменить сторону у квадрата, воспользовавшись функцией базового класса - "бам!" - на тебе произвольный прямоугольникгде?
у базового класса(Rectangle) нет ф-и изменения стороны, есть только изменение ширины или высоты.0. про ромб пока забудем опять, говорим за прямоугольник.


- изменяя ширину ( или высоту ) я надеюсь получить квадрат ( принцип наименьшего удивления )

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


egorych
, пусть приведённый к типу родителя ( требование языка ).
Но! либо я получаю прямоугольник и по типу, и по содержанию, что противоречит аксиоме
квадрата.
какой аксиоме?

egorych
Или я получаю квадрат ( переопределив сеттеры в наследнике ) и нарушаю аксиомы прямоугольника. Но противоречий ты технично не замечаешь.

не делай так.
egorych
2. по остальным пунктам обвинения сказать определённо нечего, ась? ;-))
я не понимаю, почему изменяя только ширину квадрата, Вы хотите получить квадрат.
меня бы такое поведение удивило бы.

подтверждением моей точки зрения является вечная ошибка новичков, которые не знают что 2/3 = 0.

а в паскале все ок. 1/2 = 0.5 и я с господином Виртом согласен.
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921165
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychSiemarglZyK_BotaN
вывод : 33.
что я делаю не так?
Ты код то покажи. Полный, где getSpace() описан.да не, площади-то у прямоугольника и квадрата вычисляются одинаково ( width*height ), этот пример будет работать корректно, все косяки связаны с размерами.

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

Ты чего то опять забыл. У тебя в Square неоднозначность вызова getSpace().
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921263
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglZyK_BotaN,

Ты чего то опять забыл. У тебя в Square неоднозначность вызова getSpace().

все ок, неоднозначность решается клиентом,
Код: plaintext
Square( 3 ).Rectangle::getSpace()
но можно и исправить
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
class Square: public Rectangle, public Rhomb {
public:	
	
	double getSpace() {
		return Rectangle::getSpace();
	}
	
};

но это уже не обязательно. явное указание родителя, которому принадлежит метод - нормальная практика.

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

Ты чего то опять забыл. У тебя в Square неоднозначность вызова getSpace().

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

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?на основании какой из аксиом квадрата, прямоугольника, или, не дай бог, ромба, следует, что квадрат конструируется из высоты прямоугольника?
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921414
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_модtchingiz оказалось невозможное корректное выполнение цепочка
а) преобразование из ребенка в родителя
б) выполнение метода
в) восстановление ребенка взад.

А зачем делать а), если можно сразу сделать б) и не делать с)
Другое дело, что выполнение б) может нарушить инвариант ребенка и вызовет ошибку, так это нормальное поведение, так и д.б. Похоже, проблемы то и нет.
а нужно сделать, чтобы передать ребенка в ранее написанные программы
для родителя
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921420
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaN,
что ты делаешь с цитатами вечно?
задолбался править тебя.
сложи в зип весь код и прилепи сюда, а то не возможно бегать по постам
.
а нельзя его упростить, кстати. Хватит одного наследования для иллюстрации замечательной
мысли про неизменяемые объекты.
Лучше квадрат и прямоугольник оставить - меньше работать придется
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921422
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizа нельзя его упростить, кстати. Хватит одного наследования для иллюстрации замечательной мысли про неизменяемые объекты.
Лучше квадрат и прямоугольник оставить - меньше работать придется+1
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921428
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_модtchingizПотом ты пишешь ребенка, херишь аксиомы родителя, и подсовываешь тем
программам, которые написаны в предположении похереных аксиом
ребенка под видом родителя.
В результате клиент умирает от удивления. Нарушен принцип подстановки Лисков.

аксиомы родителя полностью сохраняются, только дополняются аксиомами ребенка.
попытки применить методы родителя к ребенку никакого удивления вызывать не должны - ошибки ожидаемы и запрограммированы.
если при наследовании происходит уменьшение домена типа
например, как от вещественных к целым, или от целых к натуральным,
а меньшее множество обладает свойством идеала относительно операции,
скажем f : X >< X -> X, (где X домен родителя.
а Y домен ребенка, Y входит в X)
то есть, для любого x из X и y из Y f (y, x) попадает в Y,
то можно вызывать методы родителя сколько угодно.
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921439
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_модtchingiz(класс это пара (множество_допустимых_значений, множество_функций),
множество_допустимых_значений - это тип данных, а вот множество_функций - очень расплывчато. Я могу написать очень много функций, использующих этот тип данных в качестве парметров или значений, не включая их в класс. И что это будет ? Итак мы плавно возвращаемся к модульности в терминах АДы.
я с твоего позволения буду называть множество_допустимых_значений
доменом типа, ибо тип - это спецификация класса, то есть, набор аксиом.

пиши функции, не включая в класс. Это будут функции не включенные в класс.
В классе вещественных есть сложение, умножение, деление, отнимание.
а извлечения корня может не быть, экспоненты может не быть, синуса и косинуса.

Среди множества всех написанных функций, желательно выделить
подмножество таких, которые нельзя написать через другие, и их то и вносить
в класс. Судьба остальных зависит от произвола проектировщика
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921448
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychна основании какой из аксиом квадрата, прямоугольника, или, не дай бог, ромба, следует, что квадрат конструируется из высоты прямоугольника?
а че не из площади или диагонали?
))
кста, если добавить аксиому к тем четырем, то это будет новый тип Square,
а не тот, с которого все началось.
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921551
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNSiemarglZyK_BotaN,

Ты чего то опять забыл. У тебя в Square неоднозначность вызова getSpace().

все ок, неоднозначность решается клиентом,
Код: plaintext
Square( 3 ).Rectangle::getSpace()
но можно и исправить
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
class Square: public Rectangle, public Rhomb {
public:	
	
	double getSpace() {
		return Rectangle::getSpace();
	}
	
};

но это уже не обязательно. явное указание родителя, которому принадлежит метод - нормальная практика.

например ее используют в языке F#.
Знаешь, такой стиль программирования побуждает меня тебя придушить.

Но это наверное, уже оффтоп, не относящийся к правильному и тем более контрактному програмировнию ))))
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921686
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921691
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychZyK_BotaNметоды работающие с прямоугольником могут работать и с квадратом, возвращая абсолютно идентичный результат(принцип Лисков).это не правда, точнее, не вся правда. Правдой будет написать, что "методы, работающие с прямоугольником, будут скомпилированы и с квадратом, возвращая абсолютно непредсказуемый вариант". В пояснение простой пример: есть функция, которая вписывает произвольный прямоугольник в заданный и возвращает полученный прямоугольник. Я хочу ей воспользоваться, чтобы в заданный прямоугольник вписать квадрат, а потом дальше использовать его, как квадрат. Для пары Rectangle( 10, 2 ) + Square( 5 ) я получу правильный ответ, для пары Rectangle( 2, 10 ) + Square( 5 ) - неправильный.

можете метод хотябы на псевдокоде написать? а то я суть не понял.

egorych
а потом дальше использовать его, как квадрат.

в этом ваша проблема.
вы хотите использовать результат ф-и работающей с прямоугольником в качестве квадрата.

вас не смущает что sin(1) - не целое? здесь аналогично.
вы понимаете что такое подтип? и что объект типа, не всегда можно без потери точности привести к подтипу?
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921694
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychtchingizа нельзя его упростить, кстати. Хватит одного наследования для иллюстрации замечательной мысли про неизменяемые объекты.
Лучше квадрат и прямоугольник оставить - меньше работать придется+1
что +1? а кто мне про ромб напомнил?
хорошо, ромб удалю.
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921697
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl

Знаешь, такой стиль программирования побуждает меня тебя придушить.

Но это наверное, уже оффтоп, не относящийся к правильному и тем более контрактному програмировнию ))))

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

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

tchingiz
Так и у Мартина нет проблемы. Скопировал квадрат в прямоугольник, изменил его ширину и все.

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

ты часто пользуешься такими объектами как : int, double, string?
ихнее поведение не отличается от моего.

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

я здесь имел ввиду иммутабельность и отсутствие виртуальных методов.
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36921725
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaN:
>> ну и используйте в случае квадрата setSide,
допустим, у меня есть легаси-код, работающий с прямоугольниками и, раз квадрат - наследник его, то я хочу, чтобы он работал с квадратами. Корректно работал. Обычно у меня это получается, если иерархия наследования составлена верно. и не получается, когда приходится помнить "здесь читать, здесь не читать, здесь рыбу заворачивать".
>> а в случае int-а div.
сами вы используйте свой div, мне инта вполне достаточно. Если в паскале нужен дополнительный "совсем целочисленный" тип, то это его проблема. У меня в С++ всё работает, как надо.

>> вот именно что "целочисленное деление", а не обычное. вот и юзайте div.
>> с квадратом то же самое, зачем себе придумывать проблемы, мы ведь знаем, что если setWidth
>> будет изменять высоту, то у нас появятся проблемы. дак зачем нам эти проблемы?
у нас возникают проблемы, потому что есть неразрешимое противоречие аксиом двух классов: прямоугольника и квадрата, других проблем не диагностируется


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

>> вы противоречите сами себе. то для вас работающий код не интуитивный. а теперь вы
>> рассказываете что вам начхать на новичков.
как одно с другим связано я понять не могу.Неинтуитивный код одинаково непонятен как новичку, так и профессионалу, просто профи рано или поздно сможет в нём разобраться, а потом придти к тебе в кошмарном сне и будет портить карму ;-))

ZyK_BotaNegorychхотим сделать квадрат из прямоугольника 3х4 - "бам!" - на тебе квадрат 4х4! почему именно такой, почему не 3х3?
здесь я с вами абсолютно согласен:
/topic/800476&pg=4#9674234с чем согласен? это ведь ты этот метод породил, чтобы соблюсти формальное условие, наплевав на семантику обоих классов. И нечего на Чингиза пенять :))
Код: plaintext
Square( const Rectangle &parent )\n{\n   if( parent.getWidth() != parent.getHeight() )\n      throw exception( "I can\'t construct Square from this Rectangle. sorry!" );\n\n   _width = _height = parent.getWidth();\n}
тоже не идеал
...
Рейтинг: 0 / 0
25 сообщений из 232, страница 5 из 10
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Выгоды контрактного программирования (design by contract)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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