あなたが従わなければならなかった最悪のコーディング標準?[閉まっている]


77

次のようなコーディング標準に取り組む必要がありましたか?

  • 生産性が大幅に低下しましたか?
  • 元々は正当な理由で含まれていましたが、元の懸念が無関係になってからずっと保持されていましたか?
  • リストに載っていたので、それらをすべて覚えることは不可能でしたか?
  • 著者は、優れたコーディングの実践を奨励するのではなく、単に彼らのマークを残そうとしていると思わせましたか?
  • なぜ含まれているのか分かりませんか?

もしそうなら、あなたの最も好きではないルールとその理由は何ですか?


ここにいくつかの例


4
私は途中でSOの前に同様の質問をします(ただし、まったく同じではない)しました:stackoverflow.com/questions/218123/...
ブライアンR.ボンディ

@ブライアン、ありがとう、私はあなたの質問を見ましたが、それを忘れていました。
finnw

4
コーディング標準の本当の問題は、それらが正しいかどうかをめぐって議論する無駄な時間と労力です。何も... internecineの争いを作成するための優れた中括弧の戦争を打つ
MZB

回答:


97

これはいくつかの羽を生む可能性がありますが、各メソッドの上部にあるテンプレートブロックコメントを義務付ける標準は、常に私からのくだらないことをバグにします。

1)更新中に気付くには実際の作業を行うコードから離れすぎているため、常に最新ではありません。悪いコメントはコメントなしよりも悪いです。

2)多くの場合、ソース管理ツールに既に含まれている情報を繰り返しますが、精度は低くなります。例:最終変更者、変更日/理由のリスト。


12
私は完全にコメントすることは悪い習慣であること(以前の奇妙に思えた学校で、少なくとも今)を見つける
シェイディM.ナジブ

14
それだけでなく、ボイラープレートの負荷を一番上に置く必要があるときに新しいクラスファイルを作成することに伴うオーバーヘッドが、実際に開発者が新しいクラスを作成するのを思いとどまらせ、巨大で扱いにくいクラスとそれゆえに悪いデザインを助長することがわかりました。
Gaz

13
同意しない!役に立たない鉱石の情報を追加するのではなく、関数が何をするのか(.hファイル内)の実際のテキストによる説明であり、非常に便利です!もちろん、コードとの同期を維持することをお約束します。
ウィザード

5
@Shady M Najib常に悪い、または管理されていない/メンテナンスされていない場合は悪いですか?一般的に、優れたコードはその目的をコメントの必要性を回避するのに十分に明らかにしますが、それは常に当てはまるわけではなく、これらのシナリオではコメントが重要であると感じています。XMLDocコメントを含めることの1つの悪い理由は考えられません。
ネイサンテイラー

7
それが何をするのかを説明するブロックは良いです。ブロックは、引数の型と名前、および戻り値を単純に繰り返すことは悪いことです。後者を強制する標準を使用しなければならなかったとき、その大部分を自動生成するためにemacsスクリプトを書きました。
AShelly

130

かつて教授に、コードの各行に少なくとも1つのコメントを要求したことがありました。

//Set x to 3
var x = 3;

//if x is greater than 2
if(x>2){

    //Print x
    Print(x);
}

それはかなりばかげていた。


10
これは、教授があなたが何が起こっているかを正確に知っていることを知っているからではありませんか?
ジョンマッキンタイア

80
何が起こっているのかは明らかだと思うし、教育ではない。
ダン・レイ

18
上記の例は明らかですが、学生が別のアプリや本から何か関数呼び出しをコピーしたとしても、それが本当に理解できない場合はどうでしょうか?教授はどのように知っていますか?この愚かなルールでは、灰色の領域(彼の防御ではおそらく以前に悪用された可能性があります)は許可されません。それが私がこれを解釈する方法です。...これを学業以外の環境で見た場合、ちょっと怖いかもしれません。;-)
ジョンマッキンタイア

4
ええ、ただし、コードを繰り返すだけで理解を示さないコメントをいつでも書くことができます。彼はあなたを右中括弧の前に「//中括弧」にするのですか?
代替案

6
誤ってコードに有用なコメントを付けた場合はどうなりますか?// commentその前に回線を置く必要がありますか?
コンフィギュレー

103

