0

要するに:

Java/Android アプリケーションの起動時に、ハードコードされた値で初期化されるデータの配列を検討してください。その後、実行時に、クラスはそのデータから読み取ることができます。アクセスする配列の正確な要素は、実行時のユーザー入力に依存します。

詳細に:

クロスワード アプリケーションを考えてみましょう。メイン画面から、プレイしたいクロスワードを選択します。クロスワード (クラス) は、複数の質問 (クラス) を作成します。質問を作成するには、'question' と 'answer' の 2 つの文字列で初期化します。クロスワードがすべての質問を作成するには、どの質問がそれに属しているかを知る必要があります。ユーザーがリストからクロスワードを選択すると、(おそらく) 多次元配列の要素インデックスにマップされる ID が渡されます。これにより、各外側配列は一連のクロスワード質問を表し、各内側配列はその中の質問を表します。クロスワード。以下のように:

Array(
// crossword 1
[0] => Array(
    // question 1
    [0] => Array(
        [0] => 'question'
        [1] => 'answer'
    )
    // question 2
    [1] => Array(
        [0] => 'question'
        [1] => 'answer'
    )
)
// crossword 2
[1] => Array(
    // question 1
    [0] => Array(
        [0] => 'question'
        [1] => 'answer'
    )
    // question 2
    [1] => Array(
        [0] => 'question'
        [1] => 'answer'
    )       
)

)

ユーザーがクロスワード 1 を選択したので、クロスワード オブジェクトを作成し、グローバル配列のインデックス 1 にアクセスして複数の質問オブジェクトを作成します。何かのようなもの:

Q1 = new Question(globalArr[1][0][0], globalArr[1][0][1]);
Q2 = new Question(globalArr[1][1][0], globalArr[1][1][1]);

私の質問:

これにはもっとエレガントな OOP ソリューションがあると思います (願っています)。あると仮定して、誰かが知識を共有していただければ幸いです。ここでシングルトン設計が機能しますか?

ここでの主な目標は、各質問に関するハードコーディングされた情報を、アプリケーション全体 (または少なくともクラス) からアクセスできるようにすることです。

4

3 に答える 3

1

どうですか:

  • メイン アイテム crossWords を CrossWord オブジェクトのシングルトン コレクションとして定義します。
  • CrossWord オブジェクトには Collection of Question オブジェクトが含まれています
  • Question オブジェクトには、質問と回答の 2 つのフィールドが含まれています

CrossWord 変数を使用して、ユーザーが選択した CrossWord を指すことができます。

CrossWord selectedCW = crossWords.get(index);

Q&A を追加するには、次を使用できます。

Question q = new Question();
q.setQuestion("question");
q.setAnswer("answer");
selectedCW.add(q);

またはオーバーロードされたコンストラクターによって:

selectedCW.add(new Question("question","answer"));

Java Collection Frameworkを調べて、最適なコレクションの実装を選択してください。

于 2013-11-04T10:47:20.040 に答える
1

Java でハードコードされた値を提供する一般的な (そしてほとんど汚い) 方法は、静的フィールドまたはデータ構造をクラスで宣言し、クラスローダーによって利用可能にすることです。ほとんどの場合、これがシングルトンの実装方法です。ただし、単一インスタンスの作成管理をクラスローダに委任するため (1 つの VM に複数のクラスローダが存在する可能性があります)、静的データのまったく同じインスタンスを常に使用するという保証はありません。したがって、これは複数のスレッド間でデータをやり取りするための良いレシピではありません。

Android でデータ/コンテンツを処理する正しい方法は、おそらく、Android コンテンツ プロバイダー API を使用してドメイン モデル (クロスワード) を実装にマップすることです。絶対に必要な場合は、ハードコードされた値を提供することもできます。

一般に、配列を使用せずに、適切な抽象型でドメインをモデル化します。それは間違いなくOOのやり方ではありません。

この本を読む: http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215/ref=sr_1_1?ie=UTF8&qid=1383562013&sr=8-1&keywords=domain+driven+design

于 2013-11-04T10:43:25.407 に答える
0

シングルトン パターンを使用して、この配列をクラスに配置できます。 http://en.wikipedia.org/wiki/Singleton_pattern

お気に入り

public class Question {
private Question() {}; // no one can create a instance
public final static Question INSTANCE = new Question();
private final Array[] array = ...

public getArray() {
return array;
}

スレッドの節約については、 http: //javarevisited.blogspot.de/2012/12/how-to-create-thread-safe-singleton-in-java-example.html を参照してください。

于 2013-11-04T10:45:52.130 に答える