問題
データをモデル化する最善の方法がわかりません。現在のアプローチが過度に複雑になっているのではないかと心配しており、それを元にコードを作成する前に修正したいと考えています。
モデル化するデータ
50 以上の異なるデータ項目で構成されるデータ セットがあります。各項目は次のとおりです。
- 一意の識別子
int
- ラベル
String
. - 検証基準 (最小、最大、有効な文字など)。
- 値
Float
、Long
、Integer
、String
、またはDate
。
各項目のラベルと検証基準は、すべてのデータ セットで同じです。 値のみが動的です。順序は重要ではありません。
必要な使用例
データセットにデータを追加する
dataSet.put(itemIdentifier, value);
データ セット内のすべての非 null 値をトラバースして検証する
for (DataItem item : dataSet.values()) {
boolean valid = item.validate();
if (valid) {...}
}
指定されたデータ セット内の指定されたアイテムを表示します
public void displayData(List<DataSet> dataSets, int... itemsIdentifiers) {...}
実装の試み
Key
私の現在の実装には、マップへの「キー」として抽象クラスがあります。各タイプは、独自の検証ニーズに合わせてサブクラス化されます。次に、DataSet
クラス内で、public static
各アイテムのキーを持っています。
abstract public class Key {
public int mId;
public String mLabel;
public Key(int id, String label) {...}
abstract public boolean validate(Object Value);
}
public class FloatKey extends Key {
private int mMin, mMax;
public Key(int id, String label, int min, int max) {...}
public boolean validate(Object Value) {...}
}
// one for each type
...
public class DataSet {
public static Key ITEM_A = new FloatKey(1, "item A", 0, 100);
public static Key ITEM_B = new DateKey(2, "item B", "January 1, 1990");
// ~50 more of these
private Map<Key, Object> mMap;
public void put(int itemId, Object value) {...}
public Set<Object> values() {...};
...
}
から値を取り出すときに、DataSet
のようなことができるように、値とキーを保持する必要があるのは好きではありませんDataSet.ITEM_A.validate(someFloat)
。instanceof
また、状況によってはサブクラスのみのメソッドを呼び出す必要があるため、セット内のオブジェクトをトラバースするときに頻繁に使用およびキャストしていることに気付きます。
さらに明確にするための編集
データ項目とその検証基準は時折変更する必要があるため、メンテナンスは比較的簡単/無痛でなければなりません。
オブジェクト自体をキーとしてマップに使用することもできますが、
Key
これらのキーをBundle
(Android API の一部) に配置する必要がある場合があります。label
またはid
(ラベルが同じ場合) を使用して、Key
クラスを作成しないようにしParcelable
ます。