私たちの会社(C#)コーディング標準では、#REGIONの広範な使用が求められています(知らない人のために、Visual Studioで1行に折りたたまれるソースコードのブロックをマークします)。その結果、常にきれいに構造化されたクラスと思われるものを開き、#REGION構文の深くネストされたラグの下にスイープされたゴミの山を見つけました。ロガーの1つの宣言を見つけるためにLOG領域を展開する必要があるなど、単一行の周りに領域がある場合もあります。もちろん、いくつかの領域が作成された後に追加された多くのメソッドは、「間違った」領域スコープにも配置されました。ホラー。ホラー。

リージョンは、Visual Studioに追加された最悪の機能の1つです。実際のオブジェクト指向構造ではなく、表面の構造化を促進します。

最近では、#REGIONsを殺しています。


11
私は...アップこの十数回を投票しようとした
TGnat

22
#REGIONが必要だと思うなら、リファクタリングする必要があると思います。
ジェイバズジ

23
私は通常、リージョンごとにコンストラクター、プロパティ、イベント、メソッド、およびメンバーにコードを整理します。これにより、ソースの管理とナビゲートが簡単になります(特に、かなり大きくなる可能性のある一部の静的ユーティリティクラス)。ただし、それ以上は使用しません。
エヴァンプレイス

26
単純なコーディング標準があります:領域をネストすることはありません。ただ、グループ関連の方法(初期化、シリアライズ、プロパティなど)にそれらを使用する
ジェイソン・ウィリアムズ

6
#regionsの唯一の良い目的は、編集する必要のないコードを隠すことです。それは、生成されたコード、または人が触れないようにするのが困難なアルゴリズム、またはcodeいデバッグコードブロックのコードです。しかし、人々が取り組んでいるコードではありません。#regionショップで立ち往生している人のために、定義に折りたたむが、地域を展開するマクロがあります。こちらをご覧ください:stackoverflow.com/questions/523220/awesome-visual-studio-macros/…–
キラレッサ

80

ある仕事では、データベースで奇妙な形式のハンガリー記法を使用せざるを得ませんでした。

詳細を思い出せませんが、メモリから、各フィールド名には以下を含める必要がありました。

  • 母音なし
  • すべて大文字
  • テーブルへの参照
  • データ型インジケータ
  • データ長
  • ヌル可能標識

たとえば、人の名を保持する列は次のように呼び出されます:(PRSNFRSTNMVC30X人テーブル、名列、Varchar 30文字、Not Null)


14
申し訳ありませんが、データベースをリファクタリングする場合、またはVARCHARの長さを変える必要があると判断した場合はどうなりますか。突然、すべてのコードを調べて変更する必要があります。それは恐ろしく見えます。
トム・モリス

71
母音はありませんか??!冗談だよね?
ダニエルキャシディ

39
この基準を施行した人々は額に尾根を持ち、しばしば名誉と戦いについて話しましたか?
ライアンロバーツ

10
ハハ、彼らはDBAだったので...;)
ダモビサ

14
列の短縮名を使用して列名を送信する必要があります。PersonFirstNameVarchar30NotNull = bit.ly/cULlQc
ビリークーバー

48

すべての中括弧の後に、中括弧の終わりについてのコメントが続くことを主張します。

例えば:

for (int i = 0; i < 10; i++)
{
    if (foo > bar)
    {
        printf("Foo greater than bar");
    } // End If (foo > bar)

    while (baz)
    {
       farb();
    } // End while (baz)
} // End For

21
もっと分かりやすい:ブロックの始まりが何であるかをコメントする必要がある場合、ブロックが長すぎるか、その内容が複雑すぎる=>リファクタリング。
リチャード

5
深く深く入れ子になったブロックを整理するのは難しいため、これらのコメントが役立つかもしれないので、私は投票したいと思います。これらのコメントはすぐに間違って(そして非常に混乱を招く)なり、長く深くネストされたブロックはリファクタリングする必要があり、コメントを追加する必要がないため、私は投票したいと思います。
ジェイバズジ

7
これは強力なIDEのない世界にとって素晴らしいアイデアでした。
IAdapter

9
まともなIDEで@Jayを使用すると、1つのブレースを強調表示でき、他の対応するブレースを強調表示できます。人々がこれをするとき、私は個人的に嫌いです。
エヴァンプライス

3
あなたの例は少しおかしな面ですが(長さが足りないため問題になり、ロジックを変更すると速度が低下します)、これは必ずしも悪いことではありません。そのようなコメントは、ファイル全体にまたがる名前空間/ endif宣言を閉じるのに非常に便利です。
jsternberg

38
#define AND  &&
#define OR   ||
#define EQ   ==

'言っ途切れる。


9
#include <iso646.h>ははるかに良い選択ではないでしょうか?
AndrejaKo

3
@AndrejaKo:これは<iso646.h>よりも前のものです。これは、CをFORTRANのように見せるための試みでした。
ニールC.

2
これは本当にコーディング標準でしたか?すなわち、オペレーターを直接書くことに対して会社の方針がありましたか?
finnw

