22

以下のスタイルの神聖な力は何ですか?

var javascript = new Language(
  'Brendan Eich'
, new Date(1995, 0, 1)
, ['C', 'Java', 'Scheme']
);

なぜ多くのプログラマーがそのスタイルを使用するのですか?どのようなメリットがありますか?例えば、

var javascript = new Language(
  'Brendan Eich',
  new Date(1995, 0, 1),
  ['C', 'Java', 'Scheme']
);

以前よりずっと好きです。ありがとう。

4

9 に答える 9

16

すでに素晴らしい答えがたくさんあります。できるだけ明確にするために、私自身のものをあげさせてください。

Haskell で使用する一般的なスタイルであるため、私は個人的にこのコードの書き方を「Haskel スタイル」と呼んでいます。最初に Haskell の例を示します。

data Settings = -- The user settings
    { has_sound     :: Bool   -- Determines if the user has sound
    , has_power     :: Bool   -- Determines if the user has electricity
    , has_graphics  :: Bool   -- Determines if the user has graphics
    , user_name     :: String -- The name of the user
    , user_password :: String -- The hashed password of the user
    , user_email    :: Email  -- The email address of the user
    , stylesheet    :: Style  -- The stylesheet to use
    }

そして、私のプロジェクトの 1 つからの Javascript スニペット:

var events // Holds the events to generate a event handler for.
  , var2   // Quick description for var2.
  , var3   // Quick description for var3.
  , ...    // ...
  ;
events = // Event handlers will be generated for the following events:
    [ "onmousedown"  // Works outside of the window element
    , "onmouseup"    // Works outside of the window element
    , "onmousemove"  // Works outside of the window element
    , "onmousewheel" // This will handle DOMMouseScroll aswell
    ];

「Haskell スタイル」の利点

読みやすい

「Haskell スタイル」は、列スタイルのレイアウトを利用します。この列スタイルにより、コードが読みやすくなります。実際、これによりコードが非常に読みやすくなり、常に使用できるようになります。タブや先頭のスペースなしでコードを書くことを想像してみてください!

列スタイルのレイアウトを利用することで、変数名や型なども読みやすくなります。プレフィックスで変数をグループ化することで、将来の読者は高度な検索クエリを使用しなくても、探しているものを簡単に見つけることができます。

文書化しやすい

列スタイルのレイアウトには、より多くの利点があります。コードをグループ化することで、コメント用に予約された列を追加できます。これで、色を強調表示しなくてもコードを読むことができ、適切な列を見つけて変更するのと同じくらい簡単にコメントに情報を追加できます。さらに、コードを文書化するこの列のようなスタイルは、Doxygen のような文書化ジェネレーターを使用した後に得られるものとほぼ同じであり、この種のツールの必要性を取り除きます。

間違いに気づきやすい

