const в D, требуется помощь клуба.
От: c-smile Канада http://terrainformatica.com
Дата: 05.07.05 03:22
Оценка:
Последние дни обсуждается имплементация механизма readonly в D.
А именно возможность имплементации readonly массивов и указателей.

Без наличия чего-то типа const char[] имплементация строк
в классическом виде невозможна.

Строки в современных ЯП это как правило пара:

typedef const char[] string; // a.k.a string-value
typedef       char[] string_buffer; // builder, whatever



Пока видится два возможных варианта:

1) имплементация const как он есть в C++. Со всеми вытекающими за и против.

2) введение двух новых метатипов readonly array & pointer, типа такого:

char#[] — readonly array
char#* — readonly pointer.

у readonly массива отсутствуют операции модифицирующие содержимое.
у readonly указателя нет опреации dereferencing to l-value.

Второй вариант гораздо легче имплементирвать и он в быту не такой
"напряжительный".

Какие еще варианты, мнения и вообще? Можно предлагать самые
"дурацкие" — брейнштОрмим пока.
Re: const в D, требуется помощь клуба.
От: Александр Сергеевич Россия  
Дата: 05.07.05 03:52
Оценка:
Здравствуйте, c-smile, Вы писали:
CS>1) имплементация const как он есть в C++. Со всеми вытекающими за и против.

CS>2) введение двух новых метатипов readonly array & pointer, типа такого:


CS> char#[] — readonly array

CS> char#* — readonly pointer.

А чего не как в си-шарп с ключевым словом readonly?
<<Winamp играет: silent>>
Re[2]: const в D, требуется помощь клуба.
От: c-smile Канада http://terrainformatica.com
Дата: 05.07.05 04:45
Оценка:
Здравствуйте, Александр Сергеевич, Вы писали:

АС>Здравствуйте, c-smile, Вы писали:

CS>>1) имплементация const как он есть в C++. Со всеми вытекающими за и против.

CS>>2) введение двух новых метатипов readonly array & pointer, типа такого:


CS>> char#[] — readonly array

CS>> char#* — readonly pointer.

АС>А чего не как в си-шарп с ключевым словом readonly?


C# readonly не есть то же самое что const char[] в С++ —
задача в основном состоит в том чтобы можно было
изобразить такое:

void foo( const char[] s )


Т.е. такая декларация предполагает что содержимое
массива s внутри функции foo не изменится.

Вот смотрим статью Влада Руденко
http://www.c-sharpcorner.com/Language/PassingConstInCSBO.asp

Вот этих вот плясок с бубном в стиле C# требуется избежать.
Re[2]: const в D, требуется помощь клуба.
От: Дарней Россия  
Дата: 05.07.05 05:01
Оценка: +1
Здравствуйте, Александр Сергеевич, Вы писали:

АС>А чего не как в си-шарп с ключевым словом readonly?


а затем, что толку от него никакого
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re: const в D, требуется помощь клуба.
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.07.05 12:26
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Без наличия чего-то типа const char[] имплементация строк

CS>в классическом виде невозможна.

Очень смешно. И как Ява с Шарпом живут?

Про immutable-типы слышал? Если в языке нормально поддерживается инкапсуляция, то нет проблем создать тип экземпляры которого можно будет только создавать, но нельзя будет изменять. Далее дело техники. Примеры в той же Яве и Шарпе.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: const в D, требуется помощь клуба.
От: c-smile Канада http://terrainformatica.com
Дата: 05.07.05 15:51
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, c-smile, Вы писали:


CS>>Без наличия чего-то типа const char[] имплементация строк

CS>>в классическом виде невозможна.

VD>Очень смешно. И как Ява с Шарпом живут?


VD>Про immutable-типы слышал? Если в языке нормально поддерживается инкапсуляция, то нет проблем создать тип экземпляры которого можно будет только создавать, но нельзя будет изменять. Далее дело техники. Примеры в той же Яве и Шарпе.


Я ж про это и говорю.

const char[] - immutable.
      char[] - mutable.


В C# и Java проблема (проблема ли?) — нет понятия deep immutable:
int foo(in MyClass cls)


in защищает от изменения переменную cls в вызывающей процедуре
но сам объект передаваемый — конем гуляй по нему.

const MyClass& cls в C++ означает что для cls объекта в классе
MyClass подавлены все изменяющие методы.
Re: const в D, требуется помощь клуба.
От: c-smile Канада http://terrainformatica.com
Дата: 05.07.05 20:42
Оценка:
Здравствуйте, c-smile, Вы писали:

"И ниччо ему золота рыба не сказала..."

По всей видимости вариантов больше нет?