21
それも持っ#define BEGIN {ていました#DEFINE END }か?
JBRウィルキンソン

3
それは私が見たDaily WTFの記事を思い出させます。C++プログラマーがVisual Basic(または単にBasic、いくつかの方言)のように見せるためにたくさんの定義を持っていることを思い出しました。#define void Sub、#define}終わり、そのようなこと。
ウェインモリナ

37
  • ローカル変数名はすべてアンダースコアなしの小文字です

実際の例:paymentmethodtotalshtmlcontracttypechangecontextscustomsegmentspectextspotentialmsceventref

ニューヨークタイムズの重さ

「単語スペースは当たり前だと考えるべきではありません。母音を特徴付ける最初のアルファベットである古代ギリシア語は、音を出せば単語スペースなしで解読でき、それらなしでした。[…]ラテン語も2世紀までに言葉を分けるのをやめました。目が分離されていないテキストを読むためにもっと一生懸命に働かなければならないので、損失は不可解です。しかし、古文書学者のポール・センガーが説明したように、古代世界は「読書をより簡単で迅速にする」ことを望みませんでした。」

3
+1。ささいな面倒な点もあります。また、コーディング標準エディターまたはPMが「大きな負担はないので、変更する価値がない」と言うことができるので、彼らは反論しにくいです。
finnw

1
まさに。(この場合、このような数十個の変数名を読むことは、実際にadduptoquitea greatburdenを追加できます。)
ジョンシラクーサ

57
2つの方法で解析されるよりも、名前を発明することで楽しもう。pageshits、ペニスアップなど
ジェイバズージ

4
@Jay * sexchange
configurator

2
@configurator:Visual Studioデバッガーチームが、現在進行中の例外をウォッチウィンドウで確認できる機能に取り組んでいたとき、「$ ex」という疑似変数を追加していました。長い間気付かなかった。次に、「$ exception」に名前を変更しましたが、まだ「s」があると読みました。
ジェイバズジ

36

私は「やるために会社のソフトウェアのリーダーで頼まれたシンプルな、再nは dundantコードを」。たとえば、既存の関数に新しいパラメーターを追加することは禁止されていました。代わりに、回帰を回避するために元の関数をそのままにして関数を複製する必要がありました。もちろん正式なテストはありません(時間の無駄)。

マージソフトウェアの使用も禁止されていました。各ファイルは一度に1人のプログラマのみが変更できます。もちろん、リビジョン管理ソフトウェアはサイエンスフィクションでした。

私の人生で一番幸せな日は、彼が解雇されたときでした(イタリアで誰かを解雇することは非常に難しいと考えてください)。


彼は「リファクタリング」という言葉を聞いたことがないかもしれません
ナンダ

3
彼は他の多くの言葉も聞いたことはありません...
Wizard79

あなたが...方法を変更したことがないので、さてあなたは、正式なテストを必要としなかった
コンフィギュレータ

36

データベースとのすべての対話は、ストアドプロシージャを介して実行する必要があります。私たちが2010年ではなく1997年に住んでいるなら、それは理にかなっているかもしれません。

私は、これが実際に元の質問のすべての基準をカバーしていることに気付きました。

  • 生産性が大幅に低下しましたか?小切手。ORMを使用してください。
  • 元々は正当な理由で含まれていましたが、元の懸念が無関係になってからずっと保持されていましたか?小切手。マネージャーは1000年前にデータベースサーバーの開発者であり、このコーディング標準を取り入れました。
  • リストに載っていたので、それらをすべて覚えることは不可能でしたか?小切手。これには、「できるだけ多くのロジックをデータベースに保存する必要があります」が含まれます。
  • 著者は、優れたコーディングの実践を奨励するのではなく、単に彼らのマークを残そうとしていると思わせましたか?小切手。元データベースサーバー開発者であるマネージャーに戻り続けます。
  • なぜ含まれているのか分かりませんか?小切手。

2
私の職場にはこのキャンプに何人かの人がいます。彼らはパフォーマンスのカードをプレイし、彼らの知識がどれだけの日付のうち立証しようとすると、それはおかしい
モニカ元に戻し

3
待ってください。真剣に、私はSPは、たとえばC#からの直接的なSQL呼び出しよりも、パフォーマンス面で優れていると思いましたか。
Sk93

3
それらが含まれている理由を正確に知っているようですね。:P
メイソンウィーラー

4
私が育ったとき、私は最終的にすべてがDBを通過する理由を理解しました:)すべての深刻さで、これは非常に多くのものを簡素化します、車輪を再発明しようとしないでください。
ジェキュー

