м-да
От: Pavel Dvorkin Россия  
Дата: 20.01.06 06:57
Оценка: +1 :))) :))) :))) :)))
Вот такое сейчас написал

if(a == b)
a = b;

Никакой ошибки здесь нет. Все так и должно быть.
Да здравствует перегрузка операций! Каким понятным она делает код!

Придется к этому хороший комментарий написать, а то ведь бог знает что могут подумать
With best regards
Pavel Dvorkin
Re: м-да
От: Mikhail Polykovsky Россия http://glader.ru
Дата: 20.01.06 07:06
Оценка:
PD>Придется к этому хороший комментарий написать, а то ведь бог знает что могут подумать

Напишите его сюда, пожалуйста.
Re: м-да
От: Черепнин Сергей Украина  
Дата: 20.01.06 07:08
Оценка: 1 (1) +5
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Вот такое сейчас написал


PD>if(a == b)

PD> a = b;

PD>Никакой ошибки здесь нет. Все так и должно быть.

PD>Да здравствует перегрузка операций! Каким понятным она делает код!

PD>Придется к этому хороший комментарий написать, а то ведь Бог знает что могут подумать


Если код выглядит глупо — значит ошибка проектирования.
Re: м-да
От: Кодёнок  
Дата: 20.01.06 07:34
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>if(a == b)

PD> a = b;

PD>Никакой ошибки здесь нет. Все так и должно быть.

PD>Да здравствует перегрузка операций! Каким понятным она делает код!

PD>Придется к этому хороший комментарий написать, а то ведь бог знает что могут подумать


Значит ты вложил какой-то странный смысл в одну из операций.
Re[2]: м-да
От: Pavel Dvorkin Россия  
Дата: 20.01.06 07:38
Оценка: -2
Здравствуйте, Черепнин Сергей, Вы писали:


ЧС>Если код выглядит глупо — значит ошибка проектирования.


Код совершенно верный. Смысл всего этого такой

if(a==b)
a= b;

b — "старый" экземпляр класса. a — только что сделанный новый экземпляр.

Сравнение (операция ==) идет по бизнес-полям. Кроме бизнес-полей, есть еще другие поля, которые в сравнении не участвуют, и именно так и должно быть. В старом экземпляре эти поля установлены (точнее, прочитаны из БД, например, identity). В новом — равны 0.

Таким образом, смысл такой

Если новый экземпляр в бизнес-смысле равен старому, то взять старый (т.е с прежними значениями не-бизнес полей).

Вот и все.
With best regards
Pavel Dvorkin
Re[2]: м-да
От: Mycopka Россия http://mhehue.info
Дата: 20.01.06 07:41
Оценка:
Здравствуйте, Кодёнок, Вы писали:

Кё>Значит ты вложил какой-то странный смысл в одну из операций.


Например сравнение по контенту, а присвоение по ссылке. Не виже большой странности, хотя удобочитаемость убийственная.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
---
With best regards и все такое :)
Re[3]: м-да
От: Кодёнок  
Дата: 20.01.06 07:52
Оценка: +1
Здравствуйте, Mycopka, Вы писали:

Кё>>Значит ты вложил какой-то странный смысл в одну из операций.


M>Например сравнение по контенту, а присвоение по ссылке. Не виже большой странности, хотя удобочитаемость убийственная.


Ну нельзя так. Это как если бы для умного указателя переопределить == на сравнение содержимого, а не указателей.
Re[3]: м-да
От: Шахтер Интернет  
Дата: 20.01.06 08:13
Оценка: 3 (3) +19
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, Черепнин Сергей, Вы писали:



ЧС>>Если код выглядит глупо — значит ошибка проектирования.


PD>Код совершенно верный. Смысл всего этого такой


PD>if(a==b)

PD> a= b;

PD>b — "старый" экземпляр класса. a — только что сделанный новый экземпляр.


PD>Сравнение (операция ==) идет по бизнес-полям. Кроме бизнес-полей, есть еще другие поля, которые в сравнении не участвуют, и именно так и должно быть. В старом экземпляре эти поля установлены (точнее, прочитаны из БД, например, identity). В новом — равны 0.


PD>Таким образом, смысл такой


