0

私はxmlファイルを持っています

<Config>
    <Allowed></Allowed>
</Config>

Allowed タグは次のように読み取られます。

string isAllowed = (string)xml.Root
                              .Element("Config")
                              .Elements("Allowed")
                              .SingleOrDefault();

isAllowed は、次の場合にデフォルト値の true を取ることになっています

  1. タグは存在しません
  2. 存在するが空である
  3. true、false、yes、no 以外の値を持つ。

これを行うコードは次のとおりです。

if (isAllowed == null)
{
    DoSomething();
    return true;
}
if (isAllowed.Length == 0)
{
    DoSomething();
    return true;
}
if (isAllowed.Length != 0)
{
    if (isAllowed.ToUpper() != "FALSE" && isAllowed.ToUpper() != "NO")
    {
        DoSomething();
        return true;
    }
}

これを行うためのより良い方法が必要ですか?

4

2 に答える 2

5
if (isAllowed == null)
{
    DoSomething();
    return true;
}
if (isAllowed.Length == 0)
{
    DoSomething();
    return true;
}

次のものに置き換えることができます。

if (string.IsNullOrEmpty(isAllowed)
{
    DoSomething();
    Return true;
}

string.IsNullOrWhiteSpace(isAllowed)しかし、実際には、タグの内容が「空」の場合は true を返すため、基準を考えるとより適切だと思います。

また、条件が最初に満たされた場合、関数が返されるため、次の条件を 2 回目にする必要はありません (短絡評価)。これは、現在 2 番目のIfブロックにあるステートメントが実行されないことを意味します。

if (isAllowed.Length != 0)

これをよりきれいにするための私の最初の本能は、ジョンが彼の答えで行ったのと同じアプローチを取ることでした.それを繰り返すことに利点はありません. ただし、より多くの条件を導入すると、よりクリーンになるため、これは別の優れた設計であると考えました。

private static bool Validate(string isAllowed)
{
    var defaultTrueConditions = new[] {"true", "false", "yes", "no"};
    if (string.IsNullOrWhiteSpace(isAllowed) ||
        defaultTrueConditions.Contains(isAllowed, StringComparer.OrdinalIgnoreCase))
    {
        DoSomething();
        return true;
    }
    return false;
}
于 2013-05-16T06:16:52.700 に答える
1

次のようにすると良いようです。

// This deals with the nullity aspect. (The "Yes" is just for clarity - it could
// be any value other than "No" or "False" in some form.)
isAllowed = isAllowed ?? "Yes";

bool isFalse = isAllowed.Equals("No", StringComparison.OrdinalIgnoreCase) ||
               isAllowed.Equals("False", StringComparison.OrdinalIgnoreCase);

return !isFalse;

基本的に、デフォルトに設定しているという事実は、要素を見つけて、大文字と小文字を区別しない方法でまたはの値を取得した場合にのみtrue、戻り値が返されることを意味します。ここでは序数一致を使用していることに注意してください。たとえば、 orに変更したい場合があります。falseNoFalseCurrentCultureIgnoreCaseInvariantCultureIgnoreCase

メソッド呼び出しがどこから来るのかは明確ではありませんが、DoSomethingとにかくそれを分離します。上記のように、適切な値を決定するメソッドを 1 つ記述します。次に、次のようにします。

bool allowed = CheckAllowed(doc);
if (allowed)
{
    DoSomething();
}
// And use allowed here too

それは私の心にとってはるかにきれいな分離です。

于 2013-05-16T06:18:40.137 に答える