0

それで、始めに、私はこのような投稿を見ました:ifステートメントを使用せずにどの条件が真であるかを見つける方法

アイデアは適切ですが、もっと読みやすいコードにしたいという点で、私が必要としているものではありません。

Switchが最善の策だと思いますが、説明させてください。

私はこの声明を持っています:

if (input == string.Empty || typeComboBox.Text == null)
{
    MessageBox.Show("Nothing to encrypt!", "Nothing Selected!");            
    return null;
}

したがって、ここでの考え方は、このステートメントを2つの「IF」ステートメントに分割することでした。これは大したことではありませんが、読みやすくするために、コードを削減するための継続的な努力のために、ステートメントを1つにまとめたいと思いました。 。

入力が空の場合、MessageBox.Showの最初の引数を表示しますが、2番目の引数は表示しません。

typeComboBox.Textがnullの場合、2番目のオプションを表示したいのですが、最初のオプションは表示しません。

それらが両方とも真のステートメントである場合、私は両方を表示したいと思います。

さて、私の目標は、複数のテストや方法を使用せずに、これらの両方を実行することでした。基本的に、私はこれを意味します。どの条件が真であるかを見つけて、結果のデータを同じステートメント内に出力できる場合、それは理想的です。

スイッチはオプションだと思いますが、まだよくわかりませんが、このテストの結果に基づいて決定方法を作成し、その結果をスイッチに送信する必要があると思います。これは理想的ではありません。ifステートメントを2つと、コードを少なくすることができるからです。

1つのステートメントでこれを行う方法はありますか?この特定のプログラムには必要ありませんが、将来のために知りたいです。

ありがとう!

4

5 に答える 5

5

私はあなたがこのコードから始めたと仮定しています:

if (input == string.Empty)
{
    MessageBox.Show("Nothing to encrypt!");            
    return null;
}

if (typeComboBox.Text == null)
{
    MessageBox.Show("Nothing Selected!");            
    return null;
}

このコードに問題があるとはまったく思いませんし、おそらくこれが最も読みやすいでしょう。必要な数のテストを正確に実行し、それ以上は実行しません。代替手段を使用すると、コードが少なくなる可能性がありますが、より多くのテストが実行されることになります。例えば:

if (input == string.Empty || typeComboBox.Text == null)
{
    MessageBox.Show((input == string.Empty) ? "Nothing to encrypt!" : "Nothing Selected!");
    return null;
}

コード行は少なくなりますが、失敗のシナリオでは、1 つまたは 2 つの代わりに 2 つまたは 3 つのテストが実行されます。また、少し単純ではありません。

簡潔なコードは良いですが、簡潔すぎると保守が難しくなります。読みやすさは、冗長と簡潔の中間のどこかにあり、この場合、より冗長なコードの方が読みやすいと私は考えています。


もう 1 つのオプションは、複数のエラーを報告することが適切であるという事実を考慮することです。そのためには、次のようなコードを試してください。

List<string> errors = new List<string>();

if (input == string.Empty)
{
    errors.Add("Nothing to encrypt.");
}

if (typeComboBox.Text == null)
{
    errors.Add("Nothing selected.");
}

if (errors.Count != 0)
{
    MessageBox.Show(string.Join(" ", errors.ToArray()));
    return null;
}

これは元のコードよりも少し冗長ですが、最初に発生したエラーだけでなく、関連するすべてのエラーを報告できます。

于 2012-07-18T17:08:00.163 に答える
1

@millimoose のコメントは正しいです。2 つのifステートメントは、コードにとって最もクリーンなものです。ただし、検証を多数に拡張したい場合、またはこの種の検証の一般的なパターンを確立したい場合は、検証テーブルを設定するようなことを行うことができます。

public class ValidationRule
{
    public ValidationRule(Func<bool> test, string errorMessage)
    {
        this.Test = test;
        this.ErrorMessage = errorMessage;
    }

    public Func<bool> Test { get; private set; }
    public string ErrorMessage { get; private set; }
}


var validationRules = new[] {
    new ValidationRule(() => input != string.Empty, "Nothing to encrypt!"),
    new ValidationRule(() => typeComboBox.Text != null, "Nothing Selected!")
};

このようなテーブルを使用すると、次のようなコードを作成できます。

var errors = validationRules.Where(r => !r.Test()).Select(r => r.ErrorMessage);
if (errors.Any())
{
    MessageBox.Show(string.Join(' ', errors));            
    return null;
}

ただし、2 つの条件に対応するものだけを探している場合、これは過剰設計です。

于 2012-07-18T17:15:00.900 に答える
0

より読みやすい、少し異なるパターンをお勧めします。

StringBuilder message = new StringBuilder();

if (input == string.Empty) message.Append("Nothing to encrypt!\n");
if (typeComboBox.Text == null) message.Append("Nothing selected!\n");
// ... repeat as many times as desired ...

if (message.Length > 0) {
    MessageBox.Show(message);
    return null;
} else {
    // proceed with your code here
}

このコードには、複数のメッセージが有効な場合に複数のメッセージを表示できるという利点があります。ユーザーが一度に 1 つのメッセージしか表示されないのは、元に戻って何かを修正し、送信をクリックして、別のエラー メッセージを表示する必要がある場合に、イライラする可能性があります。

于 2012-07-18T17:08:25.563 に答える
0

これが 2 つの "if" ステートメントよりも優れているとは言えませんが、これは 1 つのみです。

var message = 
    ((input==string.Empty ? 
        "Nothing to encrypt! " : 
        "") +
    (typeComboBox.Text == null ?
        "Nothing Selected!" :
        "")).Trim();


if (message != "") {
    MessageBox.Show(message);
    return null;
}

ただし、一般的に言えば、条件演算子を使用して、単一の結果をもたらす論理ツリーを構築するのが好きです。これは、入れ子になったif/else句の束よりもはるかに簡潔です。適切にインデントしている限り、そのような構造は非常に読みやすく、表現力豊かであることがわかります。残念ながら、この場合、結果はオペランドの組み合わせに依存するため、理想的ではありません。この種のロジックを使用して文字列を作成することは、おそらく最良のアイデアではありませんが、おそらく最も簡潔なオプションです。

于 2012-07-18T17:09:09.387 に答える
0

単一の論理ステートメントによって決定される 3 つの (一見) 異なるアクションをコードに含める方法はありません。最も単純な論理 (コードではなく、精神的な論理のみ) のフローに分解しようとすると、次のような結果になります。

A が true の場合 B を実行 C が true の場合 D を実行 A と C の両方が true の場合 B と D を実行

(あなたがしたように)各条件が実際には他の条件とは別のものであることに注意することで、それを簡素化できます。

A が true の場合、B は常に実行されます C が true の場合、D は常に実行されます

したがって、コードでは、最も簡単な内訳は次のとおりです。

if (input == string.empty)
{
    // Do some stuff
}

if (typeComboBox.Text == null)
{
    // Do some other stuff
}

さて、どちらのメソッドにも長くて複雑な命令セットを用意するのではなく、他のメソッドを呼び出して作業を行う単純な決定セクションにすることで、コードの外観を簡素化できます。

if (input == string.empty)
{
    this.PrimeInputs(); // or something
}

if (typeComboBox.Text == null)
{
    this.InitTextBoxes(); // or something
}

主なことは、これは論理 AND および論理 OR とは異なるということです。これは、どちらか一方のアクションが必要なためです。場合によっては、両方のケースが false の場合はどちらのアクションも必要なく、両方のケースが true の場合は両方のアクションが必要です。

于 2012-07-18T17:11:54.417 に答える