Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Хорошая ли идея - перегрузить операторы == и != в базовом Entity? / 15 сообщений из 15, страница 1 из 1
11.06.2011, 17:49
    #37305388
NHibernate_User_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хорошая ли идея - перегрузить операторы == и != в базовом Entity?
Добрый день,
По примеру из книги NHibernate CookBook делаю,
В некоторых местах уже используются == и !=, теперь они в классах-потомках Entity.
Ну и мысль возникает, не перенести ли это один раз в базовое Entity, ведь тогда все вроде как проще работать должно.
Есть подозрения, что == в базовом классе может вызывать какие-нибудь непредвиденные проблемы по сравнению с == в самом классе-потомке, с экземплярами и коллекцией которых мы работаем напрямую (с ними или с их прокси).

Плюсы (в этом же и минусы) - можно сравнивать любые два энтити (c одинаковым типом Id, т.к. там дженерик), хотя конечно если они не приводимы друг к другу, то пример из книжки CookBook считает их неравными.

Главный плюс, что если в новой Entity решим использовать операцию сравнения, то не надо будет заново все перегружать.
Хотя тут вроде минус, что сравнение напрямую (x == y) может привести к загрузке всех полей объекта, а сравнение по Id (x.id == y.id), если там были прокси, не приведет.

Вот что планируется сделать. Есть ли тут подводные камни? Принято ли перегружать == прямо у базового Entity?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
    public abstract class Entity<TId>
    {
        public virtual TId Id { get; set; }

        public override bool Equals(object obj)
        {
            return Equals(obj as Entity<TId>);
        }

        private static bool IsTransient(Entity<TId> obj)
        {
            return obj != null &&
            Equals(obj.Id, default(TId));
        }

        public virtual Type GetUnproxiedType()
        {
            return GetType();
        }

        public virtual bool Equals(Entity<TId> other)
        {
            if (other == null)
                return false;
            if (ReferenceEquals(this, other))
                return true;
            if (!IsTransient(this) &&
            !IsTransient(other) &&
            Equals(Id, other.Id))
            {
                var otherType = other.GetUnproxiedType();
                var thisType = GetUnproxiedType();
                return thisType.IsAssignableFrom(otherType) ||
                otherType.IsAssignableFrom(thisType);
            }
            return false;
        }

        public override int GetHashCode()
        {
            if (Equals(Id, default(TId)))
                return base.GetHashCode();
            return Id.GetHashCode();
        }

        public static bool operator ==(Entity<TId> object1, Entity<TId> object2)
        {
            if ((object)object1== null)
            {
                return ((object)object2== null);
            }
            else
            {
                return object1.Equals(object2);
            }
        }

        public static bool operator !=(Entity<TId> object1, Entity<TId> object2)
        {
            return !(object1 == object2);
        }
    }
...
Рейтинг: 0 / 0
11.06.2011, 18:58
    #37305416
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хорошая ли идея - перегрузить операторы == и != в базовом Entity?
Идея априори безумная и неочевидная, особенно в разрезе ID.
...
Рейтинг: 0 / 0
11.06.2011, 21:53
    #37305528
OVoronov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хорошая ли идея - перегрузить операторы == и != в базовом Entity?
Собственно что имелось в виду про безумность id?
...
Рейтинг: 0 / 0
12.06.2011, 14:35
    #37305824
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хорошая ли идея - перегрузить операторы == и != в базовом Entity?
OVoronovСобственно что имелось в виду про безумность id?
Неочевидность, я ж написал. По всем библейским канонам сравнивать экземпляры классов нужно вовсе не так.
...
Рейтинг: 0 / 0
12.06.2011, 17:34
    #37305872
SolYUtor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хорошая ли идея - перегрузить операторы == и != в базовом Entity?
NHibernate_User_,

не делайте того, что может и не пригодится. Если вам надо сравнивать 1-2 вида объектов, не надо переопределять == для базового класса всех классов. Мне это видится большой миной для будущих поколений.
...
Рейтинг: 0 / 0
12.06.2011, 20:20
    #37305943
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хорошая ли идея - перегрузить операторы == и != в базовом Entity?
NHibernate_User_,

отличная идея, ты эт EF просто переопредели сразу щоб не мучиться потом
...
Рейтинг: 0 / 0
13.06.2011, 10:21
    #37306271
NHibernate_User_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хорошая ли идея - перегрузить операторы == и != в базовом Entity?
Хорошо.

