powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Выгоды контрактного программирования (design by contract)
25 сообщений из 232, страница 3 из 10
Выгоды контрактного программирования (design by contract)
    #36919300
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNegorychZyK_BotaN, красиво, но у меня 2 замечания:
1. методы set какбы намекают, что я меняю текущий объект, а не создаю новый
2. вообще говоря, я ведь могу захотеть сделать
Код: plaintext
1.
Square s  = new Square(  5  );
Square evil = s.SetWidth(  10  ); // опа!

перечитай исправленную версию:
Код: plaintext
1.
Square s  = new Square(  5  );
Square evil = s.setSide(  10  ); // опа!
и что в исправленной версии мне запретит написать мой вариант, интересно? вполне, казалось бы легальный код, а получаю Exception там, где его быть не должно.

ZyK_BotaNчто мне не нравится в моем коде, дак это метод show.
я его написал, что-бы короче было. лучше было бы написать два метода
showSquare и showRectangleну же, сделай последний шаг, и увидь, что Square и Rectangle - это не родственники совсем! переходи на светлую сторону силы, Люк ;-))

PS а мы даже ещё не добрались до ромба )))
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36919301
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychZyK_BotaNegorychZyK_BotaN, красиво, но у меня 2 замечания:
1. методы set какбы намекают, что я меняю текущий объект, а не создаю новый
2. вообще говоря, я ведь могу захотеть сделать
Код: plaintext
1.
Square s  = new Square(  5  );
Square evil = s.SetWidth(  10  ); // опа!

перечитай исправленную версию:
Код: plaintext
1.
Square s  = new Square(  5  );
Square evil = s.setSide(  10  ); // опа!
и что в исправленной версии мне запретит написать мой вариант, интересно? вполне, казалось бы легальный код, а получаю Exception там, где его быть не должно.

как это не должно?
метод setWidth возвращает Прямоугольник, а в исправленной версии появился метод квадрата setSide, пользуйся на здоровья и никаких ошибок.
egorych
ZyK_BotaNчто мне не нравится в моем коде, дак это метод show.
я его написал, что-бы короче было. лучше было бы написать два метода
showSquare и showRectangleну же, сделай последний шаг, и увидь, что Square и Rectangle - это не родственники совсем! переходи на светлую сторону силы, Люк ;-))

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

PS а мы даже ещё не добрались до ромба )))
посмотри на 49-е сообщение. я там избавился от метода show, и теперь классы соответствуют принципу Лисков.

для работы с ромбом придется избавиться от Java. в ней нет множественного наследования.
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36919306
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaN
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
	public static void main(String[] args) {
		Square s = new Square( 5 );
		Rectangle r = s.setWidth( 10 );
		showRectangle(r);
		showSquare(new Square(r)); //явное преобразование вниз по иерархии
	}

блистательно! а теперь делаем:
Код: plaintext
1.
2.
Square s = new Square(  5  );
showRectangle( s );
showSquare( s.setWidth(  10  ) );
и, поскольку, оба класса у нас зачем-то родственники, получаем 2 неожиданных результата.
Предлагаю ещё один великолепный вариант окончательно запутать код:
Код: plaintext
showRectangle( Square( s.setWidth(  10  ) ) );
о! всё легально, всё компилируется, получается чушь )))
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36919309
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNпосмотри на 49-е сообщение. я там избавился от метода show, и теперь классы соответствуют принципу Лисков.посмотри лучше ты: для изменения размеров у Square и у Rectangle свои методы, для отображения у Square и Rectangle свои методы, в чём суть наследования теперь, можешь сказать? )))
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36919316
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych
showSquare( s.setWidth( 10 ) );[/src]и, поскольку, оба класса у нас зачем-то родственники,

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

egorych
Предлагаю ещё один великолепный вариант окончательно запутать код:
Код: plaintext
showRectangle( Square( s.setWidth(  10  ) ) );
о! всё легально, всё компилируется, получается чушь )))
Привидение вниз по иерархии было введено по заявкам слушателей:
tchingiz
у тебя нет обратного преобразования.
А в примере Мартина оно неявно требуется, при в начальном обсуждении,
когда выполнялось статическое связывание.

вот это главное,
Код: plaintext
[color=red]s = r;[/color]
а ты просто увильнул.
Так и у Мартина нет проблемы. Скопировал квадрат в прямоугольник, изменил его ширину и все.
это я и сделал, изменил ширину, при этом произошла потеря точности.
но тут претензии не ко мне, этот метод был написан для tchingiz.
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36919318
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychZyK_BotaNпосмотри на 49-е сообщение. я там избавился от метода show, и теперь классы соответствуют принципу Лисков.посмотри лучше ты: для изменения размеров у Square и у Rectangle свои методы, для отображения у Square и Rectangle свои методы, в чём суть наследования теперь, можешь сказать? )))