deep immutable references — C++ const
shallow immutable references — предлагаемый вариант (#)

Тогда вопрос — а нужно ли оно вообще?

Обходится же C# без этого DbC (design by contract) как-то...
Re[3]: const в D, требуется помощь клуба.
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.07.05 21:06
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Я ж про это и говорю.


CS>
CS>const char[] - immutable.
CS>      char[] - mutable. 
CS>


immutable — это характиристика типа. const же всего лишь предохраняет от модификации переменной.


CS>В C# и Java проблема (проблема ли?) — нет понятия deep immutable:

CS>
CS>int foo(in MyClass cls)
CS>


CS>in защищает от изменения переменную cls в вызывающей процедуре

CS>но сам объект передаваемый — конем гуляй по нему.

Объект или передается по значению и тогда хоть обмодифицируйся. Или по ссылке. При этом возмжность модификации объекта зависит от того ползволяет ли он себя модифицировать.

Например, попроубуй изменить в C# строку или значение типа DateTimr.

CS>const MyClass& cls в C++ означает что для cls объекта в классе

CS>MyClass подавлены все изменяющие методы.

Нет. cls означет, что ссылка недопускает модфикации объекта. В то же время всегда можно создать новую ссылку или указатель и модифицировать через него тот же объект. Модифицировать же immutable-объект невозможно.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: const в D, требуется помощь клуба.
От: c-smile Канада http://terrainformatica.com
Дата: 05.07.05 23:21
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, c-smile, Вы писали:


CS>>Я ж про это и говорю.


CS>>
CS>>const char[] - immutable.
CS>>      char[] - mutable. 
CS>>


VD>immutable — это характиристика типа. const же всего лишь предохраняет от модификации переменной.


C точки зрения формальной логики

class A{...}; 
const A a;


const A есть образование нового типа A' у которого отсутвуют (или закрыты) все мутирующие методы.

immutability может быть "ручной" и "автоматической" — в С# доступна только "ручная". В C++ и первая и вторая.


CS>>В C# и Java проблема (проблема ли?) — нет понятия deep immutable:

CS>>
CS>>int foo(in MyClass cls)
CS>>


CS>>in защищает от изменения переменную cls в вызывающей процедуре

CS>>но сам объект передаваемый — конем гуляй по нему.

VD>Объект или передается по значению и тогда хоть обмодифицируйся. Или по ссылке. При этом возмжность модификации объекта зависит от того ползволяет ли он себя модифицировать.


VD>Например, попроубуй изменить в C# строку или значение типа DateTimr.


Я ж и говорю — зависит от ручной импелементации. В Java например String immutable а DateTime — нет.
Автоматической — нет.


CS>>const MyClass& cls в C++ означает что для cls объекта в классе

CS>>MyClass подавлены все изменяющие методы.

VD>Нет. cls означет, что ссылка недопускает модфикации объекта. В то же время всегда можно создать новую ссылку или указатель и модифицировать через него тот же объект. Модифицировать же immutable-объект невозможно.


Мы говорим не про mutability enforcment, а про нормальное использование.
Из-за того что в C++ используется deep immutability который(ая) есть вещь суровая, то для практических целей оставлен
const_cast<> — явное снятие immutability.

Полный режим readonly возможен только на хардверном уровне.
Re[2]: const в D, требуется помощь клуба.
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 06.07.05 05:44
Оценка: 16 (1)
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, c-smile, Вы писали:


CS>"И ниччо ему золота рыба не сказала..."


Так ничего удивительного, имхо. Из любителей D на этом форуме я могу припомнить тебя, uw и Зверька Харьковского.

CS>deep immutable references — C++ const

CS>shallow immutable references — предлагаемый вариант (#)

CS>Тогда вопрос — а нужно ли оно вообще?


Это ты про D?

Имхо, что-то подобное, определенно, нужно. Меня в Java очень добивало то, что объекты передавались в методы по ссылке, но никак нельзя было запретить методу модифицировать объект.

Как C++ник, думаю, что нужно делать аналог C++ const. Хотя выльется это, вероятно, в очень серьезную модификацию D. И, кроме того, придется поддерживать mutable-атрибуты у объектов. Кстати, в первом посте ты сказал: "1) имплементация const как он есть в C++. Со всеми вытекающими за и против". А что под "против" понимается?

Ну а второй вариант мне даже синтаксически не нравится. Использование спецсимволов для обозначения характеристик объектов -- это, имхо, прямой путь к perl-подобному синтаксису.
И еще во втором варианте меня вот что смущает. Я уже не помню D толком, но кажется там есть понятие указателей и есть операция разыменования указателя (ты сам сказал: "у readonly указателя нет опреации dereferencing to l-value"). Это позволяет делать на шаблонах что-то вроде (синтаксис C++):
template< class T >
T f( T * p ) { T c = *p; ...; return c; }


т.е., если f() вызывается для const T *, то T внутри шаблона будет иметь тип const T.
А если в D сделать readonly pointer, то не введет ли это новую абстракцию "readonly pointer", который вроде как pointer, но не такой? И не создаст ли это сложностей при программировании тех же шаблонов?
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[5]: const в D, требуется помощь клуба.
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.07.05 11:28
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, VladD2, Вы писали:


VD>>Здравствуйте, c-smile, Вы писали:


CS>>>Я ж про это и говорю.


CS>>>
CS>>>const char[] - immutable.
CS>>>      char[] - mutable. 
CS>>>


VD>>immutable — это характиристика типа. const же всего лишь предохраняет от модификации переменной.


CS>C точки зрения формальной логики


CS>
CS>class A{...}; 
CS>const A a; 
CS>


CS>const A есть образование нового типа A' у которого отсутвуют (или закрыты) все мутирующие методы.


Нет здесь никакой логики. const всего лишь модификатор распространяющийся на переменную. Самому объекту от этого не горячо и не холодно. Вот такой код тебя ведь не смущат:
class A { };

void main()
{
    A* a1 = new A();
    const A* a2 = a2;
}


При этом a1 можно менять, а a2 нет. Но по твоим словам у них разный тип.

CS>immutability может быть "ручной" и "автоматической" — в С# доступна только "ручная". В C++ и первая и вторая.


В С# доступна инкапсуляция которая позволяет создать immutability-объекты. Отальное от лукавого.

Главное, что этого достаточно для создания immutability-классов решающих поставленную проблему.

CS>Я ж и говорю — зависит от ручной импелементации.


Как меня раздражает эта твоя "импелементации"... если бы ты знал.

CS> В Java например String immutable а DateTime — нет.

CS>Автоматической — нет.

А зачем автоматическое? Это характиристика типа. Пусть тот кто проектирует тип и определяет эту характиристику.

Причем я как бы не спорю, что нечто вроде readonly для локальных переменных очень не помешало бы в Шарпе. Но immutable тем не менее — это характеристика класса. Это можно сказать паттерн проектрования. И никакие const его не заменят.

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

CS>Мы говорим не про mutability enforcment,


Ну, пошли иностранные ругательства.

CS> а про нормальное использование.


Дык что есть нормальное это еще очень большой вопрос.

CS>Из-за того что в C++ используется deep immutability который(ая) есть вещь суровая, то для практических целей оставлен

CS>const_cast<> — явное снятие immutability.

Это ты себе придумываешь. С++ предоставляет возможность локальной защиты в виде объявления переменных как неизменяемыми. Ничего "глубокого" тут нет.

Как показывает практика при работе в рамках подхода когда сам тип определяет возможность своей модификации эта константность не так уж и необходима. Скорее возникает ощущение отсуствие того к чему привык. Но это проходит.

CS>Полный режим readonly возможен только на хардверном уровне.


Ну почему же? Если у меня полностью типобезопасный язык и язык действительно декларирует, что "A != const A", то он обязан гарантировать невозможность изменения объектов типа const A. Просто С++ никогда не бы типобезопасным. Только и всего. Да и const в нем все же трактуется как модификатор переменной.
... << RSDN@Home 1.2.0 alpha rev. 516>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: const в D, требуется помощь клуба.
От: c-smile Канада http://terrainformatica.com
Дата: 06.07.05 21:02
Оценка: 10 (1)
Здравствуйте, VladD2, Вы писали:

CS>>Из-за того что в C++ используется deep immutability который(ая) есть вещь суровая, то для практических целей оставлен

CS>>const_cast<> — явное снятие immutability.

VD>Это ты себе придумываешь. С++ предоставляет возможность локальной защиты в виде объявления переменных как неизменяемыми. Ничего "глубокого" тут нет.


Для самообразования про то что есть такое deep and shallow immutability:
http://www-sop.inria.fr/everest/events/cassis05/Transp/poll.pdf

Еще раз, с точки зрения теории:

class A {...}
A a1;
const A a2;


a1 и a2 принадлежат разным классам. С++ например считает именно так.

const A a2; есть неявное объявление класса A' множество свойств и методом которого
ограничено тольку "не мутирующими" свойствами и методами класса A.

Про то как deep immutability могло быть сделано в C# или Java
читаем здесь:

Javari Language — Java extended by readonly and mutable keywords:
"A Practical Type System and Language for Reference Immutability"
http://pag.csail.mit.edu/~mernst/pubs/ref-immutability-oopsla2004-slides.pdf
Re[3]: const в D, требуется помощь клуба.
От: c-smile Канада http://terrainformatica.com
Дата: 06.07.05 21:29
Оценка:
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, c-smile, Вы писали:


CS>>Здравствуйте, c-smile, Вы писали:


CS>>"И ниччо ему золота рыба не сказала..."


E>Так ничего удивительного, имхо. Из любителей D на этом форуме я могу припомнить тебя, uw и Зверька Харьковского.


CS>>deep immutable references — C++ const

CS>>shallow immutable references — предлагаемый вариант (#)

CS>>Тогда вопрос — а нужно ли оно вообще?


E>Это ты про D?


E>Имхо, что-то подобное, определенно, нужно. Меня в Java очень добивало то, что объекты передавались в методы по ссылке, но никак нельзя было запретить методу модифицировать объект.


E>Как C++ник, думаю, что нужно делать аналог C++ const. Хотя выльется это, вероятно, в очень серьезную модификацию D. И, кроме того, придется поддерживать mutable-атрибуты у объектов. Кстати, в первом посте ты сказал: "1) имплементация const как он есть в C++. Со всеми вытекающими за и против". А что под "против" понимается?


E>Ну а второй вариант мне даже синтаксически не нравится. Использование спецсимволов для обозначения характеристик объектов -- это, имхо, прямой путь к perl-подобному синтаксису.


В общем-то не так.

typename [] — означает массив элементов типа typename
typename #[] — означает immutable массив элементов типа typename.

Т.е. для лексера #[ это один токен. Примерно так же как << и <<=

Т.е. # не есть синоним слова const.


E>И еще во втором варианте меня вот что смущает. Я уже не помню D толком, но кажется там есть понятие указателей и есть операция разыменования указателя (ты сам сказал: "у readonly указателя нет опреации dereferencing to l-value"). Это позволяет делать на шаблонах что-то вроде (синтаксис C++):

E>
E>template< class T >
E>T f( T * p ) { T c = *p; ...; return c; }
E>


E>т.е., если f() вызывается для const T *, то T внутри шаблона будет иметь тип const T.

E>А если в D сделать readonly pointer, то не введет ли это новую абстракцию "readonly pointer", который вроде как pointer, но не такой? И не создаст ли это сложностей при программировании тех же шаблонов?

Мысль понял. Спасибо. В предлагаемом варианте получентие значения по ссылке все та же
*.

Т.е.

f<char*>( p )
f<char#*>( p )

будут одинаково работать.


Спец. символы в общем не must.
Проблема в том что например const в С++ означает две или три разные сущности.

Eugene Pelekhay предложил например вариант когда все массивы
по определению read-only:


Here is my proposition

Assume that by default reference/slice/pointer is immutable
: // mutable string
: var char[] s1;
: // immutable string
: char[] s2;
: // slices
: s2 = s1; // legal
: s1 = s2; // illegal
: s2 = s1[1..2]; // legal
: s1 = s2[1..2]; // illegal
: s1 ~= s2; // legal
: s2 ~= s1; // illegal

: // function returns mutable string
: var char[] func1(){}
: // function returns immutable string
: char[] func2(){}

: // function with argument of immutable string
: void func3(char[] s) {}
: // function with argument of reference to immutable string
: // reference assigned during function call and content can't be
: // changed in caller trough returned reference
: void func4(out char[] s) {}
: // function with argument of initialized immutable string
: // that reference can be changed during function call
: void func5(inout char[] s) {}
: // function with argument of mutable string
: // content of string can be changed during function call
: void func6(var char[] s) {}
: // function with argument of reference to mutable string
: // content of string can be changed outside of function
: // through returned reference
: void func7(out var char[] s) {}
: // function with argument of reference to initialized mutable string
: // content of string can be changed outside of function or during call
: // through returned/passed reference
: void func8(inout var char[] s) {}


Это тоже так называемая shallow immutability ( см. ссылки в моих ответах Владу )

Считается (не мной) что попытка сделать deep immutability как в C++ чревата
а) многословием (const everywhere) b) уровень верификации immutability не является достаточным
(a.k.a. овчинка выделки не стоит)

Shallow immutability используется в Deplphi насколько мне известно

function A( const s: String ): Boolean


Спасибо за мысли.
Re[7]: const в D, требуется помощь клуба.
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.07.05 22:58
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Еще раз, с точки зрения теории:


CS>
CS>class A {...}
CS>A a1;
CS>const A a2;
CS>

CS>a1 и a2 принадлежат разным классам. С++ например считает именно так.

И почему тогда работает
A a1;
const A a2 = a1;

?

CS>Про то как deep immutability могло быть сделано в C# или Java

CS>читаем здесь:

CS>Javari Language — Java extended by readonly and mutable keywords:

CS>"A Practical Type System and Language for Reference Immutability"
CS>http://pag.csail.mit.edu/~mernst/pubs/ref-immutability-oopsla2004-slides.pdf

Спасибо огромное! Как бы я без твоих советов жил бы?
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: const в D, требуется помощь клуба.
От: Павел Кузнецов  
Дата: 07.07.05 05:15
Оценка: 20 (3)
Здравствуйте, VladD2, Вы писали:

CS>>
CS>>class A {...}
CS>>A a1;
CS>>const A a2;
CS>>

CS>>a1 и a2 принадлежат разным классам. С++ например считает именно так.

VD>И почему тогда работает

VD>
VD>A a1;
VD>const A a2 = a1;
VD>

VD>?

Потому что тип A is a const A. То же самое будет и с двумя разными классами, определенными соответствующим образом:
class constA { };

class A : public constA { };

A a1;
constA a2 = a1;


Сразу отвечу, почему работает копирование "наоборот":
const A a1;
A a2 = a1;

Потому что у A определен конструктор, принимающий const A&. Если бы его не было, последнее преобразование не работало бы:
class A {
public:
  A() { }
  A(A&) { }
};

const A a1;
A a2 = a1; // ERROR
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[9]: const в D, требуется помощь клуба.
От: c-smile Канада http://terrainformatica.com
Дата: 07.07.05 05:43
Оценка: +1
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Здравствуйте, VladD2, Вы писали:


CS>>>
CS>>>class A {...}
CS>>>A a1;
CS>>>const A a2;
CS>>>

CS>>>a1 и a2 принадлежат разным классам. С++ например считает именно так.

VD>>И почему тогда работает

VD>>
VD>>A a1;
VD>>const A a2 = a1;
VD>>

VD>>?

ПК>Потому что тип A is a const A. То же самое будет и с двумя разными классами, определенными соответствующим образом:

ПК>
ПК>class constA { };

ПК>class A : public constA { };

ПК>A a1;
ПК>constA a2 = a1;
ПК>


ПК>Сразу отвечу, почему работает копирование "наоборот":

ПК>
ПК>const A a1;
ПК>A a2 = a1;
ПК>

ПК>Потому что у A определен конструктор, принимающий const A&. Если бы его не было, последнее преобразование не работало бы:
ПК>
ПК>class A {
ПК>public:
ПК>  A() { }
ПК>  A(A&) { }
ПК>};

ПК>const A a1;
ПК>A a2 = a1; // ERROR
ПК>


Спасибо, Павел.

Кстати в C++ есть такая неприятная фенечка:
литеральные строковые константы имеют тип const char []
Но вот такая вот конструкция :
char *p = "привет, Вася!";

очень даже работает. Груз legacy кода как я понимаю...
Re[9]: const в D, требуется помощь клуба.
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.07.05 14:36
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

То есть ты хочешь сказать, что объект A меняет свой тип будучи присвоеным в константную переменную?

Тогда напиши в МС, что у них в компиляторе серьезный баг, так как вот такой код:
#include "stdafx.h"
#include <typeinfo.h>

class A { };

int main()
{
    A a1;
    const A a2;

    printf("typeid(a1) = %d\n", typeid(a1));
    printf("typeid(a2) = %d\n", typeid(a2));
    printf("typeid(a1).name = %s\n", typeid(a1).name());
    printf("typeid(a2).name = %s\n", typeid(a2).name());
    printf("typeid(a1) == typeid(a2) = %s\n", 
        typeid(a1) == typeid(a2) ? "true" : "false");
    return 0;
}

вадает вот такой результат:
typeid(a1) = 4282092
typeid(a2) = 4282092
typeid(a1).name = class A
typeid(a2).name = class A
typeid(a1) == typeid(a2) = true
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: const в D, требуется помощь клуба.
От: eugals Россия  
Дата: 08.07.05 15:46
Оценка: 1 (1) +2
Здравствуйте, VladD2, Вы писали:

VD>Тогда напиши в МС, что у них в компиляторе серьезный баг, так как вот такой код:


5.2.8 Type identification
...
The top-level cv-qualifiers of the lvalue expression or the type-id that is the operand of typeid are always ignored. [Example:
class D { ... };
D d1;
const D d2;
typeid(d1) == typeid(d2); // yields true
typeid(D) == typeid(const D); // yields true
typeid(D) == typeid(d2); // yields true
typeid(D) == typeid(const D&); // yields true
—end example]


3.9.3 CV-qualifiers
A type mentioned in 3.9.1 and 3.9.2 is a cv-unqualified type. Each type which is a cv-unqualified complete or incomplete object type or is void (3.9) has three corresponding cv-qualified versions of its type: a const-qualified version, a volatile-qualified version, and a const-volatile-qualified version. The term object type (1.8) includes the cv-qualifiers specified when the object is created. The presence of a const specifier in a decl-specifier-seq declares an object of const-qualified object type; such object is called a const object.

... << RSDN@Home 1.1.4 stable rev. 510>>
Re[10]: const в D, требуется помощь клуба.
От: Павел Кузнецов  
Дата: 08.07.05 15:59
Оценка: 2 (1)
Здравствуйте, VladD2, Вы писали:

VD>То есть ты хочешь сказать, что объект A меняет свой тип будучи присвоеным в константную переменную?


Нет, он присваиваеся объекту другого типа. В том, что CV-квалификация входит в тип выражения (скажем, в отличие от ссылки), можно легко убедиться анализируя как производится вывод типов аргументов шаблонов по аргументам функции. Или просто посмотреть на то, как вводится CV-квалификация в стандарте:

3.9.3 CV-qualifiers [basic.type.qualifier]

1 A type mentioned in 3.9.1 and 3.9.2 is a cv-unqualified type. Each type which is a cv-unqualified complete or incomplete object type or is void (3.9) has three corresponding cv-qualified versions of its type: a const-qualified version, a volatile-qualified version, and a const-volatile-qualified version. The term object type (1.8) includes the cv-qualifiers specified when the object is created. The presence of a const specifier in a decl-specifier-seq declares an object of const-qualified object type; such object is called a const object. The presence of a volatile specifier in a decl-specifier-seq declares an object of volatile-qualified object type; such object is called a volatile object. The presence of both cv-qualifiers in a declspecifier-seq declares an object of const-volatile-qualified object type; such object is called a const volatile object. The cv-qualified or cv-unqualified versions of a type are distinct types; however, they shall have the same representation and alignment requirements (3.9).


VD>Тогда напиши в МС, что у них в компиляторе серьезный баг, так как вот такой код:

VD>
VD>    A a1;
VD>    const A a2;

VD>    printf("typeid(a1) = %d\n", typeid(a1));
VD>    printf("typeid(a2) = %d\n", typeid(a2));
VD>    printf("typeid(a1) == typeid(a2) = %s\n", 
VD>        typeid(a1) == typeid(a2) ? "true" : "false");
VD>    return 0;
VD>}
VD>

