web-dev-qa-db-ja.com

開発者の自律を支持してコーディングスタイルを奨励すべきか、それとも一貫性を支持してそれを思いとどまらせるべきでしょうか?

開発者はif/elseブロックは、次のような1行のコードステートメントで構成されています。

if (condition)
   // Do this one-line code
else
   // Do this one-line code

別のものはそれらすべてに中括弧を使用します:

if (condition) 
{
   // Do this one-line code
}
else
{
   // Do this one-line code
}

開発者は最初にオブジェクトをインスタンス化し、次にそれを使用します。

HelperClass helper = new HelperClass();
helper.DoSomething();

別の開発者がオブジェクトをインスタンス化して1行で使用します。

new HelperClass().DoSomething();

開発者は配列とforループの方が簡単です:

string[] ordinals = new string[] {'First', 'Second', 'Third'};
for (i = 0; i < ordinals.Length; i++)
{
    // Do something
}

別の書き込み:

List<string> ordinals = new List<string>() {'First', 'Second', 'Third'};
foreach (string ordinal in ordinals)
{
    // Do something
}

私が何を話しているかはきっとご存じでしょう。私はそれをコーディングスタイルと呼んでいます(それが何と呼ばれるのかわかりません)。しかし、私たちがそれを何と呼ぶにせよ、それは良いのか悪いのか?それを奨励することは、開発者の生産性を高める効果がありますか?システム全体のスタイルに一貫性を持たせるために、開発者にコードの記述方法を試すように依頼する必要がありますか?

15
Saeed Neamati

コーディング標準ドキュメントが役立ちます。だれでも全体を覚えられるほど短い場合は、mostが役立ちますトラブルが多すぎず、痛みを感じないもの。

組織でコードをインデントする方法、名前を大文字にする方法、ループを実装する方法、コードにコメントする方法は、それほど重要ではありません。役に立つ部分は、他の人とだいたい同じに見えるコードをみんなに書いてもらうことです。

  • それはあなたが誰かが他の人のコードを見るたびに中括弧がどこにあるべきかなどのあなたの予想を再調整するのに1分を費やすことを避けます。
  • 同じファイル内にいくつかの異なるスタイルのコードを含めることを避けます。
  • おそらく最も重要なことは、標準を作成することで、コードのレビュー中にコーディングの実践に関する議論を回避できることです。

繰り返しになりますが、標準が何であるかは、ある種の単純で単純な標準を持つことほど重要ではありません。それで、すべての開発者を部屋に入れ、標準がどうあるべきかについて彼らに議論させます。この会議はいつまでも続く可能性があるため、ルールは次のとおりです。

  • 会議の終わりまでに決定されないものはすべて、マネージャーによって決定されます。
  • 会議は、2時間後、または誰かが叫んだり泣いたりするときに、どちらか早い方で終了します。
  • 規格全体は、1枚または2枚の用紙に(リーズナブルなタイプサイズで!)納まり、絶対に必要な場合のみ両面になります。

somebody |の採用を検討してください else's | standards 独自のコーディング標準会議の開始点として、または会議を完全に回避する方法として。

合意が得られれば、開発者は自分自身を警察することができるはずです(そして期待されるはずです)。標準から時折逸脱することは大したことではありません(正当化される可能性さえあります)が、標準を支持してお気に入りの個人的なスタイルを放棄することを拒否するだけでは、漏水管などでオフィスにすぐに移転できます。 。

デミアンブレヒトは糸くずツールを指摘しています。これらは、コーディング標準ドキュメントを完全に補完します。コーディングstyle標準に固執することは単に良いことです。危険な慣行に関連するコーディング標準に固執することは重要です。著者以外の誰もがコードのすべての行がスタイルの標準を満たしていることを確認する予定はありませんが、可能性のあるバグを自動的にキャッチするために、lintツールをチームのワークフローに組み込むことを検討する必要があります。さらに、ツール自体が認められた慣行を成文化することができるため、コーディング標準にそれらすべてを個別にリストする必要はありません。ツールの構成を指定するだけです。

注:「コーディング標準」の考え方は、プログラミングに固有のものではありません。 「コーディング標準」は多くの分野で使用されています。組織内の場合もあれば、業界全体または専門職全体の場合もあります。いくつかの例:

いずれの場合(および他の多くの場合)でも、有能な施術者は、期待される基準を満たさない「コード」を簡単に理解できます。コンパイラが解析する必要さえないドキュメントの詳細な要件を執筆している業界が多いのはなぜですか? スタイルが重要なので。情報を標準的なスタイルで提示することで、読者はコンテンツに完全に集中でき、読みが速くなり、理解に役立ち、エラーが減少します。

19
Caleb

スタイルは関係ありません。

そこで、私はそれを言った。

30年、数百のクライアントサイト、およびそれらの年の500(またはそれ以上)のチームメンバーからのコードを見積もった結果、そのスタイルは重要ではないことがわかりました。

最初に動作させます。

