2017-11-10 5 views
0

C#で単純なスプレッドシートプログラムを実装しようとすると、次の問題が発生しました。メインクラスのフィールドにアクセスできる独立した静的パーサークラスを設計する

私がしようとしているのは、基本的にクラスCellのオブジェクトの配列であるTableクラスを持つことです。しかし私はすべてのユーザ入力を受け入れる別のParserクラスを実装したいと思います。しかし、Parserクラスのメソッドは、テーブルのセルにアクセスする必要があります。そして、私はそれがどのように実装されるべきかわかりません。

おそらく、より良いコードによって説明:私はそれを達成するための参照

class Cell 
{ 
    //fields 
} 

class Table 
{ 
    private Cell[,] cells; 
    public Cell At(int key); 
} 

static class Parser 
{ 
    public static Cell GetCellReference(string userInput) 
    { 
    //somehow 
    //return Table.At(parsedUserInput) 
    } 
} 

一つの方法は、ParserTableオブジェクトをインスタンス化することですが、それは明らかに、パーサクラス自体の目的に反し。私が見るもう1つの方法は、TableオブジェクトをParserのメソッドに渡すことですが、それは1つのTableインスタンスでのみ動作することが意図されているので妥当ではありません。継承はパーザとテーブルの間には適用されないように見えますので、私は自分自身が詰まっています。 OOPの基本原則に違反することなく目的を達成するために、デザインをどのように変更/修正する必要がありますか?

+0

「インテントは1つのテーブルインスタンスのみで作業することです」。つまり、[Singleton Pattern](https://en.wikipedia.org/wiki/Singleton_pattern)を使用し、 'Table.Instance'のようなインスタンスにアクセスすることを期待しています。それが正しい選択であるかどうかは分からない。それはあなたのシステムに関するより多くの情報を必要とするからだ。 – Vikhram

+1

パーサを表のインスタンスに書き出します。あなた自身のハードワイヤーを1つだけにしてはいけません。後で気をつける必要があるかもしれません(たとえば、スプレッドシートを一度にアクティブにしてください) – pm100

+0

@ pm100そうですね。しかし、確かにインスタンスが1つしかない場合はどうでしょうか? @Vikhramによって提案されているように、私がシングルトンパターンを使用していたら? – zoickx

答えて

1

私はあなたが、パーサーは、静的になりたい場合は、その後

public static class Parser 
{ 
    public ReturnType Parse(Table table,.....){..} 
} 

、その後

var res = Parser.Parse(myTable, widgetWoo, bar33); 
を行う

public class Parser 
{ 
    public Parser(Table table){..} 
    public ReturnType DoIt(....) {...} 
} 

、その後

var parser = new Parser(myTable); 
var res = parser.DoIt(widgetWoo, bar33); 

を持っているでしょう0

しかし、私は、パーサーは多くの内部状態を持つと感じています。非静的である方が良いです。

+0

私は、多くのテーブル、多くのパーサーを参照してください。それは良い解決策のようです。シングルトンの使用は質問にもっと直接答えますが、私はこれと一緒に行くつもりだと思います。ありがとう。 – zoickx

関連する問題