Re[5]: И снова про константность
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.12.05 19:04
Оценка:
Здравствуйте, Дарней, Вы писали:

Д>неизменяемость — это свойство ссылки на объект, а не самого объекта


Уверен? А как же string, DateTime и т.п.?

Ну, а неизменяемость ссылки можно добиться банальной инкапсуляцией. Используй свойства без сеттеров и будет тебе щастье.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: И снова про константность
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.12.05 19:04
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

VD>>И это при том, что все что унжно можно смело контролировать во врмемя компиляции.


ANS>нельзя.


Серьезный аргумент.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: И снова про константность
От: Дарней Россия  
Дата: 06.12.05 02:43
Оценка:
Здравствуйте, VladD2, Вы писали:

Д>>неизменяемость — это свойство ссылки на объект, а не самого объекта


VD>Уверен? А как же string, DateTime и т.п.?


это просто особенности .NET-ной реализации
небольшой реверанс в сторону ФЯ
на самом же деле есть два подхода к этому вопросу
первый — это как раз ФЯ, где все объекты неизменяемы, а при необходимости изменить данные создается копия
второй — это обычный подход ИЯ, где разрешение или запрещение модификации объектов управляется ссылками на них, как например в C++

void foo(int& x)
{
  a = 5;
}
void bar(const int& x)
{
  a = 10; // хрен вам! :)
}

int a = 0;
foo(a);
bar(a);


VD>Ну, а неизменяемость ссылки можно добиться банальной инкапсуляцией. Используй свойства без сеттеров и будет тебе щастье.


заводить дополнительный неизменяемый интерфейс? я так и делаю, когда припрет. Другой вопрос, что
1. Это все равно костыли
2. Требует дополнительного ручного кодирования
полагаю, что такой распространенный паттерн следовало бы встроить в яызк
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[15]: И снова про константность
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 06.12.05 07:24
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>>>И это при том, что все что унжно можно смело контролировать во врмемя компиляции.


ANS>>нельзя.


VD>Серьезный аргумент.


Твоя школа

А если, серьёзно, то проверку времени компиляции, можно использовать только во время компиляции, а ошибку времени выполнения, можно и во время выполнения. Пример, использования при работе с некой БД я как раз и привёл.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[7]: И снова про константность
От: GlebZ Россия  
Дата: 06.12.05 09:46
Оценка:
Здравствуйте, Дарней, Вы писали:

Д>это просто особенности .NET-ной реализации

Д>небольшой реверанс в сторону ФЯ
Это реверанс в сторону дефрагментирующего GC. Он не очень любит изменяемые по длине массивы.

С уважением, Gleb.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[16]: И снова про константность
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.12.05 23:26
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

VD>>>>И это при том, что все что унжно можно смело контролировать во врмемя компиляции.


ANS>>>нельзя.


VD>>Серьезный аргумент.


ANS>Твоя школа


ANS>А если, серьёзно, то проверку времени компиляции, можно использовать только во время компиляции, а ошибку времени выполнения, можно и во время выполнения. Пример, использования при работе с некой БД я как раз и привёл.


Мы все еще ведем речь о константности? Причем тут БД?

Еще раз. Что мне потенциально помешает переложить контроль изменения объектов на джит? Предположим, что у каждого метода есть признак того что он не изменяет содержимое экземпляра и параметров. Далее остается только проверить, что все код обращающися к экземпляру вызвает только такие методы и не пытается самостоятельно изменить содержимое экземпляра.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[17]: И снова про константность
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 07.12.05 07:09
Оценка:
Здравствуйте, VladD2, Вы писали:

ANS>>А если, серьёзно, то проверку времени компиляции, можно использовать только во время компиляции, а ошибку времени выполнения, можно и во время выполнения. Пример, использования при работе с некой БД я как раз и привёл.


VD>Мы все еще ведем речь о константности? Причем тут БД?


VD>Еще раз. Что мне потенциально помешает переложить контроль изменения объектов на джит? Предположим, что у каждого метода есть признак того что он не изменяет содержимое экземпляра и параметров. Далее остается только проверить, что все код обращающися к экземпляру вызвает только такие методы и не пытается самостоятельно изменить содержимое экземпляра.


Ничего, кроме того, что для убеждения в том, что метод объект не меняет, частенько нужно будет этот метод выполнять. В конкретном контексте, естественно.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[15]: И снова про константность
От: jazzer Россия Skype: enerjazzer
Дата: 07.12.05 11:21
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Вот, дума, именно такие примеры и подталкнули разработчиков C# выкинуть const к чертям. Чтобы люди не тратили время на решение подобных шарад.


Влад, вот ты ведь умный квалифицированный программист, и С++ знаешь, так чего ж говоришь такие флеймовые глупости?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: И снова про константность
От: jazzer Россия Skype: enerjazzer
Дата: 09.12.05 09:07
Оценка: +1
Здравствуйте, VladD2, Вы писали:

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


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


Ничему оно не противоречит, ибо ортогонально.

Простой пример из жизни — всеми любимый Microsoft Word.
Когда ты открываешь файл из диалога File -> Open, ты можешь нажать как кнопочку Open, так и кнопочку Open Read-Only, а также Open as Copy.

const в С++ — это именно та самая кнопочка Open Read-Only.
Декларация о намерениях пользователя и о его желаниях работать с объектом определенным образом (в данном случае — получая гарантии, что объект изменить не удастся, даже если он и неконстантный по сути).


