3

OOP 設計に関する質問があります。

最大値、最小値、頻度などのいくつかの数値スカラー プロパティを含むクラスがあるとします。データが継続的に流入しているため、最終的にはそのようなクラス インスタンスのリストになります。たとえば、グローバルな最小値を取得するには、リスト内のすべてのクラスをループして見つけます。

または、各プロパティのスカラーではなくリストと、リストをループする関数メンバーを含む 1 つのクラス (おそらくシングルトン) をインスタンス化することもできます。ただし、このアプローチは、オブジェクト指向プログラミングよりも手続き型プログラミングに似たコードを生成するようです。

問題は次のとおりです。選択するアプローチを定義する基準は何ですか? 効率が重要な場合、各プロパティのリストを含むクラスを 1 つ選択する必要がありますか? 読みやすさが重要な場合、クラスのリストを選択する必要がありますか?

提案をありがとう。

4

5 に答える 5

1

基本的に、「構造の配列(AoS)」または「配列の構造(SoA)」​​を使用する方が望ましいかどうかを尋ねています。

答えは、このデータで何をする必要があるかによって異なります。構造体の配列よりも読みやすいコードを書きたい場合、SSE または CUDA を使用して計算量の多いコードを最適化したい場合は、配列の構造体を使用します。

「Array of Structures (AoS)」および「Structure of Arrays (SoA)」という用語を文献で検索すると、このトピックに関する多くの詳細な論文が見つかります。いくつかの議論をここにリンクします。

于 2013-05-26T21:19:16.747 に答える
1

あなたは判断基準を求めていました。1つお勧めします:

アプリケーションのデータ ポイントを構成するものについて考える必要があります。値を測定していて、1 つのデータ ポイントが複数の数値プロパティで構成されているとします。次に、クラスが一緒になるすべてのプロパティを表すクラスのリストが必要になることは間違いありません (適切な用語がないため、「データ ポイント」と呼びました)。

長期間にわたってグローバルな最小値を見つけるなど、これらの「データ ポイント」の集計を実行する必要がある場合は、このための追加のコンポーネントを設計することをお勧めします。したがって、主に「クラスのリスト」で構成されるデータ収集コンポーネントと、さまざまなデータ構造を利用する可能性があるが「クラスのリスト」の一部を処理する集計コンポーネントになります (たとえば、グローバル最小値が見つかります)。

于 2013-05-26T21:32:22.110 に答える
0

基本的に、OOP はプログラミングのすべての問題に対する解決策ではありません。問題に集中しなければならないということです。効率はより好ましいはずです。しかし、コードの読み込みに時間がかかりすぎたり、時間の複雑さが高すぎると言える場合は、やはり問題が発生します。両端を手に持つようにしておく必要があります。私が好むのは、リストのクラスではなく、クラスのリストです。しかし、人によって考え方が違うので、尊重しなければなりません。クラスのリストを選択する理由は、各オブジェクトに尊重されるデータがあるためです。多くの時間がかかります。

于 2013-05-26T21:09:11.033 に答える
0

値と統計を 1 つのクラスにまとめて格納し、新しい値を追加するときにその場で計算を行うこともできます (Java の例)。

public class YourClass {
    private List<Integer> values = new ArrayList<Integer>();

    private long sum = 0;
    private int minimum = Integer.MAX_VALUE;
    private int maximum = Integer.MIN_VALUE;
    // add more stuff you need

    public synchronized void add(Integer value) {
        values.add(value);
        sum += value;

        if (value < minimum) {
            minimum = value;
        }

        if (value > maximum) {
            maximum = value;
        }
    }

    public List<Integer> getValues() {
        return Collections.unmodifiableList(values);
    }

    public long getSum() {
        return sum;
    }

    public long getAvg() {
        return values.isEmpty() ? 0 : sum / values.size();
    }

    public int getMaximum() {
        return maximum;
    }

    public int getMinimum() {
        return minimum;
    }
}
于 2013-05-27T03:32:34.987 に答える