このスタイルのコーディングを使用すると、コンマの欠落に気付くのは簡単です。それで始まらない行を探すだけです!スペクトルの反対側では、行末にコンマがあります。見逃した?いいえ、それは最後の要素であるため、または式が次の行に続くためです。そして、リストの最初の要素を見つけるのは、可能な限り簡単です。長い行を扱う場合、最初の要素は見落とされがちですが、最初の要素を独自の行に配置し、その前に右の代わりに[orを配置することで、簡単に見つけられます。{,

簡単に拡張可能

「しかし、式が大きくなると、このレイアウト スタイルは処理できなくなります!」と言うかもしれませんが、これはまったく正しいことですが、これはコードの残りの部分とは異なりますか? 列スタイルを使用することで、少なくともコードを読みやすく保つことができると思います。長期的には、コードを列レイアウトに合わせるのに苦労するよりも価値があります。

1つの例ですべて!

var scalable = // This is a example variable
    [
        [ new MyObject // This is how I would style Object Allocation
              ( "11"
              , "This is the first element"
              , function // This is a very secret function...
                  ( secret   // ..with secret..
                  , variable // ..variable..
                  , names    // ..names!
                  )
                {
                    // <-- Use spaces, not tabs :)
                }
              )
        , "12"
        ]
    ,
        [ { id:   21                          // Where's 20?
          , name: "This is the third element" // It sure is
          , func: function() { /* My body feels empty :c */ }
          }
        , "22" // Notice how 21 is a integer, not a string. Sneaky!
        ]
    ];

TL; DR

コンマを配置するこのスタイル、「Haskell スタイル」には、いくつかの利点があります。

  • 読みやすい
  • 文書化しやすい
  • 間違いに気づきやすい
  • 簡単に拡張可能
于 2015-11-16T20:34:19.877 に答える
12

最後の行の最後に余分なカンマがある場合、一部のブラウザでは機能しますが、すべてのブラウザでは機能しません。最初の余分なコンマよりもエラーの検出が難しくなります(すべてのブラウザーで失敗します)。また、ほとんどの開発者は、一部のブラウザーを誤ってサポートしていないために本番環境の問題が発生するリスクを冒すのではなく、エラーをすぐに確認することを好みます(修正できるようにするため)。特に、解決策がコンマを削除するのと同じくらい簡単な場合。

さらに、行の先頭にコンマを付けると、末尾に行を追加するのが簡単になり、その行だけをタッチする必要があります(前の行にコンマを追加する必要はありません)。これは、バージョン管理(diff、annotate、bisectなど)を使用している場合に重要です。配列またはオブジェクトの先頭に行を追加するには、2行に触れるのと同じ追加作業が必要になると主張する人もいますが(最初にコンマを使用する場合)、私の経験では、先頭に行を挿入する可能性ははるかに低くなります。最後に行を挿入します。

于 2012-05-07T14:27:53.833 に答える
11

これは、コンマが前のステートメントではなく、新しい行の次のステートメントに属しているためです。(@Dave Newtonが以下のコメントで述べているように、疑似BNFはfoo [、foo] *-ishになります)

例えば:

あなたがこれを持っているなら:

a,
b,
c

削除する必要がある場合は、前の行のcdecとコンマの2つを削除する必要があります。これを行う場合:

a
,b
,c

これで、、c行を削除するだけで済みます。b最初の例のの後ろのコンマは。のためにのみ必要なので、この方法の方が理にかなっていますc。ただし、この方法では見栄えが悪くなります。これは、コードの保守性と外観の間のトレードオフです。

于 2012-05-07T14:13:54.577 に答える
9

見逃したコンマを見つけやすくするために行われていると思います。

var something = 0,
    foo = "a string",
    somethingElse = []
    bar;

var something = 0
  , foo = "a string"
    somethingElse = []
  , bar;
于 2012-05-07T18:52:30.650 に答える
3

コードを見て、必要な場所にコンマがあることを確認する方が簡単です。コードの各行の終わりをスキャンする必要がある場合、左側に並んでいる場合のように、不足しているコンマが飛び出すことはありません。

于 2012-05-07T14:14:35.777 に答える
2

これにより、末尾のコンマを受け入れない言語で、末尾のコンマで誤って構文エラーを導入することから少し保護されます。

SQL では、末尾のコンマによって構文エラーが発生します。JavaScript では、ほとんどの場所で受け入れられますが、たとえば Internet Explorer の一部のバージョンでは不可解なエラーで失敗します。

JS はほとんどのブラウザで動作しますが、失敗するブラウザもあります

var thing = {
 a: 1,
 b: 2,
 // trailing comma
 c: 3,
};

SQL の構文エラー

SELECT
  col1,
  col2,
  -- Syntax error in SQL
  col3,
FROM table
于 2012-05-07T14:15:01.907 に答える
1

これは、コレクションに新しいアイテムを追加するときにコンマを忘れないようにする1つの方法であり、コレクションの末尾のコンマを誤って残さないようにするための1つの方法です。

それを新しい行に置くことによって、それは視覚的に明白です。

私はそれを気にしませんが、なぜ人々がそうするのかは理解しています。

于 2012-05-07T14:14:17.417 に答える
0

たとえば、生成されたコードを見ているかもしれません。たとえば、SQL selectステートメントを生成するループを作成する場合、次のように作成することがあります。

sql =  "SELECT";
sql += "  table.id"; // or some field that will always be in the query
for (var i = 0; i < 10; i++;) {
  sql += ",  table.field" + i; 
}
sql += "FROM table" // etc

最後にコンマを追加し、ループの最後の反復でコンマを省略する条件を設定する代わりに、次のようにします。

sql =  "SELECT";
for (var i = 0; i < 10; i++;) {
  sql += "  table.field" + i + ","; 
}
sql += "  table.id";
sql += "FROM table" // etc

これは機能的には同等ですが、IDが通常必要な場所に表示されません。

于 2012-05-07T14:48:14.233 に答える
-1

2番目の例では、行とそのコンマの削除または追加が簡単なためかもしれません。

于 2012-05-07T14:15:45.003 に答える