3
「すべてのインタラクションでSPを使用する必要があるため、OR / Mは使用できません」という素敵な理由を聞いたことがあります。人力のそのような無駄。
コンフィギュレー

33

CTOは「私たち」がより良く、より速くできると信じていたため、STLまたは他の標準C ++ライブラリの使用を許可されていません。リストや文字列クラスなどの基本的な構成要素です。


5
STLが十分に速くなく、正しいためにSTLを使用していないと聞いたのは、ゲームのときだけでした。EAは、ゲーム用にSTLを独自に実装しました。私はそれがもう重要ではないことを非常に疑っています(現代のゲームはGPUに制限されています)。しかし、それでも、まったく新しいライブラリではなく、STLの実装でした。EASTLを使用しているときは、まだSTLを使用していました。
マットオレニック

1
@Matt:これに加えて、EAの苦情はメモリの使用と初期化に集中していました。独自の実装は、より少ないメモリを消費し、より早く解放し、後で初期化されるオブジェクトの初期化を回避しました。
マチューM.

私は彼に自分でコーディングするように言いました
右折

31

ハンガリー記法

MSDN Charles Simonyiによるハンガリー語表記識別子の命名規則の説明」から抽出したサンプル。

1 #include“ sy.h”
2 extern int * rgwDic;
3 extern int bsyMac;
4 struct SY * PsySz(char sz [])
6 {
7文字* pch;
8 int cch;
9 struct SY * psy、* PsyCreate();
10 int * pbsy;
11 int cwSz;
12符号なしwHash = 0;
13 pch = sz;
14 while(* pch!= 0
15 wHash =(wHash11 + * pch ++;
16 cch = pch-sz;
17 pbsy =&rgbsyHash [(wHash&077777)%cwHash];
18 for(; * pbsy!= 0; pbsy =&psy-> bsyNext)
19 {
20文字* szSy;
21 szSy =(psy =(struct SY *)&rgwDic [* pbsy])-> sz;
22 pch = sz;
23 while(* pch == * szSy ++)
24 {
25 if(* pch ++ == 0)
26リターン(psy);
27}
28}
29 cwSz = 0;
30 if(cch> = 2)
31 cwSz =(cch-2 / sizeof(int)+1;
32 * pbsy =(int *)(psy = PsyCreate(cwSY + cwSz))-rgwDic;
33 Zero((int *)psy、cwSY);
34 bltbyte(sz、psy-> sz、cch + 1);
35 return(psy);
36}

5
わーわーわーわーわーわー!
モニカの復元

22
このサンプルの最大の問題は、無意味な変数名です。ハンガリー語の接頭辞を取り除きます。それらの一部は1文字または0文字です。
finnw

8
これはシステムハンガリー語であり、弱い型付けの言語(名前でこれらの言語で作業するために重要な型情報をエンコードする)で役立ちます-強く型付けされた言語では役に立ちません。強く型付けされた言語のより良い代替手段はApps Hungarianです。これは、変数(メンバー、ポインター、揮発性、インデクサー)の使用に関する重要な情報をエンコードします-言語自体はサポートしていません。
ジェイソンウィリアムズ

5
どうぞ 私は決してきたこれまでのメンバーと地元を混同していない、と私は何でも/メンバー/地元の人々 /フィールドにその愚かなハンガリー語を使用しないでください。私は、彼らがジョエルの例のように「安全」と「安全ではない」のような文字列を、さまざまな種類の間を区別するために有用かもしれないと思う間違ったコードが間違って見て作る
コンフィギュレータ

3
@configurator:Joelの例は恐ろしいものです。さまざまな型を用意した方が良いでしょう。そうすればコンパイラは使用を強制します。
マチューM.

28

私はかつて、プロジェクトリーダーがすべての変数(すべての変数)の前に「v」を付けることを義務付けているプロジェクトに取り組んでいました。したがって、vCount、vFirstName、vIsWarrantyなど。

どうして?「私たちはVBScriptで作業しており、とにかくすべてがバリアントであるため」

WTF。


93
私はかつて、すべての変数(すべての変数)の前に「$」を付ける必要がある言語で働いていました。
-nohat

6
@nohat:そして、あなたはそれがすごいことに気づきましたよね?
ジョシュK

私はかつて、すべての変数が「$」、「%」、「@」などの句読点で始まる言語で働いていました。私は今でも時々しています。
デヴィッド

3
これは実際にfbefore関数を配置する必要がある場合にのみ問題になり、コードは本当にになりfUcked (vUp)ます。
ジョーD

1
Perlのさまざまなバージョンのように

26

ほとんどこれを忘れました:

マネージャーからの引用:

独自のコードで見つかった問題のバグを修正または文書化しないでください。顧客は、今後数年間にわたってそれらを特定して修正するために私たちに支払います。

これは消費者向けソフトウェアではなく、単一の大規模組織向けのカスタムです。言うまでもなく、顧客はその後何年も支払いました。些細なことのように見えるかもしれませんが、バグを見つけようとするよりも、バグを無視しようとする方が困難です。


2
これは恐ろしいポリシーです。このマネージャーが缶詰になったことを願っています。
バーナード

@ Bernard-ほとんどの組織では、長期的な収益の流れを作り出すことが、迅速なプロモーションの根拠です。うまくいけば、他の誰かがこれに狂気を見て、誤って彼/彼女を駐車場で走らせました。
ジムラッシュ

24

すべての非プライベートメソッド、定数、列挙、およびプロパティにXMLコメントを適用しました。

特に最終結果は///を押すだけですべての空のコメントスタブを作成するか、GhostDocをインストールして自動生成されたコメントを追加することになるため、コードがかなり乱雑になりました。

/// <summary>
/// Validations the handler.
/// </summary>
/// <param name="propertyName">The property name.</param>
public void ValidationHandler(string propertyName) 
{
   // whatever
}

[編集]これをばかげた標準として言及する理由は、メソッドのコメントが愚かだと思うからではなく、これらのコメントの品質が何らかの方法で強制されず、コードファイルに大量の混乱が生じるだけだからです。盲目的な「コメントが必要」ビルド要件よりも、意味のあるコードドキュメントを作成するより良い方法があります。


13
' Validations the handler'-ええと
エリック

8
+1うーん、これ嫌い。ソフトウェアを使用してコメントを生成する場合、コメントは必要ないと思います。
bleevo

9
これは悪いルールではないと思います。初めて保守しなければならないメソッドを読むとき、すべての引数の仕様があれば大いに役立ちます。通常、微妙な点があります(例:引数がnullの場合、空のコレクションの場合、存在しないファイルの名前など)。別の良い(IMHO)ルールは、メソッド名は動詞であるべきですが、例では名詞です。
finnw

3
@finnw良い習慣ですが、悪い基準だと思います。開発者が参加していて、正当な場合(例外の詳細など)に意味のあるメソッドコメントを書いている場合、それは素晴らしいことです。そうでない場合は、大きな混乱になります。前者の場合、コンパイルレベルの強制はまったく必要ありません。
アダムリア

7
文書化解除の典型的なケース。露骨に明白なもの以外に何も言わないコメントは、すぐに殺されるべきです。
クンバヤ

23

実際にはコーディング標準ではありませんが、ソース管理に「changelog.txt」というファイルがありました

チェックインを行うたびに、このファイルにエントリを手動で追加する必要がありました。このエントリは、サブバージョンのリビジョン番号とチェックインコメントでした。

新しいCTOが始まり、誰かが彼にこれを言ったとき、彼はすぐにエグゼクティブの決定を下し、「もうこれをやるつもりはない」と言ってファイルを削除しました。これは何年も続いていました。


6
そして誰も知らなかったsvn log
Htbaa

1
政策を開始した人々は長くいなくなり、その後の人々はそれを続けました。私は新しいCTO(私の友人)と同じ週以内に始めましたが、私たちはこれを見て、WTFと言いましたか?
ジムA

20

私が協力してきた場所のいくつかは、未使用または非推奨のコードを削除するのではなくコメントアウトすることを主張していました。履歴などについてVCSを信頼する代わりに、コメントアウトされたコードによってファイル内で痛々しいほど維持されました。

これに関して私が見つけた大きな問題は、コードがコメントアウトされた理由がよくわからないということです。それは、一部の開発者が積極的に変更を加えていて、参照のためにそれを保持したいのか、それとももはや必要ではなかったのですか?


3
最近、コメントアウトした古いコードをたくさん削除しました。
CoderDennis

2
コメントアウトされたコードと、コメントアウトされた理由と適切な場所に保持する必要がある理由についての適切な説明がない限り、通常はコメントアウトされたコードを削除します。
ジェレミーウィーベ

全くもって同じ意見です。作業している限りコードをコメントアウトしても問題ありませんが、リリースバージョン/メインブランチに入るすべてのコードにコメントを付けないでください。誰かが「どうすれば違うやり方ができるか知りたい」と言った。言及された理由により、それはいらいらしているだけです。それは時代遅れ、回避策、または別の方法ですか?WTF
アンSchuessler

VS2013 "Peeks"では、これはすべて窓の外にあります。しかし、「変更された方程式-イニシャル」などのコメントを追加するため、必要に応じてTFS / VCSで古いコードがどのように見えるか疑問に思う人がいます。したがって、コメントアウトされた10行ではなく1行です。しかし、VS2013は素晴らしいです。TFSの履歴がすぐにわかります。
-Suamere

17

私がこれまで参加した中で最悪のコーディング標準は、まったくないコードベースです。私は、まったく存在しないコードベースで作業するよりも、完全に反対するコーディング標準に従います。コードベースの新しい部分を習得するのがずっと難しくなります。


16

バージョン管理のためのインラインコメントの強制は、私が無視した最も無意味なコーディング標準に関するものでした。

//Changed on 2/2/2004 By Ryan Roberts for work item #2323332
Dim Some Horrendous VB
//End Changed

200を超えるフィールドと40のトリガーを持つ競合の激しいテーブルでデータベースを「維持」しながら、空白の正しい使用を主張したOracle DBAが間近に迫っています。


それはかなり凶悪です
エヴァンプライス

5
うーん。点心...-
コンフィギュレー

もちろん、ソース管理を行う前にこれを行いました。ソース管理ができるようになると、それはそのような習慣になり、チームがそれをやめるための介入が実際に必要になりました。最終的には、既存のものをすべて見つけたときに停止して削除しました。
スコットホイットロック

私たちの上級開発者は、まだ私たちにこれをさせようとしています。私は、私がそれで逃げることができると思うときはいつでも(そして、時々、私ができないことを知っているとき)ポリシーを無視します。
ジョシュアスミス

私たちのチームには、今でもどこでもこれを行う人がいます(彼はまた、バージョン管理下にあるSQLスクリプトに巨大な "変更ログ"を含んでいます)。引数は、私に説明したように、いくつかの変更/コミットの後、何かが変更された日付を覚えていないため、変更ログは、ファイルを開いたときに誰が何を変更したのかをすぐに知るのに適しています。
ウェインモリナ

14

すべてのクラスメンバー関数の前にクラス名と可視性を付けることを決定したC ++の最初のタイマーが率いるプロジェクトでコードレビューを行いました。

class MyClass
{
   public:
      void MyClass_Public_setValue(int value);
}

1
なぜ彼らに尋ねました?私は彼らの動機を知りたいです。
JBRWilkinson10年

1
うわー、なぜその男はクラスを使用しているのですか?
Mateen Ulhaq

9

すべてのコードを4つのスペースでインデントする必要があります;)


2
これはどうでしたか?
ジェイバズジ

1
そのため、すべての行の先頭に不要なスペースが4つあるのですか?
-nohat

ああ、私は今それを得る。
代替案

21
ええ、StackOverflowには本当に悪いコーディング標準があります。:-)
Pシュベード

大きなインデントを使用すると、コードのネストレベルを低く保つ必要があります。私は8のインデントを見てきましたが、うまくいきました。
トゥーンクリティ

9

私は何年も前に、すべてのコードを左揃えにする必要があり、インデントなしで仕事をしていました。そのポリシーを思いついた男は、長いコード行を表示するときに水平方向に前後にスクロールしなければならないことを嫌い、目でピンポンを演奏していると見なしました。


それは恐ろしい、恐ろしいコーディング標準に従う必要があります。そして、その愚かな理由も!
ギャブリン

4
横にスクロールする必要がある場合(たとえば、半ページ以上)、おそらく何か間違っている可能性もあります。コードが完全に読めなくなるため、インデントも良くありません。私は78コルの制限に固執しようとしますが、その量を超える必要がある場合は気にしませんが、それを避けようとします。
Htbaa

8

これは、コーディング標準がないことがいかに痛いのかという例です。

大手銀行で働いている請負業者は、この基準に従うことが史上最高だと主張しました。このアプリケーションはdBase / Clipperで書かれており、彼は彼が唯一の開発者であり、もちろん彼は標準を思いつきました。

  • すべて大文字です。彼が行ったまれなコメントを含む、すべてを意味します。
  • インデントなし。
  • 変数の命名は、APRGNAMEに沿ったものでした。A =変数のスコープ、たとえばPはパブリック、PRG =変数を作成したソースファイルの最初の3文字、NAME = dBase / Clipperが許可した残りの6文字の変数名。
  • ソースコードの最初の4行と最後の4行は80 *長でした。どうして?そのため、ドットマトリックスプリンターがファイルの印刷を開始および終了するのを聞くことができました。メモリは、プログラム全体が毎週メインフレームを介して20,000ページ印刷されたものです。
  • 私は自分の脳から何とかして捨てたものがもっとたくさんあると確信しています。

私はその段階で非常に新しい独学のプログラマーでしたが、プロジェクトを引き継ぐように依頼する前に、気違いの科学者に耳を傾けて地獄から抜け出せないほど十分に知っていました。

そして、はい、私たちはこれらの慣行がどれほど悪いかを経営者に話しましたが、いつもいつも「この請負業者に彼が話していることを知らなければならない最高のドルを支払っていました」。


7
古い恐竜をm笑しないでください。 彼らは私たちを可能にしました。
P Shved

4
仕事のセキュリティのようですね。
MIA

7
各ファイルがいつ印刷されるかがわかるようにオーディオマーカーを用意することは、巧妙です。ここで\07、各ファイルの先頭に追加します。
コンフィギュレー

2
dBaseの変数「スコープ」ルールが存在しなかったため、このような命名スキーム(大文字ではない)を使用することは意味がありました。すべてが事実上グローバルでした。i1つのプロシージャで配列のインデックスを作成するために使用するiと、呼び出し元のプロシージャで干渉する可能性があります。この「シャドーイング」を使用PRIVATE ALL LIKE m*PRIVATE i、防止する必要があります
ジェリー

8

私の過去からのもう一つの爆発。

会社の所有者からの引用:

Javaで書かれた{expletive}プロジェクトで2500万を失ったため、解釈言語を使用して記述されたコードはありません。

Javaプロジェクトは、数十の株を処理するように設計された株取引システムであり、現在では数千を処理するために使用されています。設計上の欠陥や貧弱なハードウェアに対処する代わりに、会社全体がすべての非C / C ++アプリケーションをC / C ++に変換することを余儀なくされ、すべての新しい開発はC / C ++で行わなければなりませんでした。解釈言語はコンパイルされていないものを意味し、所有者はアセンブラー、C、C ++のコンパイルのみを検討しました。

コードの大部分がJavaとPerlである800人の会社にとって、これは会社全体が今後数年間でC / C ++で完全にすばらしいコードを書き直すことにほとんどの時間を費やすことを意味しました。

面白いことに、この大失敗の約20年前、私は別の会社にいました。この会社では、ソートロジック(バブルソート)をクイックソートに置き換えるのではなく、アセンブラーで再コーディングする必要があると技術リーダーが判断しました。パフォーマンスを改善しません。パフォーマンスを改善する唯一の方法は、アセンブラーで同じロジックを書き換えることです。

どちらの場合も、口述が下がってすぐに私は去りました。


どちらの会社も今日も稼働していますか?
finnw

Javaから「移動」したのは、もう1つがなくなってからです。彼らはTRS-80からPCへの移行に耐えることができませんでした。
デビッドB

6

多くのプログラマーと同じように(しかし十分ではありませんが)、コード装飾は嫌いです。ゲッター/セッターがなくても、変数名にドル記号($)プレフィックスを使用したり、プライベート変数にアンダースコアを使用したりする必要がある場合、私を怒らせます。それを理解するためにコードを装飾する必要がある場合、あなたは地獄を抜け出す必要があります!


「ウィル」が言うように、「私はプライベート変数がインテリセンスでグループ化されるようにアンダースコアを付けます。しかし、これは型にスコープされた変数に対してのみ行います。メソッドまたはより狭いスコープ内で宣言された変数はアンダースコアを残しますオフ。それらを簡単に分離し、使用頻度の低い変数を簡単にまとめられるようにします。」私は彼に同意しなければなりません。
7 wp

1
お気に入りのプロプライエタリIDEで変数をグループ化することは、すべてのコードを傷つけるのに十分な理由ではないと思います。
アダムハート

それがあなたのコードであるなら、あなたのIDEでそれを使用可能にすることは完全に合理的です。また、アンダースコアを前に付けることは多くの言語で一般的であるため、人々がそれを見るたびに、その意味を知っています。
rjmunro

1
+1優れたIDE(正規表現検索を使用できるIDE )を使用することは、私にとってより理にかなっています。IDEをスクラッチし、テキストエディターとターミナルの使用方法を学ぶと、はるかに優れたプログラマーになります。補足として、私は特にperl sigilsが好きではありませんが、少なくともPHPのものとは異なり、用途があります。
代替案

6
ため息...もう1人の「IDEは猫用」の人々。
ネイラー

6

私はしばらくの間、渡されたすべてのパラメーターにP1、P2、P3などの名前を付ける必要があったWebシステムで作業していました。

また、厳密にはコーディング標準ではありませんが、同じシステムでは、すべてのファイルにxyz0001.ext、xyz0002.ext、xyz0003.extなどの名前が付けられていました。xyzはアプリケーション自体のコードでした。


6

これはずっと前-正確には1976年です。上司はEdsger Dijkstraのことを聞いたことも、CACMの問題を読んだこともありませんでしたが、どこかから「GOTOが悪い」という噂を聞いたため、COBOLプログラムでGOTOを使用することは許可されませんでした。これは、COBOLが「end if」を追加する前でした。そのため、当時は3つの古典的な制御構造(シーケンス、if / then / else、実行(つまり、do while))のたった半分しかありませんでした。彼は、基本プログラムでGOTOを許可し、アセンブラー言語プログラムで分岐命令を許可しました。

これは一種の「あなたがそこにいなければならなかった」物語であることにごめんなさい。私の知る限り、1976年以降に発明されたすべての言語には適切な制御構造があり、GOTOを使用する必要はありません。しかし、要点は、ボスはなぜGOTOが有害であると考えられたのか、どの言語が乳児障害であり、どの言語が致命的な病気であるのかを決して知らなかったということです。


6

プロジェクトで働いたのは、チーフアーキテクトが明示的なコードを(あまりにも)書くことを要求したときでした。コードで見つけた最悪の例の1つ(そして彼は喜んで承認しました)は次のとおりです。

private string DoSomething( bool verbose )
{
    if ( verbose ) { return someString; }
    else if ( !verbose ) { return otherString; }
    else { return string.Empty; }
}

ReSharperでさえ、これは間違っているとあなたに言った!


9
voidとして宣言された関数から何かを返すのは難しいでしょう。
ミルチャチレア

7
@MAttB最後の(else)ブランチがどのような条件で取られるかを検討してください。
リチャード

6
else {return string.Empty; }は、上記の2行が5年後にメンテナンス開発者によって編集されたときに実行されます。ただし、string.Emptyを返すことにより、不可能な状態であるという事実が隠されます。代わりにInvalidOperationException( "このコードは3つの値のロジックをサポートすることを意図していませんでした");
マシューマーティン

1
これは恐ろしいことです。何が問題なのreturn verbose ? someString : someOtherString;ですか?
カラムロジャース

1
@callum三項演算子は禁止される可能性があります:)の前にありまし...
hplbsh

