Сравнение равенства значение фамилии объекта класса


Я задал этот вопрос вчера: сущность и значение объекта не являются частью Ubiqtious язык. Это должно остановить меня от их использования?.

Я изначально решил ввести ValueObject класса, как описано здесь: универсальные ценности равенства, в котором содержалось равенство методов для всех объектов, т. е. все ценности, унаследованные от ValueObject значение объекта класса. Однако, этот подход подвергся критике.

Пожалуйста, см. ниже код:

public sealed class Surname : IEquatable<Surname>
{
    private readonly string _value;
    public Surname(string surname)
    {
        if (surname.Length==0)
            throw new ArgumentException("Invalid value.", "Surname");
        this._value = surname;
    }

    public string Value
    {
        get { return _value; }
    }

    public static bool operator ==(Surname surname1, Surname surname2)
    {
        if (!ReferenceEquals(surname1, null) &&
            ReferenceEquals(surname2, null))
        {
            return false;
        }
        if (ReferenceEquals(surname1, null) &&
             !ReferenceEquals(surname2, null))
        {
            return false;
        }
        return surname1.Equals(surname2);
    }

    public static bool operator !=(Surname surname1, Surname surname2)
    {
        return !(surname1== surname2);
    }

    public bool Equals(Surname other)
    {
        if (other != null)
        {
            return _value == other._value;
        }
        return base.Equals(other);
    }

    public override bool Equals(object obj)
    {
        return Equals(obj as Surname);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            int hash = 17;
            hash = hash * 23 + _value.GetHashCode();
            return hash;
        }
    }
}

Это объект ДДД значение фамилии.

Я добавил некоторые методы для равенства и:

  1. Я хотел бы некоторую обратную связь по качеству их.

  2. Этот вопрос (ноль целых одна десятая) ссылки на презентации Эрик Эванс, где он появляется, чтобы советовать против введения равенства для лица. Целесообразно ли всегда сравнивать объекты по ссылке в эти дни?



154
1
задан 30 января 2018 в 06:01 Источник Поделиться
Комментарии
1 ответ

Я не вижу никаких преимуществ, что этот класс предоставляет более простой string. Я ожидаю Surname по крайней мере чувствительны к регистру, однако этот класс равенства точно так же, как если бы это была строка.

Я тоже не понимаю, почему вы изменить хэш-код строки? Вы могли бы просто вернуть, что _value возвращается... но снова, это будет такой же, как в одной обыкновенной string.

Взгляните на StringComparer.OrdinalIgnoreCase потому что это то, что вам действительно нужно... я думаю. Это имело бы смысл.

Насколько Surname обеспокоен, я также ожидаем, что он принесет true при сравнении "John" С " John ". Так что вы, возможно, захотите Trim значение.


Такого рода чувствительны к регистру обрезается строка такая обычная ситуация, что у меня есть специальный класс для этого. Это экономит много головной боли при работе такого рода данных.

5
ответ дан 30 января 2018 в 06:01 Источник Поделиться