PD>Если новый экземпляр в бизнес-смысле равен старому, то взять старый (т.е с прежними значениями не-бизнес полей).


PD>Вот и все.


В данном случае, всместо того чтобы замусоривать код коментариями, лучше
не перегружать ==, а использовать метод с осмысленным именем.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[4]: м-да
От: Pavel Dvorkin Россия  
Дата: 20.01.06 10:49
Оценка:
Здравствуйте, Шахтер, Вы писали:

Ш>В данном случае, всместо того чтобы замусоривать код коментариями, лучше

Ш>не перегружать ==, а использовать метод с осмысленным именем.

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

public override bool Equals(Object other)



А сооружать еще один метод с другим именем и таким же кодом я точно не буду.
With best regards
Pavel Dvorkin
Re[5]: м-да
От: Шахтер Интернет  
Дата: 20.01.06 12:03
Оценка: 2 (1) +7 -1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, Шахтер, Вы писали:


Ш>>В данном случае, всместо того чтобы замусоривать код коментариями, лучше

Ш>>не перегружать ==, а использовать метод с осмысленным именем.

PD>Ну в действительности там стоит как раз вызов метода с вполне осмысленным именем.


PD> public override bool Equals(Object other)


PD>


PD>А сооружать еще один метод с другим именем и таким же кодом я точно не буду.


Abuse.

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

Если же внешнее поведение разное, то мы имеем дело не с равенством, а с каким-то другим, болеее слабым отношением эквивалентности. Называть его словом Equals или == не стоит. Название должно отражать смысл данного отношения эквивалентности.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[2]: м-да
От: Sash_xp  
Дата: 20.01.06 12:06
Оценка:
Здравствуйте, Mikhail Polykovsky, Вы писали:

PD>>Придется к этому хороший комментарий написать, а то ведь бог знает что могут подумать


MP>Напишите его сюда, пожалуйста.



Наверное, если поля объектов равны сделать чтобы обе переменные ссылась на один объект. Или типа того.
Re[6]: м-да
От: Pavel Dvorkin Россия  
Дата: 20.01.06 12:59
Оценка:
Здравствуйте, Шахтер, Вы писали:

Ш>Abuse.


Ш>Два объекта должны считаться равными, если они обладают одинаковым внешним поведением.


Два объекта должны быть равными, если при включении элемента в множество (в данном случае ISet из Iesi.Collection) при том, что равный ему там уже есть, никакого включения не будет. Проверку на равенство ISet делает по Equals, как ему и положено.

Мне не надо, чтобы объект включался дважды в сет, если равный ему (в бизнес-смысле) объект там уже есть. Это приведет к серьезным проблемам при сохранении в БД.

Таким образом, Equals написана так мной, чтот она отражает равенство в бизнес-смысле. Никак иначе я ее написать не могу, иное поведение мне не нужно.

Ш>В этом случае заменять один другим бессмысленно.


Ш>Если же внешнее поведение разное, то мы имеем дело не с равенством, а с каким-то другим, болеее слабым отношением эквивалентности. Называть его словом Equals или == не стоит. Название должно отражать смысл данного отношения эквивалентности.


Должен ли я после этого написать специально еще одну функцию с тем же кодом, что и у Equals ?
With best regards
Pavel Dvorkin
Re: м-да
От: McSeem2 США http://www.antigrain.com
Дата: 20.01.06 14:18
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Вот такое сейчас написал


PD>if(a == b)

PD> a = b;

Мне время от времени приходится писать что-то типа:
if(a == 875) 
{
  a = a;
}

Угадайте с одного раза, для чего. Никакой перегрузки.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[2]: м-да
От: Аноним  
Дата: 20.01.06 14:23
Оценка: +1
Для отладки
Re[6]: м-да
От: McSeem2 США http://www.antigrain.com
Дата: 20.01.06 14:23
Оценка:
Здравствуйте, Шахтер, Вы писали:

Ш>Если же внешнее поведение разное, то мы имеем дело не с равенством, а с каким-то другим, болеее слабым отношением эквивалентности. Называть его словом Equals или == не стоит. Название должно отражать смысл данного отношения эквивалентности.