VD>вадает вот такой результат: <...>

Да, хороший пример. Для typeid, т.к. CV-квалифицированные версии являются отдельными типами, присутствует специальное правило, предписывающее именно для целей typeid считать типы, отличающиеся только CV-квалификацией верхнего уровня, идентичными (5.2.8/5).
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[11]: const в D, требуется помощь клуба.
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.07.05 18:25
Оценка:
Здравствуйте, eugals, Вы писали:

E>

E>5.2.8 Type identification
E>...
E>The top-level cv-qualifiers of the lvalue expression or the type-id that is the operand of typeid are always ignored. [Example:
E>class D { ... };
E>D d1;
E>const D d2;
E>typeid(d1) == typeid(d2); // yields true
E>typeid(D) == typeid(const D); // yields true
E>typeid(D) == typeid(d2); // yields true
E>typeid(D) == typeid(const D&); // yields true
E>—end example]


E>

E>3.9.3 CV-qualifiers
E>A type mentioned in 3.9.1 and 3.9.2 is a cv-unqualified type. Each type which is a cv-unqualified complete or incomplete object type or is void (3.9) has three corresponding cv-qualified versions of its type: a const-qualified version, a volatile-qualified version, and a const-volatile-qualified version. The term object type (1.8) includes the cv-qualifiers specified when the object is created. The presence of a const specifier in a decl-specifier-seq declares an object of const-qualified object type; such object is called a const object.


