0

次のモデルを想像してください。

  • テーブルには多くの行があります
  • には多くのセルがあります

これらのクラスを「オブジェクト指向の方法」で処理するための好ましいインターフェースは何でしょうか?

1 - プロパティ/セルへのアクセスを提供します(必ずしも基になるデータ構造を公開する必要はありませんが、たとえばクラス RowCollection を作成します...)

my_table = new Table()
my_table.rows.add([1,2,3])
my_row = my_table.rows.get(0)
my_row.cells.get(0)
for(cell in my_row.cells) {}
...

2 - または、メソッドをTableおよびRowクラスに直接提供します

my_table = new Table()
my_table.add_row([1,2,3])
my_row = my_table.get_row(0)
my_row.get_cell(0)
for(cell in my_row.get_cells) {}
...

3 - 上記のいずれでもない...

4

5 に答える 5

1

答えは主に主観的なものだと思います。あなたの例では、クラスのメソッドまたはプロパティを提供して、行/列参照によって値を返すことが適切な場合があります。これらは同時に実装できます。

myClass.Row[x].Column[y]    
myClass.Column[y].Row[x]    
myClass.Cell[x,y]

データの「行」が有限である場合は、リストを直接公開する方がよいと判断することもできます。

myClass.SomeArrayOfValues[itemIndex]

「テーブル」や「行」などのフレーズを使用していることに気付いたので、クラスでデータベースまたは同様の構造を表現したいと思うかもしれませんが、そのようにデータを保存するのが効率的かもしれませんが、クラスのユーザーにとって、別の形式でデータを公開する方が理にかなっていることがわかります。

最終的に、これをどのように選択するかは、データ自体の目的とモデル化するシステムを反映するように設計する必要があり、ケースバイケースでのみ決定できます。

于 2010-01-12T12:12:58.970 に答える
1

「主なユースケースは値の追加、ソート、反復です」という使用法に関するコメントに基づいて、個々の要素を取得することはおそらく許可しませんが、代わりにユーザーに保存された要素に作用するファンクターを提供してもらいます。C++ で表現されます。

class Table
{
public:
    Table();
    //Table(unsigned int numberOfRows, unsigned int numberOfCells);

    void addRow();
    void addCell();

    //Throw exception if out of range or don't supply these functions if not needed by user.
    void removeRow(unsigned int rowNumber);
    void removeCell(unsigned int rowNumber, unsigned int cellNumber);

    //Iterate over entire table
    template<class Pred>
    void forEach(Pred pred);

    //Iterate over a specific row, throw exception if row is out of range.
    template<class Pred>
    void forEach(unsigned int row, Pred pred);
}

データの入力/更新を計画する方法に基づいて、追加/更新/削除の呼び出しを調整する必要があります。この設計は、要素のコレクションを操作することを強く目的としています。この設計の良い点は、テーブルを表現する方法の特定の基本構造にユーザーをコミットしないことです。これは、デメテルの法則と一致しています。

特定の個々の要素にアクセスする必要がある場合は、別のアプローチが必要になるか、ここで既に提供されているものの拡張になります。

于 2010-01-12T14:33:42.903 に答える
0

これは、行/セルにアクセスする方法によって異なります。

それを行う正しい方法は1つではありません。それらにアクセスする方法を決定し、オブジェクトを構築して、それらを消費したい方法で公開する必要があります。

于 2010-01-12T11:27:08.920 に答える
0

それはデータとそれを使って何をするつもりかによって大きく異なります。ユーザーは個々のセルを必要としますか?個々の行/列?行/列のサブセクション?

おそらく最もクリーンな方法は、ファンクターインターフェイスを提供することです。すべての要素、またはファンクターで定義されたサブセットでファンクターを実行する1つ以上の関数を提供します。

ユーザーがセルの複雑な組み合わせにアクセスする必要がある場合、これはうまく機能しない可能性があります。

于 2010-01-12T11:28:22.923 に答える