最適な量のリソース(つまり、適切なデータ構造、適切なアルゴリズム)を使用できるようにします。

everythingの後の「スタイル」の問題は解決されました。手動ではなく、ツールのみで「スタイル」の大騒ぎ。

16
S.Lott

コーディングスタイルとコーディングの匂いがあります。私が見つけたのはかつてなかった:

_    if(debugCondition)
//         printf("DEBUG: state:%s at debugCondition\n",dbg_state());

    for(i=0; i<MAX;i++)
    {
       //some essential business logic
    }
_

私の以前の雇用主は、中括弧のない複数行のif()を使用することを厳密に禁止しています。これは、「もう一度実行すると解雇される」タイプの障害と見なされていました。許可された構成は

_     if(condition) break; 
     if(condition) continue; 
     if(condition) return; 
     if(condition) for()...; 
_

これは、上で示したのと同じようなエラーが原因でした。ポータルのメインページが停止するまでに数時間かかりました。

いつもやるべきことがあります。 switch()のように:

_     case 1:
         something();
     break;
     case 2:
         something();
     return;
     case 3:
         something();
     continue;
     case 4:
     case 5:
         something();
     break;
     case 6:
         something();
     //fallthrough;
     case 7:
     ...
_

一方、次のように入力します。

_     case 1:
         something();
     case 2:
         something();
     break;
_

_//fallthrough_でcaseを閉じないでいると、バグと見なされます。

一般に、無視できる、創造的に解釈できる、または特定のニーズに合わせて変更できるガイドラインであるコーディング標準があります。そして、「臭い」に関するセクションがあり、それは厳密に守られるべきです。

4
SF.

私見それは依存します...

最初の2つの例は、単に個人的な好みの問題ではありません。

if (condition)
   // Do this one-line code
else
   // Do this one-line code

(括弧なし)=後でさらにコードを追加すると、バグが発生しやすくなります。

if (condition)
   // Do this one-line code
else
   // Do this one-line code
   // ...and this line as well... oops! this will actually execute either way

そして、これはデバッグするのにあまり便利ではありません:

new HelperClass().DoSomething(GetSomeData()); // etc.

必要な場所にブレークポイントを設定することはできません。これが1回限りのものである場合-十分に公平ですが、スタイルの問題として説明します。このようなものがどこにでもあると、デバッグは本来よりも不快になります。

3番目の例(for vs foreach)については、好みの問題だと思います。

3
Konrad Morawski

優れた事前設計で一貫性を実現します。質問であなたが説明するのは、ミクロ管理にほかなりません。私はたくさんのウェブ開発をしています。したがって、私はサービスとして公開されたRESTfulおよびCRUD開発を支持します。これにより、さまざまな方法で使用できる、明確で明確なエンティティが保証されます。

この設計により、実装の詳細を他の開発者に委任することもできます。このようにして、システム全体の設計を作成するのではなく、空白を埋めています。

全体的な設計の欠如は、システムの不整合を引き起こします。基本的な反復とループ構造の批評は、システム設計を改善するためにはほとんど効果がありません。これらの種類の問題は、ハンズオフアプローチ StyleCop。 でより適切に解決されます。

システム設計全体の比較的単純な図を描くことができますか?新しいチーム開発者に関係する要素/エンティティを説明するデザイン。できない場合、または非常に複雑な場合は、デザインが不足しています。

3
P.Brian.Mackey

どちらでもない。私は、面倒で、ぎこちない、マイクロマネージメント、そしてすべての無駄な時間の中で最悪のものになることを避けるために、厳しいコーディングルールを避けます。あなたの自律感はあなた自身の問題です。自分のことをもっと気持ちよくして欲しいなら、好きな飲み物を一杯買ってあげます。それ以外は、何かを成し遂げる。

2
JeffO

規則、変数名、クラス名などを使用することをお勧めします。ただし、提供する例のようなコーディングスタイルはかなり自明であり、コードの可読性や効率のいずれにも影響を与えません。一方、特定のスタイルを適用することによるオーバーヘッドと、それに続く開発者の努力との組み合わせにより、問題が発生します。

2
AJC