Ну, тоесть стандарт противоречит сам себе? Или это все же не тип в полном понимании этого слова?
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: const в D, требуется помощь клуба.
От: Павел Кузнецов  
Дата: 09.07.05 00:21
Оценка: 1 (1)
VladD2,

> E>

> E>The top-level cv-qualifiers of the lvalue expression or the type-id that is the operand of typeid are always ignored. [Example:
> E>

>
> E>

> E>A type mentioned in 3.9.1 and 3.9.2 is a cv-unqualified type. Each type which is a cv-unqualified complete or incomplete object type or is void (3.9) has three corresponding cv-qualified versions of its type: <...>
> E>

>
> Ну, тоесть стандарт противоречит сам себе? Или это все же не тип в полном понимании этого слова?

Не противоречит. Это такое специальное правило: для нескольких различных, но некоторым образом связанных, типов объект type_info хранится общий на всех. Также точно можно было бы внести в спецификацию требование идентичности результата typeid для всех типов, начинающихся с одной и той же буквы. И, хотя в последнем шаге никакого смысла нет, от этого эти типы одним типом бы не стали. Соответственно, CV-квалифицированные версии некоторого типа являются вполне различимыми типами в полном понимании этого слова, но для них введены некоторые специальные правила (идентичность типов с точки зрения typeid — из них далеко не единственное).
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[6]: const в D, требуется помощь клуба.
От: Kluev  
Дата: 09.07.05 10:53
Оценка: 1 (1) +1
VD>В С# доступна инкапсуляция которая позволяет создать immutability-объекты. Отальное от лукавого.
VD>Главное, что этого достаточно для создания immutability-классов решающих поставленную проблему.

Нифига это не решает проблеммы.
Вот пример на С++ из реальной жизни


struct KnotVector
{
   double knot_at( int idx ) const;
   void   resize( int p, int n ); 
};

struct PointVector
{
    const HPoint& point_at( int idx ) const;
    void resize( int n );
};

// а теперь внимание сюда:
class NurbsCurve
{
   KnotVector  m_U;
   PointVector m_Pw;
public:
   const KnotVector&  U() const { return m_U; }
   const PointVector& Pw() const { return m_Pw; }

// вот здесь:
   void resize( int p, int n )
   {
      m_U.resize(p,n);
      m_Pw.resize(n);
   }
};


Классы KnotVector и PointVector могут юзатся пользователем сами по себе или как агреггаты в других классах NurbsCurve, NurbsSurface и т.п. Причем когда они юзаются как часть агрегата естественно что модификация возможна только классом владельцем.

Если бы не было const то пришлось бы копировать read-only интерфейс KnotVector и PointVector в каждый из классов:


class NurbsSurface
{
   KnotVector m_U, m_V;
public:
   double u_knot_at(int idx);
   double v_knot_at(int idx);
// и еще тридцать методов 
};


А const позволяет все закрыть и грамотно все спроектировать. Конечно щас кое кто возразит что можно заюзать const_cast? но это уже не мои проблеммы. Почему бы сразу не заюзать format c:?
Re[7]: const в D, требуется помощь клуба.
От: IT Россия linq2db.com
Дата: 09.07.05 16:28
Оценка:
Здравствуйте, Kluev, Вы писали:

K>А const позволяет все закрыть и грамотно все спроектировать. Конечно щас кое кто возразит что можно заюзать const_cast? но это уже не мои проблеммы. Почему бы сразу не заюзать format c:?


Вот именно. Кто хочет тот добъётся. Так зачем тогда вообще всё это нужно?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[8]: const в D, требуется помощь клуба.
От: pvgoran Россия  
Дата: 09.07.05 17:32
Оценка: +2
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Kluev, Вы писали:


K>>А const позволяет все закрыть и грамотно все спроектировать. Конечно щас кое кто возразит что можно заюзать const_cast? но это уже не мои проблеммы. Почему бы сразу не заюзать format c:?


IT>Вот именно. Кто хочет тот добъётся. Так зачем тогда вообще всё это нужно?

Как зачем? Чтобы тот, кто не хочет (== не написал const_cast), не мог "добиться" ненужного поведения.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[9]: const в D, требуется помощь клуба.
От: IT Россия linq2db.com
Дата: 09.07.05 18:11
Оценка:
Здравствуйте, pvgoran, Вы писали:

IT>>Вот именно. Кто хочет тот добъётся. Так зачем тогда вообще всё это нужно?

P>Как зачем? Чтобы тот, кто не хочет (== не написал const_cast), не мог "добиться" ненужного поведения.

Но что делать, если они без этого поведения не могут прожить ни дня Как неправильно не хочется, а как правильно нельзя.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re: const в D, требуется помощь клуба.
От: c-smile Канада http://terrainformatica.com
Дата: 09.07.05 18:57
Оценка: +1
В конце концов выяснилось следующее:

Введены следующие понятия:

есть 1) immutable resource, а есть
2) immutable reference — суть readonly observer.

сторонники ultimate immutability (включая Вальтера)
утверждали (past continious, sic!) следующее:

т.к. в C++ нельзя достичь №1 (что правда) значит это все обман
и профанация поэтому народу не нужны ни №1 ни №2.

Путем неслабого LOLQ ( Loss of life quotient, the amount you post is the equivilent to your
loss of life. Очень понравилась аббревиатура ) похоже удалось договориться что
№2 является вельми полезной вещью.
Re[2]: const в D, требуется помощь клуба.
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 09.07.05 19:22
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>есть 1) immutable resource, а есть

CS>2) immutable reference — суть readonly observer.

CS>Путем неслабого LOLQ ( Loss of life quotient, the amount you post is the equivilent to your

CS>loss of life. Очень понравилась аббревиатура ) похоже удалось договориться что
CS>№2 является вельми полезной вещью.

c-smile, а можно для менее эрудированных читателей описать тоже самое в более доступной форме и на русском?
И с примерами, если не сложно.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[10]: const в D, требуется помощь клуба.
От: pvgoran Россия  
Дата: 09.07.05 19:23
Оценка: +3
Здравствуйте, IT, Вы писали:

IT>>>Вот именно. Кто хочет тот добъётся. Так зачем тогда вообще всё это нужно?

P>>Как зачем? Чтобы тот, кто не хочет (== не написал const_cast), не мог "добиться" ненужного поведения.

IT>Но что делать, если они без этого поведения не могут прожить ни дня Как неправильно не хочется, а как правильно нельзя.

Типа, const_cast — это сознательное нарушение const-семантики. (А сознательно, как уже было сказано, можно и format c: сделать.) Важно, чтобы этого нельзя было (или сложно) сделать неосознанно...
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[11]: const в D, требуется помощь клуба.
От: IT Россия linq2db.com
Дата: 09.07.05 21:37
Оценка:
Здравствуйте, pvgoran, Вы писали:

P>Важно, чтобы этого нельзя было (или сложно) сделать неосознанно...


Ну а если мне всё-таки это нужно сделать и сделать осознанно? Ну всякие бывают в жизни случаи
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: const в D, требуется помощь клуба.
От: c-smile Канада http://terrainformatica.com
Дата: 10.07.05 07:09
Оценка: 43 (3)
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, c-smile, Вы писали:


CS>>есть 1) immutable resource, а есть

CS>>2) immutable reference — суть readonly observer.

CS>>Путем неслабого LOLQ ( Loss of life quotient, the amount you post is the equivilent to your

CS>>loss of life. Очень понравилась аббревиатура ) похоже удалось договориться что
CS>>№2 является вельми полезной вещью.

E>c-smile, а можно для менее эрудированных читателей описать тоже самое в более доступной форме и на русском?

E>И с примерами, если не сложно.

Я извиняюсь что получилось как-то уж слишком...

Смысл примерно такой:

