powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
25 сообщений из 76, страница 3 из 4
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
    #36939310
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rstudio
очевидно руководствуясь этой логикой от квадрата по логике пронаследуешь линию, а от линии точку ?Где такое пишут, дай почитать
неверная у тебя логика.

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

так понятно?
...
Рейтинг: 0 / 0
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
    #36939316
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rstudioShSergeОт прамоугольника можно наследоваться квадрату: углы прямые. В качестве расширения добавляется ещё и свойство равенства сторон.

а ничо что тогда класс ректенгл у тебя будет абстрактным ?

вспомнилось
Дуг МакИлрой
Эти типы совсем не "абстрактные", они настолько же реальны, и int и float .
...
Рейтинг: 0 / 0
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
    #36939338
rstudio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNrstudio
очевидно руководствуясь этой логикой от квадрата по логике пронаследуешь линию, а от линии точку ?Где такое пишут, дай почитать
неверная у тебя логика.

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

так понятно?

Чтобы хранить базовый класс нужно 2х байт, чтобы хранить его наследника нужно Х байт, а чтобы хранить линию достаточно Х/2 байт. Чтобы хранить наследника линии, точку, нужны Х/4 байт.

Все сходится :)
...
Рейтинг: 0 / 0
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
    #36939344
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNSiemargltchingizнаследовать квадраты от прямоугольников это теоретически правильно. А наоборот - нет,ибо прямоугольники не входят подмножеством во множество квадратов.
Только сумашедший начнет наследовать прямоугольники от квадратов.
(равно как и рациональные от целых )
Не согласен.И Мейер об это не писал.

Наследовать прямоугольник от квадрата можно,
Наследовать рациональные от целых можно.

И то и то ослабляет инвариант.
в этом и проблема, что расслабляет, а должно быть наоборот.
Примерчик для опровержения?

Now the rule for the preconditions and postconditions for derivatives, as stated by
Meyer3, is:
"...when redefining a routine [in a derivative], you may only replace its
precondition by a weaker one, and its postcondition by a stronger one."


In other words, when using an object through its base class interface, the user knows
only the preconditions and postconditions of the base class. Thus, derived objects must not
expect such users to obey preconditions that are stronger then those required by the base
class. That is, they must accept anything that the base class could accept. Also, derived
classes must conform to all the postconditions of the base. That is, their behaviors and outputs
must not violate any of the constraints established for the base class. Users of the base
class must not be confused by the output of the derived class.
Clearly, the postcondition of Square::SetWidth(double w) is weaker than
the postcondition of Rectangle::SetWidth(double w) above, since it does not
conform to the base class clause “(itsHeight == old.itsHeight)”. Thus,
Square::SetWidth(double w) violates the contract of the base class.
...
Рейтинг: 0 / 0
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
    #36939360
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rstudioZyK_BotaNrstudio
очевидно руководствуясь этой логикой от квадрата по логике пронаследуешь линию, а от линии точку ?Где такое пишут, дай почитать
неверная у тебя логика.

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

так понятно?

Чтобы хранить базовый класс нужно 2х байт, чтобы хранить его наследника нужно Х байт, а чтобы хранить линию достаточно Х/2 байт. Чтобы хранить наследника линии, точку, нужны Х/4 байт.

Все сходится :)

нет не сходится. сколько хранится бай - не известно(инкапусаляция, одному разрабу известно как он реализовал данный тип).
главное интерфейс.
в моей реализации, для хранения квадрата были взяты те же 2х байта, что и для прямоугольника.
...
Рейтинг: 0 / 0
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
    #36939426
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
thingizВозьмем в $UReal$ значение $w$, причем $w != h$, после этого, используя
аксиому $gw\_sw$, из любого $f$, у которого ширина была задана
равной $w$, то есть, равного $SetWidth(f1, w)$ извлечем это $w$
h = GetWidth(f) = GetWidth(SetWidth(f1, w)) = w
Противоречие. Это означает, что две различные версии аксиом $gw\_sh$ не могут
выполняться вместе.
Отсюда следует, что нет никакой возможности в принципе считать $Square$ подтипом $Rectangle$.
Так же как нельзя считать $Rectangle$ подтипом $Square$.