6

私の最後の仕事では、「標準」は、私を雇った男から与えられたものの非常に強い用語です。ColdFusionとSQLでWebサイトをプログラミングすると、次のようなコーディング要件が与えられました。

  • includeを使用しないでください。1つの大きなページが好き
  • 変数名と列名の単語は常にアンダースコアで区切ります(isactive、firstnameなどを除く)
  • 略語を使用しないでください-常にファーストネームを書きます(頻繁にfnameなどを書きました)
  • 紛らわしい名前(amount_chargedやcharge_amountなど、異なるが関連するものを測定したもの)を使用しないでください。
  • DIVを使用せず、最小限のCSSを使用します。代わりにネストされたテーブルを使用します(一度に6層の深さが見つかりました)。
  • クエリをキャッシュしないでください。今まで。
  • 複数のページで変数を使用しますか?アプリケーションの範囲。
  • 各ページは、独自のtry / catchブロックです。グローバルエラーハンドラは不要です。

彼が辞めたらすぐにこれらを変え始めました。


私には十分な公正と思われる「紛らわしい名称を使用しないでください」...
8128

1
それは絶対に公正なガイドラインです。私のポイントは、彼がそれに従わなかったことです。「混乱しない」という彼の考えと私の考えは違うと思います。
ベンドゥーム

