18

I am looking at code that is essentially passing an id around, for example:

GetPersonById(int personId)

But instead of using an int, it used a PersonId object.

GetPersonById(PersonId personId)

The PersonId object is just an int with some hand-cranked code to make it nullable. So was this created in old .NET when nullable ints weren't available or is there a higher purpose for wrapping simple types in a class?

public sealed class PersonId {

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


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

    // and so on!
}
4

7 に答える 7

16

このようなDDDコードでは、この ID が参照する型をより明示的にするために使用されます。

特に適切に設計された集計のコンテキストでは、他の集計への参照は、オブジェクト参照ではなく ID によって行われることが非常に多いです。この場合、これらの ID 値オブジェクトを使用して、これらの ID が偶発的に混在することを回避し、前述のように、どの集計が参照されているかをより明確にすることができます。

于 2012-09-03T15:11:32.800 に答える
8

個人を識別するために使用されるフィールドを変更する必要がある場合、クラスを使用すると、さらなるリファクタリングを簡素化できます。明日、システムが人に届き、または文字列を使用してその人を識別しInt32.MaxValueたいとします。Int64もう 1 つのケースは、システムの要件が 100% 正確ではなく、ID、PIN、または考えられるフィールドの組み合わせによって個人が識別されるかどうかが指定されていない場合です。このコードの作成者は、このクラスを作成することで、大規模なリファクタリングを防ぐことができたかもしれません。

于 2012-09-03T15:15:58.367 に答える
5

答えはセマンティクスにもあります!

intあなたが何らかの価値を持っていると想像してください。それはIDですか?それとも、年齢、身長(cm)、気温(摂氏)、テレビ番組の数ですか?変数に適切な名前を付けることができますが、間違った場合は保護されません。

反対に、関数が だけでなく ID クラス インスタンス (まあ、int変装している) をint必要とする場合、誤って X 座標値を渡そうとしています (これはたまたま、またはintのインスタンスでもあります) 。Coordinate何でも)、コンパイラはそれをキャッチして警告します。それに加えて、コードを読んでいる人なら誰でも、必要な値が単なるint ではなく ID であることを明確に理解できます。

(補足: 度とラジアンの両方の角度を使用するコードをリファクタリングしようとして、どれほどの頭痛の種だったか想像できませんdouble! 悪夢でした! に切り替えた後class Angle、すべてがはるかに良くなりました。)

于 2012-09-03T19:45:57.610 に答える
2

This code was probably written in C# 1.0 when Nullable<T> didn't exist.

Now you should use int? instead.

于 2012-09-03T15:10:09.440 に答える
1

古い C# は、その 1 つの説明になります。
しかし、それには他の説明、将来の考え方があると思います...
将来、PersonIdクラス自体を変更するか、それを継承することにより、人により多くのデータを持ちたい場合、すべてのコードは引き続き正常に機能しますは。ただし、使用する場合はint?、すべての呼び出しを変更する必要があります。

于 2012-09-03T15:13:04.123 に答える
1

私にとっては、フレームワークの最も原始的なタイプを使用することが望ましいと思います。

-> メリットなし

于 2012-09-03T15:11:27.660 に答える
0

There is no benefit, except using value types as nullable. Nothing more.

于 2012-09-03T15:10:35.447 に答える