1

更新: この質問は、デザインの原則、エレガンス、意図の表現、特にデザインの選択によって他のプログラマーに送信される「シグナル」のコンテキストでお読みください。

オブジェクトのセットの 2 つの「ビュー」があります。1 つは、文字列値によってオブジェクトにインデックスを付けるディクショナリ/マップです。もう 1 つは、オブジェクトを序数 (順序付け整数) でインデックス付けするディクショナリ/マップです。オブジェクト数の信頼できる情報源として機能できるオブジェクト自体の「マスター」コレクションはありませんが、2 つの辞書には常にすべてのオブジェクトへの参照が含まれている必要があります。

新しいアイテムがセットに追加されると、参照が両方の辞書に追加され、オブジェクトの新しい合計数の影響を受けるいくつかの処理を行う必要があります。

オブジェクトのセットの現在のサイズを参照する信頼できる情報源として何を使用すればよいですか? 私のすべてのオプションには、ある次元または別の次元で欠陥があるようです. 辞書の 1 つを一貫して参照することはできますが、それは、その辞書が他の辞書よりも優れていることを示唆するものです。信頼できるリストとして機能するオブジェクトの単純なリストである 3 番目のコレクションを追加することもできますが、これにより冗長性が増します。実行中のカウントを格納するのは最も簡単に思えますが、冗長性も増し、コ​​レクションの自己追跡カウントをオンザフライで参照するよりも脆弱です。

より小さな悪を選択することを避けることができる別のオプションはありますか、それともエレガンスの妥協を受け入れる必要がありますか?

4

4 に答える 4

3

カプセル化をお勧めします。「管理」の詳細 (現在のカウントなど) を非表示にするクラスを作成し、それを使用して 2 つのコレクションの不変の「ビュー」を公開します。

クライアントは、コレクションの 1 つへの適切な参照を「manglement」オブジェクトに要求します。

コレクションに「用語」(より適切な言葉がないため) を追加するクライアントは、「manglement」オブジェクトを介して行います。

このようにして、仮定と実装の選択はサービスのクライアントから「隠され」、サイズ/カウントのコレクションの選択が任意であったことを文書化できます。将来のメンテナーは、クライアントを壊すことなく、カウントの管理方法を変更できます。

ところで、はい、私は「マングルメント」を意味していました - 管理のための私のお気に入りのマラプロピズム(どんな文脈でも!)

于 2008-11-21T19:32:42.107 に答える
3

(少なくとも) 2 つのコレクションを持つクラスを作成します。

  • 文字列でソートされたバージョンのコレクション
  • 序数でソートされたバージョンのコレクション
  • (オプション) マスター コレクション

このクラスは、核心的な管理を処理します。

  • コレクションのコンテンツの同期
  • 標準のコレクション アクション (例: ユーザーがサイズを取得できるようにする、アイテムを追加または取得する)
  • ユーザーが文字列または序数で取得できるようにする

そうすれば、いずれかの動作が必要な場所で同じコレクションを使用できますが、目的の「インデックス作成」動作を抽象化できます。

別のクラスは、このクラスの使用方法に関する意図を説明するための単一のインターフェイスを提供します。

于 2008-11-21T19:58:54.393 に答える
0

両方の辞書にすべてのオブジェクトへの参照が含まれている場合、カウントは両方で同じになるはずですよね? その場合は、1 つだけを選択し、一貫性を保ちます。

于 2008-11-21T19:27:10.620 に答える
0

大したことではないと思います。セットにアクセスする必要があるたびに、同じ順序でセットを参照するだけです。

あなたが本当にそれについて心配しているなら、パブリックインターフェースを公開するラッパーでコレクションをカプセル化することができます-のように

  • 追加(アイテム)
  • カウント()

このようにして、常に一貫性があり、アトミックになります-または、少なくともそのように実装できます。

でも、大したことではないと思います。

于 2008-11-21T19:33:33.120 に答える