この質問は多くの問題を提起すると思います。私は物事をできるだけ短くするように努めます:
単に存在しないIDを表す整数を言うことができます。
私の見解では、プログラムは問題の領域を表す(計算)モデルです(物理学者や天文学者が現象を表す方程式を書くことで類推することができます)。オブジェクトを使用してモデル化する場合、実行しているのは、特定のルールを使用してそのドメインの表現を作成することです。したがって、質問に戻ると、概念的には整数でIDを表すことができますが、問題のドメインには、適切に表されていない概念があります(たとえば、有効なIDではない整数があるため) )。また、概念的な問題に加えて、問題は、整数に新しい動作を追加(したがって委任)できないことです。可能であれば(たとえば、Smalltalkではすべてがオブジェクトであり、任意のクラスを拡張できます)、それも間違っています。モデリングの観点から。一般的な経験則として、特定の責任を負わないオブジェクトに動作を記述しなければならない場合、モデルには抽象化が欠けていると考えます。この場合、Util
クラスメソッドを持つクラスisValidId
。
オブジェクトを使用する場合、そのオブジェクトに有効なデータがあることを実際に知っています。そうでない場合、オブジェクトは作成されていないか(例外)、チェックする必要のある無効な状態になります。
100%同意します。私はあなたが役に立つと思うかもしれないこれについていくつかの記事を書きました(免責事項:私はQuanbitResearchで働いています)
この記事では、これに具体的なオブジェクトを使用するのは悪いことだと言っていますが、代わりにそれらのインターフェイスを渡す必要があります(ご存知のとおり)。(インターフェースではなく)具象型を変更すると、依存型が「故障」します。すべての場合にそうですか?
オブジェクト、タイプ、インターフェースに関する話はかなり長いです。少し要約すると、理想的には、具体的なクラスではなく、インターフェイスに対してプログラムする必要があります。これは、(理論的には)特定のオブジェクト(パラメーターなど)が事前定義されたセマンティクスを持つメッセージのセットを実装することだけに注意する必要があるためです。ただし、この道を進むと、実際には、1つのクラスが複数のインターフェイスを実装し、すべてのインターフェイスをクラスと同期させるための簿記が禁止されていることがわかります。私は通常、動的に型指定された言語を使用するため、これはほとんどの場合問題になりませんが、静的に型指定された言語で作業する必要がある場合は、システムがプロジェクト外のコードフォームとインターフェイスする必要があるときにインターフェイスを使用します。モジュール間のAPIで。言い換えれば、私はシステムの「境界」の結合を下げようとします。
これは、閉じた単一プロジェクト環境にも当てはまりますか?私は、インターフェースが(一度書かれると)触れられず、二度と変更/リファクタリングされない場合にのみ理解します。
私はここで反対しなければなりません。計算モデルであるプログラムは、問題領域の特定の時点で私たちが知っていることを反映しています。このように、私たちがそれに取り組むほど、私たちはそれについてより多くを知るようになります。プログラミングには学習が含まれ、学習するにつれて物事をよりよく理解します。したがって、モデルが変更されます。また、モデルが変更されると、モデルを表すために使用する要素も変更されます(クラスやインターフェイスなど)。時間が経つにつれて、モデルがより堅牢になり、概念の変更が遅くなり、ある時点で安定したモデルになることがわかります。しかし、変更はレイファクタリングであり、あなたが期待すべきものです:)。
HTH