в методы работающие с прямоугольником могут работать и с квадратом, возвращая абсолютно идентичный результат(принцип Лисков).
методы работающие с квадратом не могут работать с прямоугольником, что и подтверждает данное выражение:
Код: plaintext
showRectangle( Square( s.setWidth(  10  ) ) );
здесь происходит явное приведение с потерей точности.



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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
#include "stdafx.h"
#include <iostream>
class Rhomb {
	double a, side;
public:
	Rhomb(int ia, double iside) {
		a = ia;
		side = iside;
	}
	Rhomb setSide(double newSide) {
		return Rhomb(a, newSide);
	}
	Rhomb setA(int newA) {
		return Rhomb(newA, side);
	}
	int getA() {
		return a;
	}
	double getSide() {
		return side;
	}
};

class Rectangle {
	double w,h;
public:
	Rectangle(double iw, double ih) {
		w = iw;
		h = ih;
	}
	Rectangle setWidth(double newW) {
		return Rectangle(newW, h);
	}
	Rectangle setHeight(double newH) {
		return Rectangle(w, newH);
	}
	double getWidth() {
		return w;
	}
	double getHeight() {
		return h;
	}
};
class Square: public Rectangle, public Rhomb {
public:	
	Square(double side) : Rectangle(side, side),
		Rhomb( 90 , side) {
		
	}
	Square(Rectangle r) : Rectangle(r.getHeight(),r.getHeight()),
		Rhomb( 90 , r.getHeight()) {

	}
	Square(Rhomb r) : Rectangle(r.getSide(),r.getSide()),
		Rhomb( 90 , r.getSide()) {

	}
	Square setSide(double newSide) {
		return Square( newSide );
	}
	
};
    void showRectangle(Rectangle r) {
		std::cout << "Rectangle(" << r.getWidth() << "," << r.getHeight() << ")" << std::endl;
	}
	void showSquare(Square s) {
		std::cout << "Square(" << s.getSide() << ")" << std::endl;
	}
	void showRhomb(Rhomb r) {
		std::cout << "Rhomb(" << r.getA() << "," << r.getSide() << ")" << std::endl;
	}
int _tmain(int argc, _TCHAR* argv[])
{
	Square s = Square( 5 );
	Rhomb rhomb = Rhomb( 23 ,  20 );
	showRhomb(rhomb);
	showRhomb(s);
	showRhomb(rhomb.setSide( 8 ));
	showRhomb(s.setSide( 9 ));
	showRhomb(s.setA( 45 ));
	showSquare(Square(rhomb));
	return  0 ;
}

выводит:
Код: plaintext
1.
2.
3.
4.
5.
Rhomb( 23 , 20 )
Rhomb( 90 , 5 )
Rhomb( 23 , 8 )
Rhomb( 90 , 9 )
Rhomb( 45 , 5 )
Square( 20 )
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36919340
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaN
тогда с потерей точности будет работать.
но тогда преобразование нужно делать явно.
с потерей точности - да.
поэтому в жизни вещественные - целые ( целые - натуральне) есть,
а по принципу Лисков их нельзя преобразовать. Они - разные типы.
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36919343
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizZyK_BotaN
тогда с потерей точности будет работать.
но тогда преобразование нужно делать явно.
с потерей точности - да.
поэтому в жизни вещественные - целые ( целые - натуральне) есть,
а по принципу Лисков их нельзя преобразовать. Они - разные типы.

авторПусть q(x) является свойством, верным относительно объектов x некоторого типа T. Тогда q(y) также должно быть верным для объектов y типа S, где S является подтипом типа T.
где здесь про перобразование типов от родительского к дочернему?
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36919345
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNtchingiz
должна быть изменена в


Код: plaintext
1.
2.
3.
4.
z -некоторый кортеж;
Square s = new Square( 5 );
Rectangle r = s;
s = r.method(z);

здесь можно подробней? я не понял.
то, что получается после применения метода method надо класть в переменную описанную
классом ребенка.
В цепочке должно быть два преобразования

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

авторПусть q(x) является свойством, верным относительно объектов x некоторого типа T. Тогда q(y) также должно быть верным для объектов y типа S, где S является подтипом типа T.
где здесь про перобразование типов от родительского к дочернему?
я тебе рассказывал, что оно неявно всплывает.
Оно всплывает у Мартина когда он рассматривает первый шаг -
после преобразования ребенка в родителя вызывает родительский метод.
Метод нарушает инвариант ребенка, что делает невозможным обратное преобразование в ребенка.
Потом Мартин, чтобы победить эту проблему вызывает детский метод - динамическое связывание.
Заменяет функцию удовлетворяющую аксиомам родителя, на функцию удовлетворяющую аксиомам
ребенка.
И вот это уже, приводит к тому, что портятся РАНЕЕ НАПИСАННЫЕ ПРОГРАММЫ.
Их писали в предположении аксиом родителя.
Дизайн по контракту выявляет эту не очевидную трудность -
подкласс - это не подтип. Нельзя подставлять переменные как Лисков хочет.
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36919349
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizZyK_BotaN tchingiz
должна быть изменена в