Мне кажется, уважаемый Чингиз, что ты таки ошибаешься в двух местах:
1. Выделено красным. Из одной неверной предпосылки не следует ложность другой.
2. Не надо смешивать LSP и контракты Мейерса. Подтипы отностятся к LSP, но не к Мейерсу.

LSPWhat is wanted here is something like the following substitution property: If
for each object o1 of type S there is an object o2 of type T such that for all
programs P defined in terms of T, the behavior of P is unchanged when o1 is
substituted for o2 then S is a subtype of T.

P(T) .eq. P(S) when S.is subtype(T)

Что считать подтипом? Похоже, что производный класс всегда является подтипом.

И тогда нужно аккуратно совместить LSP, где утверждение про подтипы и - контракты, где про производные классы.
...
Рейтинг: 0 / 0
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
    #36939517
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1)
иерархия типов определяется законами логики из заданных аксиом,
то есть, дана Богом и не может быть изменена.
2)
иерархия классов определятся произволом программиста,
и может быть перекручена, чуть ли не в произвольном порядке.
3)
соответствие иерархий выполняется тогда, когда
для каждой пары подкласс - надкласс спецификация подкласса
является подтипом спецификации надкласса.
4)
проверка типов в компиляторе гарантирует работу программы
только тогда, когда иерархия типов соответствует иерархии классов.
5)
принципы дизайна по контракту создают иерархии классов
соответствующие иерархиями типов.
точка.
...
Рейтинг: 0 / 0
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
    #36939898
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglthingizВозьмем в $UReal$ значение $w$, причем $w != h$, после этого, используя
аксиому $gw\_sw$, из любого $f$, у которого ширина была задана
равной $w$, то есть, равного $SetWidth(f1, w)$ извлечем это $w$
h = GetWidth(f) = GetWidth(SetWidth(f1, w)) = w
Противоречие. Это означает, что две различные версии аксиом $gw\_sh$ не могут
выполняться вместе.
Отсюда следует, что нет никакой возможности в принципе считать $Square$ подтипом $Rectangle$.
Так же как нельзя считать $Rectangle$ подтипом $Square$.

Мне кажется, уважаемый Чингиз, что ты таки ошибаешься в двух местах:
1. Выделено красным. Из одной неверной предпосылки не следует ложность другой.

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

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

Принцип подстановки Лисков меня уже не волнует, у меня свой критерий, лучше есть.
http://www.sql.ru/forum/actualthread.aspx?tid=800476&pg=10#9707022
...
Рейтинг: 0 / 0
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
    #36939905
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizSiemarglпропущено...


Мне кажется, уважаемый Чингиз, что ты таки ошибаешься в двух местах:
1. Выделено красным. Из одной неверной предпосылки не следует ложность другой.

это не посылки, это следствия из аксиом. Из одной аксиомы строится один класс,
из другой - второй. аксиомы не совместимы и равнозначны. Классы в этом смысле
одинаковы - значение переменной одного класса не может быть присвоено в переменную
другого и наоборот.
В твоих аксиомах противоречия для наследования прямоугольника от квадрата нет.
...
Рейтинг: 0 / 0
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
    #36939914
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, для прямоугольника я могу придумать опровержение. Программа, которая умеет работать с квадратами и полагается на равенство сторон, опрокинется если получит прямоугольник.

Остается второе утверждение: Наследовать рациональные от целых можно.

Что то мне кажется, что жестко подходя к принципам - невозможно вообще ничего отнаследовать )))
...
Рейтинг: 0 / 0
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
    #36939930
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglЧто то мне кажется, что жестко подходя к принципам - невозможно вообще ничего отнаследовать )))Нашел ответ у Александреску - базовый класс должен задавать настолько мягкие ограничения, насколько возможно.
...
Рейтинг: 0 / 0
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
    #36939937
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargltchingizнаследовать квадраты от прямоугольников это теоретически правильно. А наоборот - нет,ибо прямоугольники не входят подмножеством во множество квадратов.
Только сумашедший начнет наследовать прямоугольники от квадратов.
(равно как и рациональные от целых )
Не согласен.И Мейер об это не писал.

