19

後で誤って変数を使用するのを避けるために、中かっこを使用してコード ブロックを分離することがあります。たとえばSqlCommand、同じメソッドに複数の を配置するときは、コード ブロックを頻繁にコピーして貼り付け、最後に名前を混ぜ合わせていくつかのコマンドを 2 回実行します。中括弧を追加すると、この状況を回避するのに役立ちSqlCommandます。間違った場所で間違ったものを使用するとエラーが発生するためです。以下に図を示します。

Collection<string> existingCategories = new Collection<string>();

// Here a beginning of a block
{
    SqlCommand getCategories = new SqlCommand("select Title from Movie.Category where SourceId = @sourceId", sqlConnection, sqlTransaction);
    getCategories.Parameters.AddWithValue("@sourceId", sourceId);
    using (SqlDataReader categoriesReader = getCategories.ExecuteReader(System.Data.CommandBehavior.SingleResult))
    {
        while (categoriesReader.Read())
        {
            existingCategories.Add(categoriesReader["Title"].ToString());
        }
    }
}

if (!existingCategories.Contains(newCategory))
{
    SqlCommand addCategory = new SqlCommand("insert into Movie.Category (SourceId, Title) values (@sourceId, @title)", sqlConnection, sqlTransaction);

    // Now try to make a mistake and write/copy-paste getCategories instead of addCategory. It will not compile.
    addCategory.Parameters.AddWithValue("@sourceId", sourceId);
    addCategory.Parameters.AddWithValue("@title", newCategory);
    addCategory.ExecuteNonQuery();
}

これで、StyleCop はブロックが空の行に続くたびに警告を表示します。一方、空行を入れないと、コードが理解しにくくなります。

// Something like:
Collection<string> existingCategories = new Collection<string>();
{
    // Code here
}

// can be understood as (is it easy to notice that semicolon is missing?):
Collection<string> existingCategories = new Collection<string>()
{
    // Code here
}

そう、

  1. 可変スコープの目的のためだけに中括弧を使用してコードのブロックを作成することに何か問題がありますか?

  2. よろしければ、StyleCop の規則に違反せずに読みやすくするにはどうすればよいでしょうか?

4

5 に答える 5

23

コードをブロックすること自体は何も悪いことではありませんが、それを行う理由を考慮する必要があります。

コードをコピーして貼り付ける場合、似ているが異なるコード ブロックを繰り返し実行するのではなく、コードをリファクタリングし、繰り返し呼び出す関数を作成する必要がある状況にある可能性があります。

于 2010-07-06T19:04:09.833 に答える
13

usingむき出しのブレース ブロックの代わりにステートメントを使用します。

これにより、警告が回避され、リソースに関してコードがより効率的になります。

より大きな観点からは、このメソッドを小さなメソッドに分割することを検討する必要があります。あるメソッドに続いて別のメソッドを使用SqlCommandする場合は、通常、あるメソッドに続いて別のメソッドを呼び出す方が適切です。次に、各メソッドは独自の local を使用しSqlCommandます。

于 2010-07-06T19:03:54.030 に答える
7

純粋にスコープを区切るためにブレースを使用することに問題があるとは思いません - 時には非常に便利です。

Profile適切な例 -オブジェクトを使用してコードのセクションの時間を測定するプロファイリング ライブラリに出くわしたことがあります。これらは、作成から破棄までの時間を測定することで機能したため、スタック上で作成され、スコープ外になったときに破棄され、その特定のスコープで費やされた時間を測定することで最も効果的でした。本質的に独自のスコープを持たないものの時間を測定したい場合は、中括弧を追加してそのスコープを定義するのがおそらく最善の方法でした。

読みやすさに関しては、StyleCop が気に入らない理由は理解できますが、C/C++/Java/C# などの経験がある人なら誰でも、波括弧のペアがスコープを定義することを知っています。あなたはやろうとしています。

于 2010-07-06T20:16:53.580 に答える
5

そのようなブロックは良い考えだと思います、私はそれらを頻繁に使用しています。小さすぎてメソッドに抽出できないコードのブロックを分離する必要がある場合、またはメソッドがいくつかのコードブロックで構成されているが、同じロジックではない場合に便利です。名前の競合なしに変数に同じ名前を付けることができ、これによりメソッド本体が読みやすくなります。

ちなみに、私の意見では、StyleCopにはデフォルトのルールが設定されており、便宜性については議論の余地があります。

于 2010-07-06T19:10:07.430 に答える
3

あなたの後にこのコードに取り組むとしたら、あなたのスコープの使用に少し不満を感じるでしょう。それは、私の知る限り、一般的な慣行ではありません。

あなたがこれをしているのは臭いだと思います。各スコープを、完全に説明的な名前とドキュメントを使用して独自のメソッドに分割することをお勧めします。

于 2010-07-06T19:10:48.050 に答える