4

私のC ++コーダーとしての生活の中で、2つの非常に厄介な「ルール」が実施されました。

  1. 「VC ++ 4.1ではサポートされていないため、STLは使用できません(現時点ではVC ++ 6.0に切り替えることはできません)。」
  2. 「QuickSortを使用しないでください。不適切な場合はO(n ^ 2)になる可能性があります。HeapSortアルゴリズムのこの実装を使用してください。

6
プロジェクトリーダーのHeapSortの何が問題になっていますか?
7 wp

4
実際、コードが外部ユーザー入力を受け入れた場合、QuickSortはO(n^2)DOS攻撃(最悪の場合の入力)にさらされるため、間違っている可能性があります。また、切り替えることができなかった理由-それ自体は、STLを使用しない正当な言い訳でした。
マチェイピエチョトカ

4

すべてのクラスとクラスメンバーのXMLドキュメントを強制的に作成します。プライベートを含む。デフォルトのghostdocコメントを使用することをお勧めします。

public class User 
{
    /// <summary>
    /// the _userID
    /// </summary>
    private int _userID;
}

この以前の回答と非常によく似ています
finnw

はい。私もプライベートメンバーにコメントする必要があります。これはさらに意味がありません。
カールベルクキスト

ghostdocの使用を推奨しますか?!Gah-
コンフィギュレー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.