Еще пример — файл в файловой системе, доступный для изменения одним пользователям и недоступный другим.
Никакого отношения к intrinsic неизменяемости самого файла (потому что она зависит совершенно от других вещей, например, от того, что файл находится на CD, а не на винте) способ доступа не имеет. Очевидно, что файл, лежащий на винте, является изменяемым, его можно стереть и еще много всяких вкусностей сделать.Однако если ты не хочешь, чтобы файл был случайно изменен, ты повесишь на него флажок read-only и получишь искомые гарантии от файловой системы, аналогичные гарантиям, которые получает программист C++ от компилятора, используя const. При этом файл вполне может оставаться не read-only для других пользователей.

Продолжать примеры? Рассказать про GRANT в SQL?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[5]: И снова про константность
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.12.05 02:38
Оценка: -1
Здравствуйте, jazzer, Вы писали:

J>Простой пример из жизни — всеми любимый Microsoft Word.

J>Когда ты открываешь файл из диалога File -> Open, ты можешь нажать как кнопочку Open, так и кнопочку Open Read-Only, а также Open as Copy.

Ворд фиговая аналогия. Он говорят на чистом С написан.

Что же до этого дела, то эти варианты могут быть организованы созданием разных обхектов или примененеием паттернов.

J>const в С++ — это именно та самая кнопочка Open Read-Only.


Ненадо провдить столь тонких аналогий со столь разными вещами.

J>Декларация о намерениях пользователя и о его желаниях работать с объектом определенным образом (в данном случае — получая гарантии, что объект изменить не удастся, даже если он и неконстантный по сути).


С точки зрения объекта именно он должен управлять своим состоянием. Если у того же документа ворда есть понятие Read-Only, то он должен генерировать исключения или возвращать код ошибки при попытке вызвать метод записи на диск. Но при этом сам документ остается редактируемым. Я могу изменить его как хочу и записать под другим именем.

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

J>Еще пример — файл в файловой системе, доступный для изменения одним пользователям и недоступный другим.


Ну, вот и представь себе. Есть объект отвечающий за открытый файл. В общекте вроде как запись совершить нельзя. Но отвечает за это один флаг. Так вот переменная указывающая на этот объект говорит, что я не могу менять этот флаг (да и весь объект), но я беру и делаю тайп_каст... в итоге я меняю флаг и пишу в защещенный от записи файл. Для С++ ситуация может и нормальная. Моле нефига объект держать в том же процессе ОС. А для управляемого кода ситуация не допустимая. Так что если этот const нельзя проконтролировать везде, то это уже не хорошее решение — дырка.


J>Продолжать примеры? Рассказать про GRANT в SQL?


Не стоит. Эти уже не состоятельны. Вообще делая столь далекие аналогии можно даже не напрягаться. Все равно ни на что кроме красноречия не годятся.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: И снова про константность
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.12.05 02:38
Оценка:
Здравствуйте, jazzer, Вы писали:

VD>>Вот, дума, именно такие примеры и подталкнули разработчиков C# выкинуть const к чертям. Чтобы люди не тратили время на решение подобных шарад.


J>Влад, вот ты ведь умный квалифицированный программист, и С++ знаешь, так чего ж говоришь такие флеймовые глупости?


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

В C#, как не странно это уже кое как проявилось. В нем есть ключевое слово readonly которое можено применять к полям. Однако означает оно именно константность полей (переменных, значит). Так что одна из забавных ошибок выглядит так:
class A
{
    public readonly int[] Array = new int[10];
}
...
A a = new A();
a.Array[0] = 1; // типа не сработает, так как readonly.

В итоге используется это readonly раз в год, а объяснять разным орлам, "почему не сработало ваше земное притяжение" (с) Альф приходится постоянно.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[18]: И снова про константность
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.12.05 02:38
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

ANS>Ничего, кроме того, что для убеждения в том, что метод объект не меняет, частенько нужно будет этот метод выполнять. В конкретном контексте, естественно.


Ерунду не говори. Чтобы понять что метод не меняет содержимое параметров достаточно проанализировать его мсил.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[19]: И снова про константность
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 12.12.05 07:25
Оценка:
Здравствуйте, VladD2, Вы писали:

ANS>>Ничего, кроме того, что для убеждения в том, что метод объект не меняет, частенько нужно будет этот метод выполнять. В конкретном контексте, естественно.


VD>Ерунду не говори. Чтобы понять что метод не меняет содержимое параметров достаточно проанализировать его мсил.


if (bFlag) 
    setValue(value);
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[20]: И снова про константность
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.12.05 14:22
Оценка: +1
Здравствуйте, Andrei N.Sobchuck, Вы писали:

VD>>Ерунду не говори. Чтобы понять что метод не меняет содержимое параметров достаточно проанализировать его мсил.


ANS>
ANS>if (bFlag) 
ANS>    setValue(value);
ANS>


И что? Если есть ссылка на метод модифицирующий состояние, значит все... метод уже не является константным. Анализ не может основываться на состоянии объекта.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[21]: И снова про константность
От: Andrei N.Sobchuck Украина www.smalltalk.ru
Дата: 12.12.05 15:00
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>И что? Если есть ссылка на метод модифицирующий состояние, значит все... метод уже не является константным. Анализ не может основываться на состоянии объекта.


Ну! А я тебе о чем говорю?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Я ненавижу Hibernate
Автор: Andrei N.Sobchuck
Дата: 08.01.08
!
Re[22]: И снова про константность
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.12.05 20:36
Оценка:
Здравствуйте, Andrei N.Sobchuck, Вы писали:

VD>>И что? Если есть ссылка на метод модифицирующий состояние, значит все... метод уже не является константным. Анализ не может основываться на состоянии объекта.


ANS>Ну! А я тебе о чем говорю?


Я не понял о чем ты говоришь, но анализу это не мешает. Если такой код есть, то метод помечается как модифицирующий состояние и все дела.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.