web-dev-qa-db-ja.com

サイズ型とインデックス型の難問

私が扱っているCまたはC++コードを記述しているとしましょう... OK、それを州の市民にしましょう。この状態では、市民は数値ID(文字列ではなく数値)を持っています。パフォーマンス、または他のソフトウェアとの互換性の理由から、2 ^ 32未満の市民が存在することが想定されています。

さて、私のコードには、市民の数値インデックスを取得または返す関数がたくさんあります。多数の市民(例:昨年市民として帰化した人々の数など)を取得または返すその他の機能。

私のジレンマはtypesに関係しています。私は:

  • サイズタイプを定義し、学生のインデックスと学生数の両方に使用しますか?
  • インデックスタイプを定義し、学生のインデックスと学生数の両方に使用しますか?
  • 実際には互いの単なるエイリアスであるにもかかわらず、両方を定義しますか?

また、どの名前を使用するかわかりません。これはcitizenにはなりません。学生を表すデータ型だからです。 citizen_indexまたはcitizen_index_tのようにすべきですか?では、サイズタイプはどうでしょうか。結局citizen_sizeではない...だから-num_of_citizensnum_citizens_t

私はこれを一貫して説得力があり、工夫されていない方法で実行したいのですが、私には悪いオプションしかないようです。何か不足していますか?

注:先に述べた制約のため、std::size_tだけを使用することはできません。

3
einpoklum

両方を定義します。それらに異なる名前を付けます。

primitive obsession のようなものを経験しています。 Idとcountは同じサイズであるという理由だけで同じタイプであるという考えを広めるのはとても魅力的です。しかし、それは間違いです。

これらはドメインのアイデアです。 xが3人の市民の数を保持し、3番目の市民のインデックスではないことを思い出すのに役立つより良い理由がない場合、彼らは彼ら自身の名前と独自のタイプに値します。 xの誤用を防ぐことが、強力な型を持つ理由です。

これらのタイプがあなたの言語にまだ存在しない理由は、言語デザイナーがあなたのドメインがどうなるかを知らなかったからです。したがって、intやstringなどの機能を提供する一方で、サイズに関係なく、独自の型を定義する機能も提供しました。

これはエンジニアリングを超えているように見えるかもしれませんが、ドメイン内では、これにより多くの保護と明確さが提供されます。ただし、それも限界です。多くの場合、制御するシステムの外部と通信し、ドメインタイプを知らないシステムが理解できる形式でドメインタイプを表現する必要があります。ブレークダウンして、Idとカウントが実際には32ビットであることを認めることができるのは、このときです。しかし、コードの大部分はそれを知る必要はありません。知らないはずです。気にしないでください。人口が増えれば、どちらがいいでしょう。

6
candied_orange