1

ここにコードのサンプルがあります。

このコードを書く他の方法を知りたいです。特に、ネストされた他のフォームについて知りたいifです。

また、コメントについてのご意見をお聞かせください(ベストプラクティスは何ですか、私のコメントスタイルはプロの環境で十分ですか?)

この質問がSOの範囲外である場合は、お知らせください。削除します。反対票を投じないでください。プログラミングについて学習しようとしています;-)。

// Has User expressed his preference?
if (!repositoryDevice.HasDevicePreference(userDevice))   // If not ...
{
    // Save the preference
    repositoryPreference.Add(userDevice.UserId, candidateId);
    result = true;
}
else   // If yes ... 
{
    // If a User has express his preference more than 1 hour ago
    // allow the User to change his preference, otherwise not
    if (!HasUserRecentPreference(userDevice))
    {
        repositoryPreference.Add(userDevice.UserId, candidateId);
        result = true;
    }
}
4

5 に答える 5

10

を使用して、2 つの条件を 1 つに結合できます。OR

if (!repositoryDevice.HasDevicePreference(userDevice) || !HasUserRecentPreference(userDevice))
{
    result = true;
    repositoryPreference.Add(userDevice.UserId, candidateId);
}
else
{
    // put your else clause here
}
于 2012-10-03T08:02:21.197 に答える
4

これは論理演算です。次のように仮定します。

X = repositoryDevice.HasDevicePreference(userDevice)
Y = HasUserRecentPreference(userDevice)

したがって、コード行:

    repositoryPreference.Add(userDevice.UserId, candidateId);
    result = true;

次の場合に実行されます:

(NOT X) || (X && (NOT Y)) =  ((NOT X) || X) && (NOT X || NOT Y) 
                          = 1 && (NOT X || NOT Y)
                          = (NOT X || NOT Y)

したがって、最良の代替手段:

if (!repositoryDevice.HasDevicePreference(userDevice)
       ||  (!HasUserRecentPreference(userDevice)))
{
    // Save the preference
    repositoryPreference.Add(userDevice.UserId, candidateId);
    result = true;
}
于 2012-10-03T08:05:35.077 に答える
3

//If notとは//If yes不要です。暗黙のうちに書いたことを説明しません。

例えば

int x = 5; //assign 5 to x

ばかだろう、誰もがそれを見ることができます。私の小さな最適化:

// Has User expressed his preference?
if (!repositoryDevice.HasDevicePreference(userDevice)) 
{
    // Save the preference
    repositoryPreference.Add(userDevice.UserId, candidateId);
    result = true;
}
// If a User has express his preference more than 1 hour ago
// allow the User to change his preference, otherwise not
else if (!HasUserRecentPreference(userDevice))
{
    repositoryPreference.Add(userDevice.UserId, candidateId);
    result = true;

}
于 2012-10-03T08:03:33.513 に答える
2

あなたは行動を説明しています。通常、動作はクラス内にカプセル化するのが最適です。

歓迎されない条件付きネストのコードを取り除くのに役立つパターンの 1 つは、テンプレート メソッド patternです。

ここでは、事前定義された動作を、その動作の専門性で徐々にオーバーライドします。

しかし、よりクリーンなコードのために、ルールをメソッドの一部にしないのはなぜでしょうか?

repositoryPreference.TryAdd(userDevice, candidateId);

public void TryAdd(UserDevice userDevice, candidateId) {
 if (!repositoryDevice.HasDevicePreference(userDevice)) return;
 if (!HasUserRecentPreference(userDevice)) return;
 // do the add
}
于 2012-10-03T08:22:38.100 に答える
1

else と if を同じ行に置くことができます:

    result = true;

    // Has User expressed his preference or 
    // if a User has express his preference more than 1 hour ago
    // allow the User to change his preference
    if (!repositoryDevice.HasDevicePreference(userDevice) ||
        !HasUserRecentPreference(userDevice))
    {
        // Save the preference
        repositoryPreference.Add(userDevice.UserId, candidateId);
    }
    else
    {
        // result = false?
    }

(他の誰かが指摘したように) &&/||演算子を使用して、2 つの条件を 1 つのコード ブロックにマージすることもできます。2 つのブロックのコードが同一であると仮定すると、もちろん、それが望ましい解決策です。同じ行を 2 回書き込まないでください。

そうでなければ、それは非常によく見えます!:) 一般に、ソース コードの複雑さを避けることは良い考えだと考えられています。

于 2012-10-03T08:02:10.357 に答える