業界標準のリントツールを使用します(どうやら FxCop C#の場合)。それはすべてではなく、すべてではありませんが、一貫性は、多数の人々が取り組んでいる大規模なプロジェクトでは重要です。

自分のプロジェクトや小さなチームで作業しているだけの場合、それはやり過ぎだと多くの人が主張するでしょう。私はそうではないと信じています(私は個人の単一開発者プロジェクトでもPythonに PEP8 を使用しています)。

しかし、あなたが挙げた例のほとんどは、単に重要ではないので、lintingツールによって捕まえられないでしょう。

2
Demian Brecht

それは両方の混合です。それが標準であるからといって、それが可読性と保守性を備えているわけではありません。まだ組み込まれている標準がない場合、または標準に欠陥があり読めない側面がある場合は、改訂が適切です。

1
user29981

最終的な分析では、プログラミングを推進するのはプログラマーです。スタイルの問題は存在しますが、それらはプログラムをリリースすることに次ぐものです。

それはISプログラマーにいくつかのスタイルのガイダンスを提供するのに役立ちます。これは、プログラマーが作業に入る前に、特に環境やプログラミング自体に比較的初心者である場合に行うことができます/すべきです。与えられたガイダンス、非常にスタイルを意識するプログラマーもいれば、そうでないプログラマーもいます。プロジェクトの最初に提供されるガイダンスは、最初のプログラマーグループを助け、それによって全体的なタスクを容易にします。2番目のグループではほとんど効果がないかもしれません(うまくいけば、 )創造性、つまり彼らが適合性に欠けているものを補う。

1
Tom Au

最初の例は素晴らしいものではありませんが(変更を加えるとバグが発生しやすくなるという議論には重みがあります)、一般的に私は実際に開発者がわずかに異なるコーディングスタイルを使用するpreferに成長しました。

他のチームメンバーのコードを使用した後、場合によっては数か月程度で、基本的にインラインgit blameで作業を開始します。私の会社に10年以上在籍した後は、80万以上の正確さで、50万行のコードのどこかにあるクラスを書いたことがわかるでしょう。

同意しないスタイルを使用するコードを検討し始めると、少し「ランプタイム」がありますが、そのときに実際に行っていることは、「ああ、これはJohn Doeのコードのように見えます(なぜなら彼はスタイルXを使用しますが、スタイルYなどは使用しません。」そして、それにはコンテキスト全体のヒープがもたらされます。最初の概算として、Johnのコードに何を期待すべきか、彼がよく理解しているコードベースの他の部分と、彼がSQLの第一人者かGUI初心者かなど、彼が理解していない部分を知っています。

フォーマッタを介して全員のコードを実行すると、基本的にこの情報が取り除かれ、git blameの背後に隠されます。

1
Matt McHenry

それはプロジェクトの規模、そして何人の人がそれに取り組んでいるのかによると思います。熟練したプログラマーは、両方の異なるフォーマットスタイルを調べて、両方で何が起こっているのかを知ることができますが、目が簡単に理解できるように一貫性が必要です。中かっこなしで単一行のifstatmentsを実行する場合、そのプロジェクトはそれらを使用するべきではありません。私は物事を明確に見せるのが好きで、私がそれらを得ることができるのでとてもコンパクトです。 statmeentsの場合、1行にする場合は、このようにするのがよいでしょう。

if() {}
else() {}

あるいは:

if() {} else () {}

ただし、1行の場合はマルチラインの間隔を使用しないでください。それはまさに私が物事を行う方法です。オブジェクトの呼び出し方法は気にしませんが、それは何回呼び出されたかによって異なります。数回呼び出された場合は、オブジェクトを開始し、コンストラクターがあるかどうかに依存します。コンストラクタがあり、次を呼び出す場合:

Object.method();
Object.method2();

その後、オブジェクトを完全にインスタンス化することで回避できたときに、オブジェクトコンストラクタメソッドを2回呼び出すことになりました。

Foreachループとforループについては、一部の言語では、foreachループで配列を確認するときに、より適切に制御できるため、temp配列にキーと値があります。また、一部の言語では、ループを調べて、何回呼び出されるかを正確に把握できるため、何らかの最適化を行っていることも知っています。

1
WojonsTech

統一されたコーディングスタイルを適用することは常に困難です。理想的には、そのような平凡なタスクは、処理するツールに任せる必要があります。そのためにGo言語コミュニティに拍手を送ります。

1
grokus

これは本当に組織の種類に大きく依存します。

あなたがスーパーヒーローの小さなグループなら、どんなタイプのスタイルでも結構です。誰もが独自のスタイルを持ち、それが優れていて内部的に一貫している場合、それが必要なすべてのプロセスです。スーパーヒーローは、「ジェーンは角かっこを持っているので、これが彼女の意味です」または「ジャックは変数にキャメルケースを使用しています」と言います。

誰もがB +プレーヤーになるためには、普遍的な基準が最適である傾向があります。あなたのスーパーヒーローはこれによって引き下げられます。しかし、1人のAプレーヤーと6人のBプレーヤーおよび6人のCプレーヤーを平均してB +にしたい場合は、一貫した基準が必要です。この例では、1人のAプレーヤーがすべての人のコードを可能な限り迅速にウォークスルーできるように、すべての人が同じことをすることを望みます。

「でも待って、BプレイヤーとCプレイヤーを片付けてみませんか?」

現実には、多くのスーパーヒーローはいない。 Googleでそれらを見つけて育成することはお金になるかもしれませんが、Ma Bellに新しい課金システムを導入すると、後者のチームの方が費用対効果が高くなる可能性があります。 (そして、もしあなたが本当にスーパーヒーローを持っているなら、それらの4つか5つはダースの後輩の2倍の費用になります)

0
MathAttack