2012-03-03 7 views
1

私は、各行が同じ階層のオブジェクトの属性を表すカーソルを持っています。これらのオブジェクトは同じクラスではありません。各行は、単一の階層からサブクラスをインスタンス化するために使用されます。カーソルには、インスタンス化する具体的なサブクラスを決定する 'type'列が含まれています。各サブクラスは、カーソルからの共通の列のセットと、その特定のサブクラスに固有の列のセットの値を必要とします。一部の列は一部の行に適用され、他の列には適用されません。カーソルから共通フィールドと型固有フィールドを抽出するパターン

私はコードをきれいに保ちながら、私の解析コードに重複を避けたいと思います。これまでのところ、私はいくつかのアプローチをおもちゃにしました、いずれも、理想的なようだ:

  1. は、追加の列を引き出すために、すべての共通の列を引き出すタイプを検査し、そのを使用して、単一のファクトリメソッドを持っていますクラスをインスタンス化します。プロ:重複なしCon:1つの大きな醜いメソッド

  2. タイプの列だけを使用して選択された各タイプのファクトリメソッドがあります。プロ:非常に簡単なコードを維持するのが簡単です。Con:毎回共有列を引き出すコードを複製します。

  3. 共有列から値を取り出して、それぞれの型の他のファクトリメソッド。プロ:重複しない、かなり近くCon:パラメータの多いたくさんのメソッド。

  4. Cursorをとるオブジェクトのコンストラクタが含まれています。サブクラスは必要なものを抽出し、カーソルをスーパーに渡して共通のものを取得します。プロ:非常にコンの近く:カプセル化を破る。カーソルの問題

これは頻繁にトリミングだろうと私は本当に良く上記概説されたものよりもソリューションの聞きしたいのですが、問題のように感じているからコンストラクタでのリスクを紹介します。または、これはちょうどコードを解析しているので、醜いコードを解析していますか?

+0

オブジェクトのインスタンス化と初期化を構成する要素について詳しく説明できますか?オブジェクトのコンストラクタにパラメータ(一般的なものを含む)を渡すか、引数なしのコンストラクタとコールセッタを持つオブジェクトを作成しますか? – Fixpoint

+0

良い質問 - 各サブクラスのコンストラクタには長いパラメータリストがあります。すべてに共通のパラメータとサブクラスに固有のものが含まれます。私はオブジェクトが不変であることが意図され、ほとんどの場合、部分的に初期化されたオブジェクト(例えば、欠けている値のいずれか)が無効であるため、セッターを避けることができました。 – AndyK

+0

ここでは、正確さの利便性を犠牲にしています。 IMO、Javaなど、Androidの場合はこれが必ずしも良いとは限りません。 Javaでは、100%正しいコードを書くことはできません。より正確なコードを入手すればするほど、より多くの定型的で不思議なテクニックが必要になります。 – Fixpoint

答えて

0

おそらく、この:

注釈、彼らがデータを取得する必要があり、そこから列を使用してクラスのセッター。

カーソルを取得する方法は1つあります。 typeカラムの値に基づいてオブジェクトをインスタンス化します。結果のオブジェクトの注釈を調べて、各列に対して呼び出すセッターを決定します。

このリフレクションを実行時にスキップするには、ビルド時にカーソルから列の値を設定するメソッドを生成するツールを使用できます。 Something like thisがありますが、特定のニーズに合わせて調整する必要があります。

+0

うーん...これは面白いです、私はそれと一緒に遊びます。ありがとう! – AndyK

関連する問題