А как надо сравнивать экземпляры классов по библейским канонам?
...
Рейтинг: 0 / 0
13.06.2011, 22:12
    #37306997
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хорошая ли идея - перегрузить операторы == и != в базовом Entity?
Overriding Equals
...
Рейтинг: 0 / 0
14.06.2011, 10:27
    #37307260
NHibernate_User_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хорошая ли идея - перегрузить операторы == и != в базовом Entity?
Вообще, 3 варианта я вижу

1) Storage1 == Storage2 (перегруженная операция ==). Может быть перегружено == в самой entity, а может быть в базовом
2) Storage1.Id == Storage2.Id (У нас обычно именно так). Мы никогда не создаем по 2 новых сущности, таким образом, если один и равен 0, то второй точно не равен.
3) Storage1.Equals(Storage2) - неудобно, т.к. громоздкие скобки

Никак не пойму, какой конкретно вариант Вы предлагаете?
...
Рейтинг: 0 / 0
14.06.2011, 12:52
    #37307552
NHibernate_User_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хорошая ли идея - перегрузить операторы == и != в базовом Entity?
Тут обнаружил беду, т.е. при перегрузке Equals по методу из книги Nhibernate CookBook , оказывается, будет каждый раз считываться каждый элемент коллекции!!!
Это же страшно неэффективно! На каждый элемент пойдет запрос.

Автор NH же писал, что при обращении к this мы получаем внутренний объект (под прокси), а для создания этого объекта NH делает запрос. Я проверял в отладчике. Если просто написать x.id == y.id (или перегрузить == так, чтобы оно обращалось к id), то все в порядке, т.к. для доступа к id NH не нужно создавать внутренний объект у прокси и слать запрос.

Если же писать x==y, где реализация == вызывает Equals, или напрямую x.Equals(y), что к тому же и некрасиво и не наглядно, то идет лишний запрос.

Как же лучше быть? Сейчас смотрим образцы проектов, сделано везде по-разному.
...
Рейтинг: 0 / 0
14.06.2011, 14:59
    #37307876
NHibernate_User_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хорошая ли идея - перегрузить операторы == и != в базовом Entity?
Собственно, мой начальник уверен, что если == работает, то нет повода его не использовать. Другой вопрос - как его лучше реализовать внутри, сравнением Id или вызовом Equals?
...
Рейтинг: 0 / 0
14.06.2011, 22:05
    #37308390
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хорошая ли идея - перегрузить операторы == и != в базовом Entity?
NHibernate_User_Другой вопрос - как его лучше реализовать внутри, сравнением Id или вызовом Equals?
Говорю же, по ID - это неочевидно. Как уже высказались, - мина в чистом поле.
P.S. Абстрагируйтесь от задачи и попробуйте помыслить в разрезе ООП (как все адекватные люди): сравнение экземлляров классов через "=". Согласитесь, уже мурашки от такого гавноподхода бегают :)
P.S2. То, что дотнет нам даёт такую чудесную возможность как перегрузка операторов- замечательно. Например, для написания калькулятора с комплексными числами и иже. Но фанатизм нужно истреблять на корню.
...
Рейтинг: 0 / 0
21.06.2011, 17:14
    #37318428
NHibernate_User_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хорошая ли идея - перегрузить операторы == и != в базовом Entity?
То, что по ID неочевидно... имеется в виду сравнение по ID внутри Equals или явное сравнение по ID в программе?


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

Разве перегрузка операторов не в разрезе ООП?
...
Рейтинг: 0 / 0
22.06.2011, 08:33
    #37319207
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хорошая ли идея - перегрузить операторы == и != в базовом Entity?
NHibernate_User_имеется в виду сравнение по ID внутри Equals или явное сравнение по ID в программе?
Имеется ввиду перегрузка оператора для сравнения экземпляров класса.

NHibernate_User_Разве перегрузка операторов не в разрезе ООП?
Нет.
...
Рейтинг: 0 / 0
22.06.2011, 11:07
    #37319533
NHibernate_User_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хорошая ли идея - перегрузить операторы == и != в базовом Entity?
Код: plaintext
1.
Имеется ввиду перегрузка оператора для сравнения экземпляров класса.
Так она реализована через Equals.

То, что Equals включает в себя проверку по id, это желание авторов книжки по NHibernate и согласовано с авторами NH.
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Хорошая ли идея - перегрузить операторы == и != в базовом Entity? / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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