特定のファイルからテキストを解析するクラスを作成しています。テキストにはいくつかの異なる「タイプ」があり、解析ルールはそれぞれ異なります。
たとえば、テキストのタイプの 1 つ (単に「プレーン テキスト」と呼びます) は、パーサーが余分な空白を取り除く単純な文字列です。たとえば、私が持っていた "The quick brown fox\r\njumped over the lazy brown dogs\r\n"
場合、パーサーは単純に戻り"The quick brown fox jumped over the lazy brown dogs"
ます (改行は単一のスペースに変換されます)。
他のテキストは、指定された区切り文字を持つテーブルを表すため、 のように見える場合があります"First Name,Last Name,DOB"
。パーサーの仕事は、コンマで区切られた各値を含む配列を返すことです。
(実際の実装はこれよりも複雑ですが、これは適切な単純化です)。
もともと私はTextType
、値PlainText
とTableText
. 次に、次のようなメソッドを作成できます
public string ParseText(string textToParse, TextType textType)
string
textType が PlainText の場合、戻り値は a である必要がありますが、textType が TableText の場合、戻り値はa である必要があるため、これが機能しないことにすぐに気付きましたstring[]
。
1 つのオプションは、常に string[] を返すことであり、PlainText が常にサイズ 1 の配列を返すことを前提としています。ただし、意味的に正しくないように見えるだけでなく、紛らわしい。
もう 1 つのオプションは、TextType ごとにメソッドを記述することです。
public string ParsePlainText(string textToParse)
と
public string[] ParseTableText(string textToParse)
このアプローチが気に入らない理由は、列挙型を使用した元のアプローチによって提供された柔軟性の一部が失われるためです。たとえば、後でテキスト タイプを追加する予定です。将来的には、クライアントが HeadingText などと識別したいテキストのタイプがあるかもしれませんが、プレーン テキストと同じように解析されます。元のアプローチでは、解析メソッドを含むクラスのパブリック インターフェイスを変更する必要はありません。TextType
ParseText メソッドの内部を列挙して変更します。さらに、呼び出すメソッドが 1 つしかなく、クライアントが (彼が知っている) TextType を渡すだけでよく、他のすべてが彼のために処理される (似たような名前の新しいテキスト タイプが追加されるたびに成長するメソッド)。
string
最後に、 と の両方を継承するオブジェクトを返すだけstring[]
で (これは C# であるため、単に を返すことができますobject
)、クライアントを適切な型にキャストすることができます。これは、クライアントが「実際に」何を返す必要があるかを知る必要があり、Parse クラスから返される型を変更し、実行時までエラーが発生しないようにすることで、すべての依存関係を壊す可能性が非常に高いため、これは最悪のアプローチだと思います。 (基本的に型チェックがないため)。
この状況に対する「正しい」または最適なアプローチはありますか?