|
|
|
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
|
|||
|---|---|---|---|
|
#18+
rstudio очевидно руководствуясь этой логикой от квадрата по логике пронаследуешь линию, а от линии точку ?Где такое пишут, дай почитать неверная у тебя логика. линия не является квадратом. квадрат является прямоугольником. так понятно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2010, 15:30 |
|
||
|
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
|
|||
|---|---|---|---|
|
#18+
rstudioShSergeОт прамоугольника можно наследоваться квадрату: углы прямые. В качестве расширения добавляется ещё и свойство равенства сторон. а ничо что тогда класс ректенгл у тебя будет абстрактным ? вспомнилось Дуг МакИлрой Эти типы совсем не "абстрактные", они настолько же реальны, и int и float . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2010, 15:34 |
|
||
|
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNrstudio очевидно руководствуясь этой логикой от квадрата по логике пронаследуешь линию, а от линии точку ?Где такое пишут, дай почитать неверная у тебя логика. линия не является квадратом. квадрат является прямоугольником. так понятно? Чтобы хранить базовый класс нужно 2х байт, чтобы хранить его наследника нужно Х байт, а чтобы хранить линию достаточно Х/2 байт. Чтобы хранить наследника линии, точку, нужны Х/4 байт. Все сходится :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2010, 15:47 |
|
||
|
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2010, 15:56 |
|
||
|
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
|
|||
|---|---|---|---|
|
#18+
rstudioZyK_BotaNrstudio очевидно руководствуясь этой логикой от квадрата по логике пронаследуешь линию, а от линии точку ?Где такое пишут, дай почитать неверная у тебя логика. линия не является квадратом. квадрат является прямоугольником. так понятно? Чтобы хранить базовый класс нужно 2х байт, чтобы хранить его наследника нужно Х байт, а чтобы хранить линию достаточно Х/2 байт. Чтобы хранить наследника линии, точку, нужны Х/4 байт. Все сходится :) нет не сходится. сколько хранится бай - не известно(инкапусаляция, одному разрабу известно как он реализовал данный тип). главное интерфейс. в моей реализации, для хранения квадрата были взяты те же 2х байта, что и для прямоугольника. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2010, 16:03 |
|
||
|
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
|
|||
|---|---|---|---|
|
#18+
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, где утверждение про подтипы и - контракты, где про производные классы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2010, 16:46 |
|
||
|
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
|
|||
|---|---|---|---|
|
#18+
1) иерархия типов определяется законами логики из заданных аксиом, то есть, дана Богом и не может быть изменена. 2) иерархия классов определятся произволом программиста, и может быть перекручена, чуть ли не в произвольном порядке. 3) соответствие иерархий выполняется тогда, когда для каждой пары подкласс - надкласс спецификация подкласса является подтипом спецификации надкласса. 4) проверка типов в компиляторе гарантирует работу программы только тогда, когда иерархия типов соответствует иерархии классов. 5) принципы дизайна по контракту создают иерархии классов соответствующие иерархиями типов. точка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2010, 18:22 |
|
||
|
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
|
|||
|---|---|---|---|
|
#18+
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. Выделено красным. Из одной неверной предпосылки не следует ложность другой. это не посылки, это следствия из аксиом. Из одной аксиомы строится один класс, из другой - второй. аксиомы не совместимы и равнозначны. Классы в этом смысле одинаковы - значение переменной одного класса не может быть присвоено в переменную другого и наоборот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 07:34 |
|
||
|
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
|
|||
|---|---|---|---|
|
#18+
Siemargl Что считать подтипом? Похоже, что производный класс всегда является подтипом. И тогда нужно аккуратно совместить LSP, где утверждение про подтипы и - контракты, где про производные классы. тип - это спецификация, то есть, список аксиом. подтип - более длинный список аксиом, содержащий родительский список. Принцип подстановки Лисков меня уже не волнует, у меня свой критерий, лучше есть. http://www.sql.ru/forum/actualthread.aspx?tid=800476&pg=10#9707022 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 07:37 |
|
||
|
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
|
|||
|---|---|---|---|
|
#18+
tchingizSiemarglпропущено... Мне кажется, уважаемый Чингиз, что ты таки ошибаешься в двух местах: 1. Выделено красным. Из одной неверной предпосылки не следует ложность другой. это не посылки, это следствия из аксиом. Из одной аксиомы строится один класс, из другой - второй. аксиомы не совместимы и равнозначны. Классы в этом смысле одинаковы - значение переменной одного класса не может быть присвоено в переменную другого и наоборот. В твоих аксиомах противоречия для наследования прямоугольника от квадрата нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 08:39 |
|
||
|
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
|
|||
|---|---|---|---|
|
#18+
Ладно, для прямоугольника я могу придумать опровержение. Программа, которая умеет работать с квадратами и полагается на равенство сторон, опрокинется если получит прямоугольник. Остается второе утверждение: Наследовать рациональные от целых можно. Что то мне кажется, что жестко подходя к принципам - невозможно вообще ничего отнаследовать ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 09:27 |
|
||
|
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
|
|||
|---|---|---|---|
|
#18+
SiemarglЧто то мне кажется, что жестко подходя к принципам - невозможно вообще ничего отнаследовать )))Нашел ответ у Александреску - базовый класс должен задавать настолько мягкие ограничения, насколько возможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 09:54 |
|
||
|
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
|
|||
|---|---|---|---|
|
#18+
Siemargltchingizнаследовать квадраты от прямоугольников это теоретически правильно. А наоборот - нет,ибо прямоугольники не входят подмножеством во множество квадратов. Только сумашедший начнет наследовать прямоугольники от квадратов. (равно как и рациональные от целых ) Не согласен.И Мейер об это не писал. Наследовать прямоугольник от квадрата можно, Наследовать рациональные от целых можно. И то и то ослабляет инвариант. Уговорили. И вправду чушь написал -) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2010, 10:17 |
|
||
|
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
|
|||
|---|---|---|---|
|
#18+
tchingizКлассы в этом смысле одинаковы - значение переменной одного класса не может быть присвоено в переменную другого и наоборот. Переменной надтипа можно присвоить значение подтипа. При этом переменная должна изменить свой тип на подтип (т.е. тип объекта сохраняется). Наоборот нельзя - компилятор не пропустит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2010, 09:36 |
|
||
|
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
|
|||
|---|---|---|---|
|
#18+
аналогичный трехлетний окружностесрач на 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" есть статья про модель наследования, так там он когда разбирает статью Лисков, все время сокрушается, что "объект" у нее означает и текущее значение переменной, и саму переменную, что так и не указаны отличия между "классом" и "типом" — или не сказано, что это синонимы, и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2011, 19:48 |
|
||
|
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
|
|||
|---|---|---|---|
|
#18+
Тут у меня единодушное мнение со Страуструпом - я тоже пытался говорить, что класс RSquare не имеет ничего общего с квадратами из математики, поэтому аппеляция к геометрическому смыслу бессмысленна. Далее, Страуструп говорит о проектировании, что если надо спроектировать классы. Я пытался решить чисто технический вопрос уже есть класс Rectangle и класс Square из статьи Мартина (и именно такие как у Мартина и никакие другие) и для них написано пять триллионов шесть миллиардов пятсот тридцать одна программа. Что будет если наследовать один из другого? Наследовать можно, но поскольку один из классов не является подтипом другого, теряется проверка типов. Вместо переменной родителя можно подставить переменную ребенка - компилятор пропустит, а на шаге выполнения задача сбойнет. -- заодно определения типизация - это свойство-средства языка, гарантирующее успешное вычисление корректного выражения. полиморфизм - это свойство-средство языка, гарантирующее успешное вычисление корректного выражения для множества типов мощности больше одного. Таким образом получаем, что с++ не вполне полиморфен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2011, 19:57 |
|
||
|
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
|
|||
|---|---|---|---|
|
#18+
после квадратов и прямоугольников, над окружностями и эллипсами я раздумывал, но решил что натуральные, целые и рациональные - более лучшие примеры. К ним не может быть претензий по поводу плохого проектирования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2011, 19:59 |
|
||
|
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
|
|||
|---|---|---|---|
|
#18+
а че тут думать? для неизменяемых объектов, квадрат можно использовать вместо прямоугольника - ковариантность. для изменяемых объектов так делать нельзя - инвариантность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2011, 20:42 |
|
||
|
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
|
|||
|---|---|---|---|
|
#18+
tchingiz заодно определения типизация - это свойство-средства языка, гарантирующее успешное вычисление корректного выражения. полиморфизм - это свойство-средство языка, гарантирующее успешное вычисление корректного выражения для множества типов мощности больше одного. Таким образом получаем, что с++ не вполне полиморфен. последнее улучшение. )) полиморфизм это свойство-средство языка позволяющее записывать корректные выражения для более чем одного типа (множества типов мощности больше один) дословный перевод из Милнера - возможность трактовать некоторые термы, как принадлежащие многим различным типам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2011, 15:03 |
|
||
|
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
|
|||
|---|---|---|---|
|
#18+
из работы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2011, 15:04 |
|
||
|
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
|
|||
|---|---|---|---|
|
#18+
отдельное спасибо Максиму Талдыкину ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2011, 15:05 |
|
||
|
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
|
|||
|---|---|---|---|
|
#18+
tchingiz, да, но полиморфизм - полиморфизму рознь. мы ведь про ad-hoc полиморфизм говорим? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2011, 15:06 |
|
||
|
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
|
|||
|---|---|---|---|
|
#18+
когда я говорю специальный, я так и пишу специальный полиморфизм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2011, 15:09 |
|
||
|
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
|
|||
|---|---|---|---|
|
#18+
частные случаи полиморфизма должны удовлетворять определению общего случая. Как и частные случаи любого понятия должны удовлетворять определению общего случая того же понятия. Например, квадрат частный случай прямоугольника, и квадрат удовлетворяет определению прямоугольника. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2011, 15:11 |
|
||
|
Re: Выгоды контрактного программирования (design by contract) квадратосрач2 +
|
|||
|---|---|---|---|
|
#18+
вот на счет контрактов часто жалуются. а что толку от контрактов, если они не проверяются на практике. дак вот, встретил на рсдн хороший пост: http://rsdn.ru/forum/decl/4522924.flat.aspx там правда примеры сложноватые для нехаскелистов, поэтому как будет время(на днях), напишу пару игрушечных примера. что бы без разных монадныых трансформеров суть топика такова. параметризируем монаду двумя типами: пост- и пред- условиями. что получаем на практике - проверку контракта в момент компиляции. пример(игрушечную модель которого я напишу сегодня или завтра): есть у нас файл. в него можно писать, только если он открыт для записи. закрывать только если он открыт. и если он закрыт, то писать в него нельзя. что нам предлагают современные языки(а вернее их библиотеки). если мы попытаемся писать в закрытый файл, то получим исключение в рантайме. но параметризированные монады позволяют отловить данную ошибку - в момент компиляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2012, 21:52 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=37557781&tid=1341820]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
143ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 196ms |
| total: | 448ms |

| 0 / 0 |
