ParseとTryParseを実装するなら
こんにちは。c#初心者です。
c++にも、c#にもintにParseメソッドと、TryParseメソッドがあると思いますが、intのように比較的簡単に解析できるもの(比較的簡単なメソッド)ならParseメソッドをコピペして、例外の部分を「return false;」に変えるだけで十分だと思うのですが、問題は、Color構造体のような(やや)複雑なものです。
R, G, Bに加え、α値があり、また、名前で色を表す可能性もあります。考えただけで(intと比べると)かなり面倒なメソッドになることが分かると思うのですが、とりあえずParseメソッドを実装したとしましょう。
次にどうせならTryParseメソッドも実装したいところなのですが、初心者が考えた方法は3つあります。
1、Parseメソッドをコピペして(FormatExceptionなどの)例外部分を「return false;」に変える。
2、Parseメソッドをtryブロックに入れて、catchブロックで「return false;」とする。
3、privateなtryParseメソッドを用意し、それをベースにする。戻り値はException型で、Parseメソッドではnullで無ければスロー、TryParseメソッドでは「return exception == null;」とする。
(ソースコードは一番下)
1は保守性上、少々問題ありかと。2は利用側がちょっと楽になることには変わりないが、パフォーマンス重視には向かない(というかテキストを解析している時点でパフォーマンス低いかな?)、3は1、2の問題を克服しているもののこのような設計でよいのか自信なし。
という訳で悩んでいます。どれが一番良いでしょうか? もっと良い案があればそれでも良いです。どなたかわかる方がいらしゃいましたら教えてください。
----------- 簡易ソースコード --------------
c#で書いています。また読みやすく(なっているかどうかは分かりませんが)するため、1行で書けるところも2行以上で書いている部分もあります。
案1
public static Color Parse(string text)
{
……
if ( invalid ) throw new FormatException();
……
}
public static bool TryParse(string text, out Color result)
{
……
if ( invalid ) {
result = Color.Empty;
return false;
}
……
}
------------------------------------------------
案2
public static Color Parse(string text); // 略
public static bool TryParse(string text, out Color result)
{
try {
result = Parse(text);
return true;
}
catch ( FormatException ) {
result = Color.Empty;
return false;
}
}
---------------------------------------------------
案3
private static Exception tryParse(string text, out Color result)
{
……
if ( invalid ) {
result = Color.Empty;
return new FormatException(); // スローせずに返す
}
……
}
public static Color Parse(string text)
{
Color result;
Exception exception = tryParse(text, out result);
if ( exception != null ) throw exception;
else return result;
}
public static Color TryParse(string text, out Color result)
{
Exception exception = tryParse(text, out result);
if ( exception == null ) return true; // 例外が無ければ成功
else return false;
}