Код: plaintext
1.
2.
3.
4.
z -некоторый кортеж;
Square s = new Square( 5 );
Rectangle r = s;
s = r.method(z);

здесь можно подробней? я не понял.
то, что получается после применения метода method надо класть в переменную описанную
классом ребенка.
В цепочке должно быть два преобразования

ребенок -> родитель,
изменение ребенка, под видом родителя ранее написанными программами
родитель -> ребенок
я допилил класс.
теперь можно это сделать так:
Код: plaintext
1.
2.
3.
4.
z -некоторый кортеж;
Square s = new Square( 5 );
Rectangle r = s;
s = new Square(r.method(z));
но, покажи мне, где требуется такое поведение в принципе лисков, что-бы результат метода объекта подтипа, возвращал объект подтипа, а не суперкласса. Можно сузить возвращаемый тип, но это не обязательно.
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36919350
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizЖукБотан
где здесь про перобразование типов от родительского к дочернему?
я тебе рассказывал, что оно неявно всплывает.
Оно всплывает у Мартина когда он рассматривает первый шаг -
после преобразования ребенка в родителя вызывает родительский метод.
Метод нарушает инвариант ребенка, что делает невозможным обратное преобразование в ребенка.
Потом Мартин, чтобы победить эту проблему вызывает детский метод - динамическое связывание.
Заменяет функцию удовлетворяющую аксиомам родителя, на функцию удовлетворяющую аксиомам
ребенка.
И вот это уже, приводит к тому, что портятся РАНЕЕ НАПИСАННЫЕ ПРОГРАММЫ.
Их писали в предположении аксиом родителя.
Дизайн по контракту выявляет эту не очевидную трудность -
подкласс - это не подтип. Нельзя подставлять переменные как Лисков хочет.

в моем случае не портятся.
вот старый код, в котором не знают о подтипе:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void showRectangle(Rectangle r) {
		std::cout << "Rectangle(" << r.getWidth() << "," << r.getHeight() << ")" << std::endl;
	}
	

    Rectangle foo(Rectangle r) {
		r = r.setHeight(r.getWidth()* 2 );
		return r.setWidth( 2 );
	}

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

Код: plaintext
1.
2.
3.
4.
5.
int _tmain(int argc, _TCHAR* argv[]){
	Square s = Square( 5 );
	showRectangle(foo(s));
	return  0 ;
}

результат:
Rectangle(2,10);

что здесь работает не так?

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

посмотри на пример написанный на с++. там нет ни одного виртуального метода.
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36919353
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в принципе это не требуется,
это обычное требование к наследованию.
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36919355
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNtchingiz
Потом Мартин, чтобы победить эту проблему вызывает детский метод - динамическое связывание.
Заменяет функцию удовлетворяющую аксиомам родителя, на функцию удовлетворяющую аксиомам
ребенка.

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

tchingiz
это обычное требование к наследованию.

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

посмотри на пример написанный на с++. там нет ни одного виртуального метода.
на какой пример?

http://sql.ru/forum/actualthread.aspx?tid=800476&pg=3#9674182
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36919359
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторгде оно записано?
тебе целую главу вытащить?
щас посмотрю.
в принципе лисков написано для любой ранее написанной программы (квантор всеобщности),
а не для конкретной.
Если ты хочешь доказать, что нет таких программ, которые зависнут, то надо их все перебрать.
щас посмотрю
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36919362
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizавторгде оно записано?
тебе целую главу вытащить?
щас посмотрю.
в принципе лисков написано для любой ранее написанной программы (квантор всеобщности),
а не для конкретной.
Если ты хочешь доказать, что нет таких программ, которые зависнут, то надо их все перебрать.
щас посмотрю

зачем все.
ты мне дай 1 пример старой программы работающей с Прямоугольником, поведение которой измениться при передаче ей квадрата.
...
Рейтинг: 0 / 0
Выгоды контрактного программирования (design by contract)
    #36919363
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNtchingiz
Потом Мартин, чтобы победить эту проблему вызывает детский метод - динамическое связывание.
Заменяет функцию удовлетворяющую аксиомам родителя, на функцию удовлетворяющую аксиомам
ребенка.

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

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

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


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