powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Хорошая ли идея - перегрузить операторы == и != в базовом Entity?
15 сообщений из 15, страница 1 из 1
Хорошая ли идея - перегрузить операторы == и != в базовом Entity?
    #37305388
NHibernate_User_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день,
По примеру из книги 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
Хорошая ли идея - перегрузить операторы == и != в базовом Entity?
    #37305416
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Идея априори безумная и неочевидная, особенно в разрезе ID.
...
Рейтинг: 0 / 0
Хорошая ли идея - перегрузить операторы == и != в базовом Entity?
    #37305528
OVoronov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно что имелось в виду про безумность id?
...
Рейтинг: 0 / 0
Хорошая ли идея - перегрузить операторы == и != в базовом Entity?
    #37305824
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OVoronovСобственно что имелось в виду про безумность id?
Неочевидность, я ж написал. По всем библейским канонам сравнивать экземпляры классов нужно вовсе не так.
...
Рейтинг: 0 / 0
Хорошая ли идея - перегрузить операторы == и != в базовом Entity?
    #37305872
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NHibernate_User_,

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

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

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

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

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

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

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

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


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

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

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

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


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