読み取り専用のバッキングフィールドと、通常は解析を行うデフォルト以外のコンストラクターがある場合、TryParse パターンを使用して解析コンストラクターを一般的にどのように実装しますか?
以下は、私が話していることの不自然な例と、私が落ち着いたパターンですが、ぎこちないようです。実際には、いくつかの型には多数のプロパティがあります。確かに、n 個の ref 引数を取り、解析を行い、それらをそのように結び付けるメソッドを作成することはできますが、場合によっては 15 個の引数を持つメソッドを使用するのも面倒です。
2 つのコンストラクターのアイデアに加えて、try パースの結果をパース コンストラクターの読み取り専用フィールドにコピーする必要があるという考えには、少し匂いがします。
他の誰かがより良いパターンを持っていますか?
編集:さらにコンテキストを提供する
私がやろうとしているのは、大規模な (ish) コードベースをリファクタリングすることです。これには、コンストラクターに提供される文字列引数の解析がある、以下の例のような多くの型があります。現在、すべてのコードでコンストラクターの解析が使用されており、この解析のロジックはすべてコンストラクターで行われています。ぐちゃぐちゃで面倒。
最初にやりたいことは、このコードをコンストラクターからファクトリ メソッド (TryParse) に移動することですが、コンストラクターの署名を保持するため、コードベースに多くの変更はありません。長期的には、時間があればもっと良いことができます。
現在のところ、新しいコードで TryParse パターンを使用し、読み取り専用フィールドを保持しながら、既存のコードの構造署名をそのまま維持することが困難です。読み取り専用フィールドを緩和すれば、プロセス全体が簡単になりますが、そうはなりません。
public class Point
{
private readonly float x, y;
public float X { get { return x; } }
public float Y { get { return y; } }
public Point(string s)
{
Point result;
if (TryParse(s, out result))
{
this.x = result.x;
this.y = result.y;
}
else
{
throw new System.ArgumentException("cant parse");
}
}
private Point(float x,float y) // for the sake of the example, this wouldnt have any use as public
{
this.x = x;
this.y = y;
}
public static bool TryParse(string s,out Point result)
{
var numbers = s.Split(',');
if(numbers.Length == 2)
{
result = new Point(float.Parse(numbers[0]),float.Parse(numbers[0]));
return true;
}
else
{
result = null;
return false;
}
}
}