В D есть три типа ссылок:
1) array (или slice) ссылка на последовательность элементов, имеет атрибуты ptr — ссылка на первый элемент и length длина в элементах.
2) pointer — обычный pointer на место в памяти — то же самое что и в C/C++
3) object reference — закамуфлированный указатель на объект — то же что и в Java.

Постулируется следующее: Объект(его класс) (если нужно) можно всегда описать таким образом что он будет
"только для чтения" для внеших пользователей.

Т.е. основная проблема и потребность состоит в обеспечентии immutability для arrays и pointers.

Идея предложения состоит в ведении двух новых (и явных в отличии от C++)
типов read-only array (slice) и read-only pointer — типы ссылок
"только читающий наблюдатель".

Нотация примерно такова:


char a[]; // rw array или slice
char b[#]; // ro array или slice

char a[100]; // static rw array
char b[#] = "Hello Vasya"; // static ro array


Т.е.

char a[] = "Привет"; // ошибка компиляции - cannot cast char[#] to char[]
char b[#] = "Вася"; // все нормально

char c[#] = b[1..3]; // получение слайса, нормально
char d[] = b[1..3]; // ошибка компиляции - cannot cast char[#] to char[]
...


В общем все просто и очевидно как двери.
Реализация всего этого дела проста до примитивности —
статическое расширение таблицы типов. Внешне все просто
и очевидно. В общем — в D стиле.

Если чего не понятно — свистите попробую объяснить.
Re[12]: const в D, требуется помощь клуба.
От: pvgoran Россия  
Дата: 10.07.05 07:25
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, pvgoran, Вы писали:


P>>Важно, чтобы этого нельзя было (или сложно) сделать неосознанно...


IT>Ну а если мне всё-таки это нужно сделать и сделать осознанно? Ну всякие бывают в жизни случаи

Вот когда осознанно — тогда и используешь себе спокойно const_cast. Ровно как и format c:.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[13]: const в D, требуется помощь клуба.
От: IT Россия linq2db.com
Дата: 10.07.05 15:56
Оценка:
Здравствуйте, pvgoran, Вы писали:

IT>>Ну а если мне всё-таки это нужно сделать и сделать осознанно? Ну всякие бывают в жизни случаи

P>Вот когда осознанно — тогда и используешь себе спокойно const_cast. Ровно как и format c:.

Т.е. если у меня 30 методов в классе. 15 из них мне не нужно пользовать напрямую, 15 нужно, то мы ставим const, а там где нужно вызываем const_cast? Зашибатый дизайн! Как там Kluev говорил?

А const позволяет все закрыть и грамотно все спроектировать.


Грамотнее уже дальше некуда.
... << RSDN@Home 1.1.4 stable rev. 510>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[14]: const в D, требуется помощь клуба.
От: pvgoran Россия  
Дата: 10.07.05 16:11
Оценка:
Здравствуйте, IT, Вы писали:

IT>>>Ну а если мне всё-таки это нужно сделать и сделать осознанно? Ну всякие бывают в жизни случаи

P>>Вот когда осознанно — тогда и используешь себе спокойно const_cast. Ровно как и format c:.

IT>Т.е. если у меня 30 методов в классе. 15 из них мне не нужно пользовать напрямую, 15 нужно, то мы ставим const, а там где нужно вызываем const_cast? Зашибатый дизайн!

Так... Что-то я не понял, причем здесь const и const_cast. Можно поподробнее?
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[15]: const в D, требуется помощь клуба.
От: IT Россия linq2db.com
Дата: 10.07.05 16:21
Оценка:
Здравствуйте, pvgoran, Вы писали:

IT>>Т.е. если у меня 30 методов в классе. 15 из них мне не нужно пользовать напрямую, 15 нужно, то мы ставим const, а там где нужно вызываем const_cast? Зашибатый дизайн!

P>Так... Что-то я не понял, причем здесь const и const_cast. Можно поподробнее?

Что тут непонятного? Что ты будешь делать, если половину методов в классе тебе нужно разрешить использовать, а вторую половину ты хочешь "грамотно все спроектировать" и закрыть?
... << RSDN@Home 1.1.4 stable rev. 510>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[16]: const в D, требуется помощь клуба.
От: c-smile Канада http://terrainformatica.com
Дата: 11.07.05 01:22
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, pvgoran, Вы писали:


IT>>>Т.е. если у меня 30 методов в классе. 15 из них мне не нужно пользовать напрямую, 15 нужно, то мы ставим const, а там где нужно вызываем const_cast? Зашибатый дизайн!

P>>Так... Что-то я не понял, причем здесь const и const_cast. Можно поподробнее?

IT>Что тут непонятного? Что ты будешь делать, если половину методов в классе тебе нужно разрешить использовать, а вторую половину ты хочешь "грамотно все спроектировать" и закрыть?


Что значит "закрыть"?

Это не про private/protected/public ли?
Re[17]: const в D, требуется помощь клуба.
От: IT Россия linq2db.com
Дата: 11.07.05 01:38
Оценка:
Здравствуйте, c-smile, Вы писали:

IT>>Что тут непонятного? Что ты будешь делать, если половину методов в классе тебе нужно разрешить использовать, а вторую половину ты хочешь "грамотно все спроектировать" и закрыть?


CS>Что значит "закрыть"?

CS>Это не про private/protected/public ли?

Нет, это const. См. выше по топику.
... << RSDN@Home 1.1.4 stable rev. 510>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[18]: const в D, требуется помощь клуба.
От: c-smile Канада http://terrainformatica.com
Дата: 11.07.05 02:22
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, c-smile, Вы писали:


IT>>>Что тут непонятного? Что ты будешь делать, если половину методов в классе тебе нужно разрешить использовать, а вторую половину ты хочешь "грамотно все спроектировать" и закрыть?


CS>>Что значит "закрыть"?

CS>>Это не про private/protected/public ли?

IT>Нет, это const. См. выше по топику.


Где? Я совсем запутался.

Вот эта твоя фраза:
"Что ты будешь делать, если половину методов в классе тебе нужно разрешить использовать, а вторую половину ты хочешь "грамотно все спроектировать" и закрыть?"

Имеет ответ:
...разрешить использовать — объявить public
...закрыть — объявить private/protected/package

Можешь изложишь еще раз что такое "закрыть"?
Re[19]: const в D, требуется помощь клуба.
От: IT Россия linq2db.com
Дата: 11.07.05 02:26
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Можешь изложишь еще раз что такое "закрыть"?


Re[6]: const в D, требуется помощь клуба.
Автор: Kluev
Дата: 09.07.05
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[20]: const в D, требуется помощь клуба.
От: c-smile Канада http://terrainformatica.com
Дата: 11.07.05 04:08
Оценка: +1
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, c-smile, Вы писали:


CS>>Можешь изложишь еще раз что такое "закрыть"?


IT>Re[6]: const в D, требуется помощь клуба.
Автор: Kluev
Дата: 09.07.05


Так, ладн, давай я напишу то как я тебя понимаю.

1) Есть абстрактное понятие resource immutability
гипотетическая возможность объявление фрагмента памяти "только для чтения".
2) Есть второе понятие — reference immutability — "через эту ссылку на память её (память) изменить нельзя"

Известно что №1 имплементировать на уровне компилятора практически нельзя —
требуется runtime имплементация на уровне virtual machine. Для C++ виртуальной машиной
явлеяется сам процессор. Т.е. без поддержки процессора №1 имплементирвать нельзя.
На уровне VM (.NET/Java) это сделать можно, но путем еще большей потери эффективности

Как я понял ты утверждаешь следующее :
Если №1 сделать практически нельзя то и №2 никому не нужен.

Я правильно тебя понял?

Дело в том что reference immutability (№2) есть того же поля ягода
что и наличие в языках атрибутов видимости public / private / protected.
const в С++ это просто еще один инструмент на эту тему.

Т.е. если считать что const это не решение, то и public / private / protected тоже
бесполезны — эти атрибуты "снимаются" простым кастом к открытому типу.

Или я неправильно тебя понял?
Re[14]: const в D, требуется помощь клуба.
От: Kluev  
Дата: 11.07.05 06:54
Оценка: +1
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, pvgoran, Вы писали:


IT>>>Ну а если мне всё-таки это нужно сделать и сделать осознанно? Ну всякие бывают в жизни случаи

P>>Вот когда осознанно — тогда и используешь себе спокойно const_cast. Ровно как и format c:.

IT>Т.е. если у меня 30 методов в классе. 15 из них мне не нужно пользовать напрямую, 15 нужно, то мы ставим const, а там где нужно вызываем const_cast? Зашибатый дизайн! Как там Kluev говорил?


IT>

А const позволяет все закрыть и грамотно все спроектировать.


IT>Грамотнее уже дальше некуда.


Уважаемый IT я не понимаю на что ты жалуешься? Если ты юзаешь в С++ const_cast это значит что ты изучил классцы и знаешь что делаешь. В С# вася пупкин напишет immutable-proxy и прийдется только через рефлекшн лезть в обход private (еще хуже чем конст_каст). Или самому все переписать и кататся на своих собственных велосипедах. Проблема не в констах а в вася-пупкиных. Только в С++ проще — написал const и спи отдыхай. А в С# прийдется пыхтеть для каждого класса readonly-прохор писать. Или вообще забить на константность. Только это тоже не выход. Забиваем на константноть потребуется писть доку: что можно, а что нельзя. Забиваем на доку — нужен самодокументируемый внятный код. Иными словами троерожный бес — как не кинь всегда рогом вверх.
Re[20]: const в D, требуется помощь клуба.
От: pvgoran Россия  
Дата: 11.07.05 10:39
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, c-smile, Вы писали:


CS>>Можешь изложишь еще раз что такое "закрыть"?


IT>Re[6]: const в D, требуется помощь клуба.
Автор: Kluev
Дата: 09.07.05


И что? В приведенном там примере не видно необходимости в использовании const_cast (тем более массовом — 15 из 30 раз ).
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[8]: const в D, требуется помощь клуба.
От: WolfHound  
Дата: 11.07.05 11:54
Оценка: +1
Здравствуйте, IT, Вы писали:

K>>А const позволяет все закрыть и грамотно все спроектировать. Конечно щас кое кто возразит что можно заюзать const_cast? но это уже не мои проблеммы. Почему бы сразу не заюзать format c:?

IT>Вот именно. Кто хочет тот добъётся. Так зачем тогда вообще всё это нужно?
А зачем тогда вобще типизация нужна? Назад к ассемблеру?
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[15]: const в D, требуется помощь клуба.
От: IT Россия linq2db.com
Дата: 11.07.05 16:17
Оценка: -1
Здравствуйте, Kluev, Вы писали:

IT>>Грамотнее уже дальше некуда.


K>Уважаемый IT я не понимаю на что ты жалуешься? Если ты юзаешь в С++ const_cast это значит что ты изучил классцы и знаешь что делаешь.


Знаешь что ты только что сказал? Примерно следующее. У нас есть классная фича в виде const, но иногда она не работает, поэтому у нас есть const_cast, стандартное средство для обхода классной фичи, а по сути грязный стандартизированный хак, встроенный непосредственный язык.

K>В С# вася пупкин напишет immutable-proxy и прийдется только через рефлекшн лезть в обход private (еще хуже чем конст_каст).


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

K>Или самому все переписать и кататся на своих собственных велосипедах.


Вот-вот. Так обычно и происходит с черезчур "грамотным проектированием".

K>Проблема не в констах а в вася-пупкиных. Только в С++ проще — написал const и спи отдыхай. А в С# прийдется пыхтеть для каждого класса readonly-прохор писать. Или вообще забить на константность. Только это тоже не выход. Забиваем на константноть потребуется писть доку: что можно, а что нельзя. Забиваем на доку — нужен самодокументируемый внятный код. Иными словами троерожный бес — как не кинь всегда рогом вверх.А const позволяет все закрыть и грамотно все спроектировать.


Ты это расскажи всё тем кто пишет и использует .NET Framework. Расскажи им, что они все лохи, потому что не используют const и, главное, потом не обходят его с помощью const_cast.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[16]: const в D, требуется помощь клуба.
От: WolfHound  
Дата: 11.07.05 16:54
Оценка: 1 (1) +1
Здравствуйте, IT, Вы писали:

K>>Уважаемый IT я не понимаю на что ты жалуешься? Если ты юзаешь в С++ const_cast это значит что ты изучил классцы и знаешь что делаешь.

IT>Знаешь что ты только что сказал? Примерно следующее. У нас есть классная фича в виде const, но иногда она не работает, поэтому у нас есть const_cast, стандартное средство для обхода классной фичи, а по сути грязный стандартизированный хак, встроенный непосредственный язык.
const_cast это такойже грязный хак как добираться до приватных методов через рефлекшен.
У нас в .НЕТ есть такая мегафича как модификаторы доступа но иногда она не работает потомучто у нас есть стандартное средство для ее обхода.

IT>Ты это расскажи всё тем кто пишет и использует .NET Framework. Расскажи им, что они все лохи, потому что не используют const и, главное, потом не обходят его с помощью const_cast.

Я почти год пишу практически только под .НЕТ и могу сказать что авторы .НЕТ сильно облажались не введя модификатор const(с этим даже Влад согласен).
Из-за этого "гениального" решения мне несколько раз приходилось писать immutable proxy для того чтобы защититься от собственных случайных ошибок. Причем если в С++ это встроено в язык и не вызывает накладных расходов во в .НЕТ мне пришлось повозиться и смириться с мение понятным кодом который жрал ресурсы во время исполнения.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[17]: const в D, требуется помощь клуба.
От: IT Россия linq2db.com
Дата: 11.07.05 18:29
Оценка: +1 -1
Здравствуйте, WolfHound, Вы писали:

WH>const_cast это такойже грязный хак как добираться до приватных методов через рефлекшен.

WH>У нас в .НЕТ есть такая мегафича как модификаторы доступа но иногда она не работает потомучто у нас есть стандартное средство для ее обхода.

Только почему-то эту мегафичу хотят заиспользовать в основном те, кто раньше жить не мог без const_cast. Странное совпадение.

IT>>Ты это расскажи всё тем кто пишет и использует .NET Framework. Расскажи им, что они все лохи, потому что не используют const и, главное, потом не обходят его с помощью const_cast.

WH>Я почти год пишу практически только под .НЕТ и могу сказать что авторы .НЕТ сильно облажались не введя модификатор const(с этим даже Влад согласен).

Я уже три года пишу под .NET, а до этого с 88 по 2003 писал на C/C++ и всегда использовал const как завещал великий Страуструп. Но что забавно, под .NET я великолепно обхожусь без const и его отсутствие мне не досаждает. А вот на плюсах доводилось периодически материться. А так как я человек, не ищущий приключений на свою задницу в виде рефлекшинов и const_cast, то чаще всего приходилось выпиливать свои велосипеды.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[21]: const в D, требуется помощь клуба.
От: IT Россия linq2db.com
Дата: 11.07.05 18:55
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Я правильно тебя понял?

CS>Или я неправильно тебя понял?

Да

const очень неоднозначная конструкция. И очень часто решая одну проблему, порождает массу дргих. Соответствовать доказывать её экстраординарность глупо. Именно это я и хотел сказать.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[16]: const в D, требуется помощь клуба.
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.07.05 23:28
Оценка:
Здравствуйте, IT, Вы писали:

IT>Ты это расскажи всё тем кто пишет и использует .NET Framework. Расскажи им, что они все лохи, потому что не используют const и, главное, потом не обходят его с помощью const_cast.


Незнаю, но от readonly для внутренних переменных и содержимого массива я бы не отказался. Хотя конечно товарищи пропагандирующие const явно преувеличивают его необходимость.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[17]: const в D, требуется помощь клуба.
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.07.05 23:28
Оценка: +1
Здравствуйте, WolfHound, Вы писали:

WH>У нас в .НЕТ есть такая мегафича как модификаторы доступа но иногда она не работает потомучто у нас есть стандартное средство для ее обхода.


Оно, кстати, защитой регулируется. Настрой палитику и фига два ты доберешся до скрытых членов.

WH>Я почти год пишу практически только под .НЕТ и могу сказать что авторы .НЕТ сильно облажались не введя модификатор const(с этим даже Влад согласен).


Ты явно преувеличиваешь. Да и ключевое слово const тут не очень уместно. Но readonly для локальных переменных и содержимого массивов было бы поиметь очень приятно. Тут я с тобой согласен. Еще хорошо бы все же иметь некий механизм позволяющий инкапсулировать общение между двумя тесносвязанными классами (вроде држбы в плюсах) и для инкапсуяции части реализации класса. Но это все же не так критично как тут пояют артодоксальные плюсовики.

WH>Из-за этого "гениального" решения мне несколько раз приходилось писать immutable proxy для того чтобы защититься от собственных случайных ошибок. Причем если в С++ это встроено в язык и не вызывает накладных расходов во в .НЕТ мне пришлось повозиться и смириться с мение понятным кодом который жрал ресурсы во время исполнения.


Зато это намного более надежное решение, и как следсвие лучший дизайн.
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[22]: const в D, требуется помощь клуба.
От: c-smile Канада http://terrainformatica.com
Дата: 12.07.05 01:09
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, c-smile, Вы писали:


CS>>Я правильно тебя понял?

CS>>Или я неправильно тебя понял?

IT>Да


IT>const очень неоднозначная конструкция. И очень часто решая одну проблему, порождает массу дргих. Соответствовать доказывать её экстраординарность глупо. Именно это я и хотел сказать.


То что const не решает каких-то проблем известно.
В начальном послании я хотел узнать альтернативы. Они есть?

В любом случасе спасибо за участие.
Re[18]: const в D, требуется помощь клуба.
От: c-smile Канада http://terrainformatica.com
Дата: 12.07.05 01:14
Оценка: +2 :)
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, WolfHound, Вы писали:


WH>>У нас в .НЕТ есть такая мегафича как модификаторы доступа но иногда она не работает потомучто у нас есть стандартное средство для ее обхода.


VD>Оно, кстати, защитой регулируется. Настрой палитику и фига два ты доберешся до скрытых членов.


WH>>Я почти год пишу практически только под .НЕТ и могу сказать что авторы .НЕТ сильно облажались не введя модификатор const(с этим даже Влад согласен).


VD>Ты явно преувеличиваешь. Да и ключевое слово const тут не очень уместно. Но readonly для локальных переменных и содержимого массивов было бы поиметь очень приятно. Тут я с тобой согласен. Еще хорошо бы все же иметь некий механизм позволяющий инкапсулировать общение между двумя тесносвязанными классами (вроде држбы в плюсах) и для инкапсуяции части реализации класса. Но это все же не так критично как тут пояют артодоксальные плюсовики.


WH>>Из-за этого "гениального" решения мне несколько раз приходилось писать immutable proxy для того чтобы защититься от собственных случайных ошибок. Причем если в С++ это встроено в язык и не вызывает накладных расходов во в .НЕТ мне пришлось повозиться и смириться с мение понятным кодом который жрал ресурсы во время исполнения.


VD>Зато это намного более надежное решение, и как следсвие лучший дизайн.


В ответ на

VD>Как меня раздражает эта твоя "импелементации"... если бы ты знал.


Спешу заверить в аналогичном:

Ортодоксальные, и политику, доберешься ... и так далее

Ну сил нет просто.
Re[23]: const в D, требуется помощь клуба.
От: IT Россия linq2db.com
Дата: 12.07.05 01:58
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>То что const не решает каких-то проблем известно.

CS>В начальном послании я хотел узнать альтернативы. Они есть?

Не знаю Хотя... Например, в .NET строчку нельзя изменить. Нельзя! Вообще никак. Любые манипуляции над строкой всегда возвращают новый экземпляр. Поначалу напрягало, такие вещи воспринимались как дикость:

string s = "111";
s[1] = '2'; // error CS0200: Property or indexer 'string.this[int]' cannot be assigned to -- it is read only

Особенно в голову лезли всякие дурацкие мысли о производительности.

Сейчас как дикостью воспринимается обратная ситуация.

CS>В любом случасе спасибо за участие.


Дык, you are welcome!
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[18]: const в D, требуется помощь клуба.
От: IT Россия linq2db.com
Дата: 12.07.05 02:03
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Еще хорошо бы все же иметь некий механизм позволяющий инкапсулировать общение между двумя тесносвязанными классами (вроде држбы в плюсах)


internal — редкостная дрянь, впрочем не на много хуже чем friend в плюсах.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[17]: const в D, требуется помощь клуба.
От: IT Россия linq2db.com
Дата: 12.07.05 02:08
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Незнаю, но от readonly для внутренних переменных


А чем свойства не устраивают?

VD>и содержимого массива я бы не отказался. Хотя конечно товарищи пропагандирующие const явно преувеличивают его необходимость.


А как в строке сделан индексер?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[16]: const в D, требуется помощь клуба.
От: Kluev  
Дата: 12.07.05 07:07
Оценка: 1 (1)
Здравствуйте, IT, Вы писали:

IT>Знаешь что ты только что сказал? Примерно следующее. У нас есть классная фича в виде const, но иногда она не работает, поэтому у нас есть const_cast, стандартное средство для обхода классной фичи, а по сути грязный стандартизированный хак, встроенный непосредственный язык.


Во первых в этом несовершенном мире не может быть совершенных решений. Поэтому у const есть и достоинства и недостатки. Лично мне конст помогает избежать многих ошибок: имеешь read-only доступ к агрегатам класса, а модификация только через обьект владелец (пример я уже приводил). А "грязный хак" const_cast мне приходилось использовать всего два раза. Так то я не вижу никаких проблем и считаю критику конст необоснованой.

З.Ы. То что const нет в шарпе еще не повод его критиковать. Я вот попробовал на шарп перелезть и оказалось, что для меня он не подходит совершенно.Для моих задач основной тип данных — интрузивные списки, а шарп для их реализации может только copy-paste предложить. Т.к. интрузивные списки — это тот редкий случай когда нужно либо множественное наследование либо указатели на члены.
Re[18]: const в D, требуется помощь клуба.
От: WolfHound  
Дата: 12.07.05 08:01
Оценка:
Здравствуйте, IT, Вы писали:

IT>Только почему-то эту мегафичу хотят заиспользовать в основном те, кто раньше жить не мог без const_cast. Странное совпадение.

Я почемуто прекрасно обходился без const_cast. Что я делал не так?

IT>Я уже три года пишу под .NET, а до этого с 88 по 2003 писал на C/C++ и всегда использовал const как завещал великий Страуструп. Но что забавно, под .NET я великолепно обхожусь без const и его отсутствие мне не досаждает. А вот на плюсах доводилось периодически материться. А так как я человек, не ищущий приключений на свою задницу в виде рефлекшинов и const_cast, то чаще всего приходилось выпиливать свои велосипеды.

В С++ с const у меня ниразу небыло проблем. А под .НЕТ я уже несколько раз матерился из-за того что мне на ровном месте приходилось писать immutable proxy там где в С++ я просто напсал бы const.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[18]: const в D, требуется помощь клуба.
От: WolfHound  
Дата: 12.07.05 08:01
Оценка: +3
Здравствуйте, VladD2, Вы писали:

WH>>Из-за этого "гениального" решения мне несколько раз приходилось писать immutable proxy для того чтобы защититься от собственных случайных ошибок. Причем если в С++ это встроено в язык и не вызывает накладных расходов во в .НЕТ мне пришлось повозиться и смириться с мение понятным кодом который жрал ресурсы во время исполнения.

VD>Зато это намного более надежное решение, и как следсвие лучший дизайн.
Когда я в С++ помечаю методы модификатором const я фактически описываю интерфейс класса который содержит методы которые не могут менять содержимое класса.
Те примерно так
C++
class SomeClass
{
public:
    void Foo()
    {
    }
    void Bar() const
    {
    }
};

C#
interface ConstSomeClass
{
    void Bar();
}
class SomeClass : ConstSomeClass
{
    public void Foo()
    {
    }
    public void Bar()
    {
    }
}

Теперь использование
C++
void Test(const SomeClass& constObj)
{
    SomeClass& obj = const_cast<SomeClass&>(constObj);
}

C#
void Test(ConstSomeClass constObj)
{
    SomeClass obj = (SomeClass)constObj;//Аналог const_cast.
}


Итого: В С++ мы имеем поддержку языка что позволяет не писать дополнительных интерфейсов, правильность реализации константных методов контролирует компилятор...

А теперь объясни с какого перепугу решение на C# болие надежно?
Короче const рулит. Никаких аргументов против я до сих пор не услышал.
Единственное что смогли придумать это то что некоторые несознательные личности ставят const не там где он нужен. Но дело в том что таже проблема есть у модификаторов доступа и следуя этой логике нужно отменить private, protected, internal... оставляем все public и радуемся жизни
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[18]: const в D, требуется помощь клуба.
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.07.05 12:46
Оценка:
Здравствуйте, IT, Вы писали:

IT>А чем свойства не устраивают?


Под "внутренними" я понимаю "локальные" переменные и параметры.

Кстати, readonly не устраивает тем, что оно защищает переменную. В случае ссылки на массив оно не работет. Даже вводит в заблуждение:
class A
{
    readonly int[] _array = new int[] { 1, 2 };
    public void X()
    {
        _array[0] = 123; // OK :(
  }
}


IT>А как в строке сделан индексер?


Я как бы не против ООП-зашиты и все такое. Но расширенная семантика readonly явно каши не испортила бы.

Кстати, я бы еще ввел понятие immutable-класса. Чтобы контроль таких классов как string осуществлялся бы не разработчиком, а компилятором. А то ведь ничего не стоит по шибке залепить модифицирующий метод. Во втором фрэймворке ввели static-классы. Почему бы был не ввести immutable-классы?
... << RSDN@Home 1.1.4 beta 7 rev. 466>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[24]: const в D, требуется помощь клуба.
От: c-smile Канада http://terrainformatica.com
Дата: 12.07.05 16:07
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, c-smile, Вы писали:


CS>>То что const не решает каких-то проблем известно.

CS>>В начальном послании я хотел узнать альтернативы. Они есть?

IT>Не знаю Хотя... Например, в .NET строчку нельзя изменить. Нельзя! Вообще никак. Любые манипуляции над строкой всегда возвращают новый экземпляр. Поначалу напрягало, такие вещи воспринимались как дикость:


IT>
IT>string s = "111";
IT>s[1] = '2'; // error CS0200: Property or indexer 'string.this[int]' cannot be assigned to -- it is read only
IT>

IT>Особенно в голову лезли всякие дурацкие мысли о производительности.

IT>Сейчас как дикостью воспринимается обратная ситуация.


А если так?:

s[1] = '2';
s[2] = '3';
s[3] = '4';


Создастся три строки? Если нет то как это сделано?
reference counting?
Re[25]: const в D, требуется помощь клуба.
От: Павел Кузнецов  
Дата: 12.07.05 16:10
Оценка:
c-smile,

> IT>
> IT>string s = "111";
> IT>s[1] = '2'; // error CS0200: Property or indexer 'string.this[int]' cannot be assigned to -- it is read only
> IT>

> IT>Особенно в голову лезли всякие дурацкие мысли о производительности.
> IT>Сейчас как дикостью воспринимается обратная ситуация.

> А если так?:

>
> s[1] = '2';
> s[2] = '3';
> s[3] = '4';
>

> Создастся три строки?

Нет, это просто не скомпилируется: содержимое объекта System::String менять нельзя.
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[26]: const в D, требуется помощь клуба.
От: c-smile Канада http://terrainformatica.com
Дата: 12.07.05 16:36
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>c-smile,


>> IT>
>> IT>string s = "111";
>> IT>s[1] = '2'; // error CS0200: Property or indexer 'string.this[int]' cannot be assigned to -- it is read only
>> IT>

>> IT>Особенно в голову лезли всякие дурацкие мысли о производительности.
>> IT>Сейчас как дикостью воспринимается обратная ситуация.

>> А если так?:

>>
>> s[1] = '2';
>> s[2] = '3';
>> s[3] = '4';
>>

>> Создастся три строки?

ПК>Нет, это просто не скомпилируется: содержимое объекта System::String менять нельзя.


Mea culpa, проглядел комментарий
Да и знаю же сам про StringBuffer/Builder...
Re[17]: const в D, требуется помощь клуба.
От: vdimas Россия  
Дата: 14.07.05 19:04
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Из-за этого "гениального" решения мне несколько раз приходилось писать immutable proxy для того чтобы защититься от собственных случайных ошибок.


Угу, причем именно отдельных прокси-имплементаторов отдельных immutable интерфейсов.

Поначалу я посчитал себя шибко умным, сделал имплементацию некоего MyReadOnlyBase — класса, и в public сигнатурах использовал именно его. Однако, соседи за партой так же быстро приводили его к наследнику, типа:
(MyMutable)myReadOnlyBaseVariable;

Так что, остается именно так — полновесные прокси, с разделением на интерфейсы и реализации на ровном месте (где этого не требовалось).

А потом подумаешь малость... И придет к тебе еще более "просветленное" решение: "да нахрена это вообще надо, есть же юнит тесты... и их все-равно запускать"...

Привет, mainstream
Re[19]: const в D, требуется помощь клуба.
От: vdimas Россия  
Дата: 14.07.05 19:08
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, VladD2, Вы писали:


VD>>Еще хорошо бы все же иметь некий механизм позволяющий инкапсулировать общение между двумя тесносвязанными классами (вроде држбы в плюсах)


IT>internal — редкостная дрянь, впрочем не на много хуже чем friend в плюсах.


кстати, это единственный механизм реализации открытого immutable класса, при реально использующемся internal mutable-наследнике без дополнительного прокси.

Опять же, такая фича провоцирует на порождение множества мелких сборок.
Re[20]: const в D, требуется помощь клуба.
От: IT Россия linq2db.com
Дата: 14.07.05 19:16
Оценка:
Здравствуйте, vdimas, Вы писали:

V>кстати, это единственный механизм реализации открытого immutable класса, при реально использующемся internal mutable-наследнике без дополнительного прокси.


Проблемы начинаются когда ты такой класс начинаешь выносить из сборки. Тут сразу же появляются и прокси и другие подпорки
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[18]: const в D, требуется помощь клуба.
От: IT Россия linq2db.com
Дата: 14.07.05 19:24
Оценка:
Здравствуйте, vdimas, Вы писали:

V>А потом подумаешь малость... И придет к тебе еще более "просветленное" решение: "да нахрена это вообще надо, есть же юнит тесты... и их все-равно запускать"...


Вот-вот. Сначала нужно определиться с уровнем доверия к вызывающему коду, а уже потом строить от него всякие защиты.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[19]: const в D, требуется помощь клуба.
От: c-smile Канада http://terrainformatica.com
Дата: 15.07.05 05:45
Оценка: 39 (4) +3 :))) :))) :))
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, vdimas, Вы писали:


V>>А потом подумаешь малость... И придет к тебе еще более "просветленное" решение: "да нахрена это вообще надо, есть же юнит тесты... и их все-равно запускать"...


IT>Вот-вот. Сначала нужно определиться с уровнем доверия к вызывающему коду, а уже потом строить от него всякие защиты.


Уровень доверия... вона как...
Нужно тогда ввести в язык вместе с private, readonly и пр. конструкцию мамой_клянусь
или там в особо ответственных случаях мля_буду ...
Re[19]: const в D, требуется помощь клуба.
От: Павел Кузнецов  
Дата: 15.07.05 14:22
Оценка: +4
Здравствуйте, IT, Вы писали:

V>>А потом подумаешь малость... И придет к тебе еще более "просветленное" решение: "да нахрена это вообще надо, есть же юнит тесты... и их все-равно запускать"...


IT>Вот-вот. Сначала нужно определиться с уровнем доверия к вызывающему коду, а уже потом строить от него всякие защиты.


Это не защита, и уровень доверия здесь ни при чем. Это ближе к более ясному выражению своих намерений, и к переносу информации из комментариев в код, для того чтобы компилятор мог напоминать, например, о расхождениях в намерениях автора класса/функции и их пользователя.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[21]: const в D, требуется помощь клуба.
От: vdimas Россия  
Дата: 15.07.05 17:12
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, vdimas, Вы писали:


V>>кстати, это единственный механизм реализации открытого immutable класса, при реально использующемся internal mutable-наследнике без дополнительного прокси.


IT>Проблемы начинаются когда ты такой класс начинаешь выносить из сборки. Тут сразу же появляются и прокси и другие подпорки


К сожалению, они зачастую "невыносимы", т.е. даже подпорки иногда не помогают. Например, мы не можем подменить Nodes-collection в том же TreeView, да и во многих других аналогичных моментах. Сделать в своем наследнике прокси для Nodes — тоже фигушки, ибо не все события внутри него поддаются перехвату/обнаружению.
Re[17]: const в D, требуется помощь клуба.
От: vdimas Россия  
Дата: 15.07.05 17:20
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Незнаю, но от readonly для внутренних переменных и содержимого массива я бы не отказался.


Полностью поддерживаю насчет массивов. А то иначе у нас только 2 варианта:

1. Возвращать копию массива

2. Сделать ReadOnly — прокси массива...

Кстати, последний вариант выглядит вполне приемлимым для 2.0...
Re[20]: const в D, требуется помощь клуба.
От: Шахтер Интернет  
Дата: 16.07.05 00:32
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, IT, Вы писали:


IT>>Здравствуйте, vdimas, Вы писали:


V>>>А потом подумаешь малость... И придет к тебе еще более "просветленное" решение: "да нахрена это вообще надо, есть же юнит тесты... и их все-равно запускать"...


IT>>Вот-вот. Сначала нужно определиться с уровнем доверия к вызывающему коду, а уже потом строить от него всякие защиты.


CS>Уровень доверия... вона как...

CS>Нужно тогда ввести в язык вместе с private, readonly и пр. конструкцию мамой_клянусь
CS>или там в особо ответственных случаях мля_буду ...

А ещё -- никому не дам, дам только ему и его друзьям, дам всем и.т.п.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[27]: const в D, требуется помощь клуба.
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.07.05 18:57
Оценка:
Цитируй по меньше, плиз.
... << RSDN@Home 1.2.0 alpha rev. 577>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.