web-dev-qa-db-ja.com

このプログラミングスタイルを特定する

私が継承したいくつかのレガシーコードは、C#が次のようなコードを記述するための複数の割り当てをサポートしているという事実を利用しています

void DisableControls()
{
    ddlStore.Enabled                =
    ddlProgram.Enabled              =
    ddlCat.Enabled                  =
    btnSaveProxy.Enabled            =
    btnCancelProxy.Enabled          =
    btnViewMassManagerProxy.Enabled =
    grdPromo.Enabled                = false;
}

これは非常にかなりスタイルで、すべての=がきちんと並んでいて、値が下部に割り当てられていますが、操作するのもかなり面倒です。 (そして、はい、それらはスペースではなく、物を並べるタブです)。

元々のコーダーについてこのスタイルが何を意味しているのかを知りたいのですが、これまでに数回しか見たことがありません。 C++の背景を示していますか? .NET 1.1?誰かの個人的な好みですか?

このような連鎖割り当てが、各コントロールの.Enabledを個別に設定するよりも効率的である理由はありますか?そうじゃない? (この部分は@gnatのコメントによって答えられました:This way makes it easy to insert btnWhatever.Enabled = as new buttons are added and delete as some buttons are deleted


編集:この人物のスタイルの他の要素。ファイル全体が1人の人物によって記述されたものと想定(確実ではない可能性が高い)。次の行に関数の引数を配置し、前の行の終わりではなく行の先頭にコンマを配置します。ライン。例:

PromoUpdate[] GetPromoUpdates(
                            StateField field)
{
    List<PromoUpdate> updates   = new List<PromoUpdate>();
    foreach (PromoOptInState p in field.States.Where(
                                                    x => x.IsDirty))
    {
        updates.Add(new PromoUpdate() {
            promoCode   = p.Code 
            , optIn     = p.IsOptedIn
        });
    }
    return updates.ToArray();
}

とても変です。

4
Bobson
_/*********************************************************************
 * People who do indent that way also tend to write pretty comments. *
 * It looks so very pretty, so very professional. Except it's not.   *
 *********************************************************************/
_

何らかの理由で変数の名前を変更する必要があるとします。その単純な変更は、元の作者が「きれいなコード」プログラミングスタイルに屈したため、多くの余分な変更を意味する可能性があります。メンテナとしてのあなたは、コードのかわいさを壊していないかどうかを確認するために、コード全体を調べる必要があります。

かなりの解説が完全に間違っているとしましょう。コードが存在する理由やコードの機能については説明していません。それはきれいですが、間違っています。おそらく、元の作者はデザインを再考しましたが、かなりのコメントを変更しませんでした。おそらく、以前のメンテナンスプログラマーの一部がバグを修正しましたが、きれいなコメントは修正しませんでした。たぶん、それは何度も何度も起こりました。


美しいコードと非常にきれいなコードの間には大きな違いがあります。美しいコードはたくさんの化粧を必要としません。

更新

等号に配置されたコードは確かにきれいに見え、特に左側のターゲットの長さがわずかに異なる場合は、おそらく読みやすくなります。この配置は、割り当てステートメントのブロックが何らかの形で相互に関連していることを示す自己文書化コードの形式としても機能します。これらの理由から、Steve McConnellは、Code Completeの初版で、代入ステートメントのブロック内の等号を揃えることを提唱しました。

しかし、彼はその後の版でこの勧告を撤回しました。代わりに、彼はこのスタイルに対して明確に警告しました:

割り当てステートメントの右側を揃えないでください。

この点に関して彼の推奨を完全に覆す彼の論理的根拠は、このスタイルに関連する莫大な保守コストは、読みやすさと理解しやすさのわずかな増加を正当化しないということでした。


コンマファーストスタイルについては、見たことがありますが、好きではありません。 yodaの条件(if (42 == foo) do_something();およびif ("foobar".equals(baz)) do_something_else();)と同じクラスに入れます。私にとって、コンマファーストとヨーダの両方の条件は、私が通常読んだり考えたりする方法にあまりにも耳障りです。

もちろん、これはすべてプログラミングの宗教的な問題です。ブロック形式の代入ステートメントが好きな人もいれば、そのコンマファーストスタイルが好きな人もいれば、ヨーダ記法が好きな人もいます。私自身のルール:他の誰かのコードを維持しているときは、その作者のスタイルに適応したほうがいいです。新しいコード?プロジェクトでスタイルに余裕があれば、その新しいコードを自分の好みのスタイルで記述します。

10
David Hammen

コンマを前の行の最後ではなく行の先頭に置くことは、SQLでは一般的です。データベースの背景でしょうか。

コメントアウトするリストの最後の項目であっても、不要なセクションを簡単にコメントアウトするのに役立ちます。

SELECT Name
       , Address
       -- , Email
FROM Customers
WHERE Address IS NOT NULL
  -- AND Email IS NOT NULL

(電子メールに関連するコメントアウトされた行に注意してください)

はい、リストの最初の行をコメントアウトすると一貫性がなくなると主張できますが、それはそれほど問題ではないようです。

4
whybird

何よりも、手足に出てHaskellと言います。

Johan Tibellのスタイルガイド here またはコードサンプル here をご覧ください。新しい要素の深いインデントやリスト要素の前にあるコンマなど、同じ機能がいくつか表示されます。

私はHaskellのバックグラウンドを持つ人々のかなりの割合を占めるプロジェクトに取り組んでおり、同様のスタイルに出くわすことは難しくありません。

「中括弧」の言語では奇妙に見えることに同意しました。

3
scrwtp

それはややユニークなスタイルです。私は、Cで割り当て演算子がいくらか頻繁に整列するのを見てきましたが、連鎖的な方法ではありません。したがって、次のようになります。

int foo    = 1;
int bar    = 2;
int bazbiz = 3;

1つのブロックですべての割り当てを呼び出し、「これが私が物事を割り当てている場所」であることを明確にするという考えで。

コンパイラーが変数のデフォルト値を提供しなかった場合、読みやすさが向上したと主張する人もいます。

連鎖割り当てで使用するのは少し珍しいようです。私が見たほとんどの場合は次のようになりました。

int foo = bar = bazbiz = 0;
2
user53019