Наследовать прямоугольник от квадрата можно,
Наследовать рациональные от целых можно.

И то и то ослабляет инвариант.
Уговорили. И вправду чушь написал -)
...
Рейтинг: 0 / 0
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
    #36941474
_мод
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tchingizКлассы в этом смысле
одинаковы - значение переменной одного класса не может быть присвоено в переменную
другого и наоборот.
Переменной надтипа можно присвоить значение подтипа. При этом переменная должна изменить свой тип на подтип (т.е. тип объекта сохраняется). Наоборот нельзя - компилятор не пропустит.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
    #37557731
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
аналогичный трехлетний окружностесрач на dxdy.ru

Эллипс и окружность: что от чего наследуется.

http://dxdy.ru/topic49360.html


Цитаты из Страуструпа и Дейта перепостил для надежности хранения
Joker_vDТак, прошу прощения. Страуструп придерживается несколько другой точки зрения:

For example, in Section 23.4.3.1 of his book The C++ Programming Language, 3rd edition (Addison-Wesley, 1997), page 703, Bjarne Stroustrup​ has this to say:

"For example, in mathematics a circle is a kind of an ellipse, but in most programs a circle should not be derived from an ellipse or an ellipse derived from a circle. The often-heard arguments “because that’s the way it is in mathematics” and “because the representation of a circle is a subset of that of an ellipse” are not conclusive and most often wrong. This is because for most programs, the key property of a circle is that it has a center and a fixed distance to its perimeter. All behavior of a circle (all operations) must maintain this property (invariant). On the other hand, an ellipse is characterized by two focal points that in many programs can be changed independently of each other. If those focal points coincide, the ellipse looks like a circle, but it is not a circle because its operations do not preserve the circle invariant. In most systems, this difference will be reflected by having a circle and an ellipse provide sets of operations that are not subsets of each other."

Он не одинок, есть полно статей, где проводится та же идея, что "окружность — не эллипс, квадрат — не прямоугольник". Например:

K. Baclawski, B. Indurkhya, “The Notion of Inheritance in Object-Oriented Programming” (CACM 37, No. 9, September 1994​)
J. Rumbaugh, “A Matter of Intent: How to Define Subclasses” (Journal of Object-Oriented Programming, September 1996)
R.C. Martin, “The Liskov Substitution Principle” (C++ Report, March 1996)


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



Joker_vD
Цитируя Дейта, "По моему мнению, любая модель наследования, в которой тип ОКРУЖНОСТЬ не является подтипом типа ЭЛЛИПС, вряд ли может считаться хорошей моделью действительности". И позже: "However, the fact remains that circles are ellipses in reality; if we choose not to regard them in that way in “our system,” then certainly the things that “our system” calls circles and ellipses differ in some rather important ways from circles and ellipses in the real world. Indeed, they simply aren’t circles and ellipses (by definition), at least as those constructs are conventionally defined and understood. [...] Note too that if “our system” includes “ellipses” that aren’t ellipses or “circles” that aren’t circles, then “our system” is likely to be seriously misunderstood, and possibly misapplied, both by our intended users and by people who might subsequently have to perform maintenance on the system. So if you really want to have a system that supports ellipse-like things that aren’t ellipses or circle-like things that aren’t circles, then I would suggest very strongly that—at the very least—you call those things something other than ellipses and circles."

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