Отсюда вывод — перегруженные операции должны сохранять логический смысл исходных. Перегружать () для индексных операций — нельзя.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[2]: м-да
От: DuШes  
Дата: 20.01.06 14:23
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>Вот такое сейчас написал


PD>>if(a == b)

PD>> a = b;

MS>Мне время от времени приходится писать что-то типа:

MS>
MS>if(a == 875) 
MS>{
MS>  a = a;
MS>}
MS>

MS>Угадайте с одного раза, для чего. Никакой перегрузки.

давай подсказку
Re[7]: м-да
От: vitaly_spb Россия  
Дата: 20.01.06 14:36
Оценка:
PD>Таким образом, Equals написана так мной, чтот она отражает равенство в бизнес-смысле. Никак иначе я ее написать не могу, иное поведение мне не нужно.

Разумно было бы сделать метод а-ля CopyTo и писать не a=b а b.CopyTo(a)
...Ei incumbit probatio, qui dicit, non qui negat...
Re[3]: м-да
От: McSeem2 США http://www.antigrain.com
Дата: 20.01.06 14:46
Оценка:
Здравствуйте, DuШes, Вы писали:

MS>>Угадайте с одного раза, для чего. Никакой перегрузки.


DШ>давай подсказку


Не дам! Ня-ня-ня...
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[4]: м-да
От: Cyberax Марс  
Дата: 20.01.06 14:53
Оценка:
McSeem2 wrote:
> MS>>Угадайте с одного раза, для чего. Никакой перегрузки.
> DШ>давай подсказку
> Не дам! Ня-ня-ня...
Ээээ... Может чтобы проверить, что this — валиден?
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[2]: м-да
От: Dirichlet Россия  
Дата: 20.01.06 14:56
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>Вот такое сейчас написал


PD>>if(a == b)

PD>> a = b;

MS>Мне время от времени приходится писать что-то типа:

MS>
MS>if(a == 875) 
MS>{
MS>  a = a;
MS>}
MS>

MS>Угадайте с одного раза, для чего. Никакой перегрузки.

Чтобы поставить контрольную точку, на которой отладчик остановится, когда а будет равно 875. Контрольная точка ставится именно на строчку а = а.
Re[3]: м-да
От: Programmierer AG  
Дата: 20.01.06 15:00
Оценка:
Здравствуйте, Dirichlet, Вы писали:

D>Чтобы поставить контрольную точку, на которой отладчик остановится, когда а будет равно 875. Контрольная точка ставится именно на строчку а = а.

Бывают условные точки останова.
Re[4]: м-да
От: Dirichlet Россия  
Дата: 20.01.06 15:03
Оценка:
Здравствуйте, Programmierer AG, Вы писали:

PA>Бывают условные точки останова.


Я в курсе, спасибо . Я просто решил задачу.
Re[2]: м-да
От: Pavel Dvorkin Россия  
Дата: 23.01.06 07:52
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>Здравствуйте, Pavel Dvorkin, Вы писали:


MS>Мне время от времени приходится писать что-то типа:

MS>
MS>if(a == 875) 
MS>{
MS>  a = a;
MS>}
MS>

MS>Угадайте с одного раза, для чего. Никакой перегрузки.

Я то же самое порой пишу, только вот так

if(...)
{
int t=0;
}
With best regards
Pavel Dvorkin
Re[4]: м-да
От: Pavel Dvorkin Россия  
Дата: 23.01.06 07:53
Оценка:
Здравствуйте, Programmierer AG, Вы писали:

PA>Бывают условные точки останова.


Передайте им пламенный привет и наилучшие пожелания. При этом программа начинает работать в несколько раз медленнее.
With best regards
Pavel Dvorkin
Re[8]: м-да
От: Pavel Dvorkin Россия  
Дата: 23.01.06 07:56
Оценка:
Здравствуйте, vitaly_spb, Вы писали:

PD>>Таким образом, Equals написана так мной, чтот она отражает равенство в бизнес-смысле. Никак иначе я ее написать не могу, иное поведение мне не нужно.


_>Разумно было бы сделать метод а-ля CopyTo и писать не a=b а b.CopyTo(a)


void CopyTo(MyClass a)
{
this = a;
}

Так, что ли ? Это понятнее будет ?
With best regards
Pavel Dvorkin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.