Какая польза при упаковке простого типа в классе?

Я просматриваю код, по существу проходящий идентификатор, например:

GetPersonById(int personId)

Но вместо использования int он использовал объект PersonId.

GetPersonById(PersonId personId)

Объект PersonId - это просто int с некоторым кодовым кодом, чтобы сделать его нулевым. Так было ли это создано в старом .NET, когда nullable ints недоступны или есть более высокая цель для упаковки простых типов в классе?

public sealed class PersonId {

    private PersonId() {
        _isNull = true;
        _value = 0;
    }


    private PersonId(int value) {
        _isNull = false;
        _value = value;
    }

    // and so on!
}

Ответы

Ответ 1

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

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

Ответ 2

Использование класса - хороший способ упростить дальнейший рефакторинг, если поля, используемые для идентификации человека, должны измениться. Предположим, что завтра система достигнет Int32.MaxValue людей, и вы хотите использовать Int64 или строку для их идентификации. Другим случаем было бы, когда требования к системе не были бы на 100% точными, и они не указали, будет ли человек идентифицирован идентификатором, ПИН-кодом или любой комбинацией полей, о которых вы можете думать. Автор этого кода мог бы хотя бы предотвратить основной рефакторинг, создав этот класс.

Ответ 3

Ответ также может быть семантикой!

Представьте, что у вас есть значение int. Это ID? Или это возраст, высота в см, температура в стоградусном, количество телевизионных программ? Ну, вы можете дать хорошее имя переменной, но это не защитит вас, если вы допустили ошибку.

Напротив, если для функции требуется экземпляр класса ID (который, ну, int скрыт), а не только int, но вы пытаетесь передать значение X-координаты по ошибке (что происходит с be int, или экземпляр Coordinate, или что-то еще), компилятор поймает его и предупредит. И кроме того, любой, кто читает код, может ясно видеть, что необходимое значение не просто int, а ID - вы не можете сделать это лучше с документацией, никто его не читает.

(Боковое замечание: вы не можете себе представить, сколько головной боли я пытался реорганизовать код, который использовал double для углов в градусах и радиан! Это был кошмар! После перехода на class Angle все прошло намного лучше.)

Ответ 4

Этот код, вероятно, был написан в С# 1.0, когда Nullable<T> не существовало.

Теперь вы должны использовать int?.

Ответ 5

Для меня, я думаю, предпочтительнее использовать самые примитивные типы фреймворка.

- > Нет преимуществ

Ответ 6

Старый С# может быть одним из объяснений. но я бы предположил, что это может иметь другое объяснение, будущее мышление...
Если в будущем вы захотите получить больше данных для человека, изменив сам класс PersonId или наследуя его, весь код будет работать нормально, как есть. но если вы будете использовать int?, вам придется изменить все вызовы.

Ответ 7

Нет никакой пользы, за исключением использования типов значений как обнуляемых. Ничего больше.