У Дейта в "Date on Database: Writings 2000-2006" есть статья про модель наследования, так там он когда разбирает статью Лисков, все время сокрушается, что "объект" у нее означает и текущее значение переменной, и саму переменную, что так и не указаны отличия между "классом" и "типом" — или не сказано, что это синонимы, и т.п.
...
Рейтинг: 0 / 0
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
    #37557738
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут у меня единодушное мнение со Страуструпом - я тоже пытался говорить, что
класс RSquare не имеет ничего общего с квадратами из математики, поэтому аппеляция к
геометрическому смыслу бессмысленна.
Далее, Страуструп говорит о проектировании, что если надо спроектировать классы.
Я пытался решить чисто технический вопрос уже есть класс Rectangle и класс Square из статьи Мартина (и именно такие как у Мартина и никакие другие) и для них написано пять триллионов шесть миллиардов пятсот тридцать одна программа.
Что будет если наследовать один из другого?
Наследовать можно, но поскольку один из классов не является подтипом другого,
теряется проверка типов. Вместо переменной родителя можно подставить переменную ребенка - компилятор пропустит, а на шаге выполнения задача сбойнет.
--

заодно определения


типизация - это свойство-средства языка, гарантирующее успешное вычисление корректного выражения.

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

Таким образом получаем, что с++ не вполне полиморфен.
...
Рейтинг: 0 / 0
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
    #37557740
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
после квадратов и прямоугольников, над окружностями и эллипсами я раздумывал,
но решил что натуральные, целые и рациональные - более лучшие примеры.
К ним не может быть претензий по поводу плохого проектирования.
...
Рейтинг: 0 / 0
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
    #37557781
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а че тут думать?
для неизменяемых объектов, квадрат можно использовать вместо прямоугольника - ковариантность.
для изменяемых объектов так делать нельзя - инвариантность.
...
Рейтинг: 0 / 0
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
    #37559355
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingiz
заодно определения


типизация - это свойство-средства языка, гарантирующее успешное вычисление корректного выражения.

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

Таким образом получаем, что с++ не вполне полиморфен.

последнее улучшение. ))

полиморфизм это свойство-средство языка позволяющее записывать корректные выражения для более чем одного типа (множества типов мощности больше один)
дословный перевод из Милнера - возможность трактовать некоторые термы, как принадлежащие многим различным типам.
...
Рейтинг: 0 / 0
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
    #37559356
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
из работы
...
Рейтинг: 0 / 0
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
    #37559359
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
отдельное спасибо Максиму Талдыкину
...
Рейтинг: 0 / 0
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
    #37559364
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingiz,

да, но полиморфизм - полиморфизму рознь.

мы ведь про ad-hoc полиморфизм говорим?
...
Рейтинг: 0 / 0
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
    #37559371
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
когда я говорю специальный, я так и пишу специальный полиморфизм.
...
Рейтинг: 0 / 0
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
    #37559375
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
частные случаи полиморфизма должны удовлетворять определению общего случая.
Как и частные случаи любого понятия должны удовлетворять определению общего случая того же понятия.
Например, квадрат частный случай прямоугольника, и квадрат удовлетворяет определению прямоугольника.
...
Рейтинг: 0 / 0
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
    #37699566
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот на счет контрактов часто жалуются. а что толку от контрактов, если они не проверяются на практике.
дак вот, встретил на рсдн хороший пост:
http://rsdn.ru/forum/decl/4522924.flat.aspx

там правда примеры сложноватые для нехаскелистов, поэтому как будет время(на днях), напишу пару игрушечных примера. что бы без разных монадныых трансформеров

суть топика такова. параметризируем монаду двумя типами: пост- и пред- условиями.
что получаем на практике - проверку контракта в момент компиляции.

пример(игрушечную модель которого я напишу сегодня или завтра): есть у нас файл. в него можно писать, только если он открыт для записи. закрывать только если он открыт. и если он закрыт, то писать в него нельзя.

что нам предлагают современные языки(а вернее их библиотеки). если мы попытаемся писать в закрытый файл, то получим исключение в рантайме.
но параметризированные монады позволяют отловить данную ошибку - в момент компиляции.
...
Рейтинг: 0 / 0
25 сообщений из 76, страница 3 из 4
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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