あなたが従わざるを得なかった最も奇妙なコーディング標準規則は何でしたか?[閉まっている]


173

私がこの質問をしたとき、私はほとんど常に明確なイエスを得ました、あなたはコーディング標準を持つべきです。

あなたが従わざるを得なかった最も奇妙なコーディング標準ルールは何でしたか?

そして、最も奇妙なのは、おかしな、または最悪の、または単なる奇妙なことです。

それぞれの回答で、どの言語、あなたのチームの規模、およびあなたとあなたのチームにどのような悪影響を及ぼしたかを述べてください。


19
このリストを突然読んだ後、私はこの強制された標準的ながらくたを回避するために非常に幸運なキャリアを持っているように感じます!
matt b

次回の就職の面接では、この質問を参照して、「Red Flag。Run!」の役割を果たします。インジケータ。確かに、標準的なアンチパターンのコーディング。
Stu Thompson、

5
そして、私はキャリアのごく初期に、チームに答えの1つを課したことを認めて恥ずかしいです。ごめんなさい、みんな。
JasonFruit 2010年

回答:


434

私は嫌い、複数のリターンの使用が禁止されているときにそれを。


26
このルールの想定されるポイントは何ですか?個人的には、別のリターンを入れることによって読みやすくすることができるコードのコードレビューに失敗します。
Mark Ba​​ker、

22
一方、 "if(param == null)return null"のようなオプションを最初に削除すると、コードをかなりクリーンアップして、多少の犯罪を助長する代わりにこれを禁止することができます。
Bill K

39
回避策:if(!Initialize()){RetVal = ERR_BADINIT; goto ReturnPoint; }(さらに多くのコード)ReturnPoint:RetValを返します。} 問題が解決しました!;)
Marc Bernier、

9
最近まで、複数の返品は禁止されていました。次に、これがCからの残り物であり、C ++ RAIIによって廃止され、サイズが15行未満の関数であることが明らかになりました。それ以来、ブレイブハートのように:「FREEDOM !!!!」... :-p ...
paercebal 2008年

122
選択:複数のリターンまたはよりネストされたifステートメント。複数回返品いたします。
ランスフィッシャー

333

逆インデント。例えば:

    for(int i = 0; i < 10; i++)
        {
myFunc();
        }

そして:

    if(something)
        {
// do A
        }
    else
        {
// do B
    }

152
ああ、なんてこと…あれを思いついた社会人に会える?彼は私にミサントロピーについて一つか二つを教えることができました。
John Rudy

23
それはおそらく本当ではありえない。
デーン、

191
インデントを逆にするたびに、神はメンテナンス開発者を殺します。
Chris Vest、

14
OMG、冗談ですか?
Andrea Ambu、

21
貴重なバイトを節約...貴重な、それをたくさん使う
Spikolynn

326

おそらくあなたが得る最も奇妙なものではないかもしれませんが、データベーステーブル名の前に 'tbl'を付ける必要がある場合私は本当に嫌いです


5
これはDBのハンガリー表記にすぎませんか?
ARKBAN、2008年

19
これは、変数の前にvarを付けるようなものではありませんか?
ブライアンR.ボンディ

26
同様に、データベースのID列にテーブル名がプレフィックスとして付けられると、productテーブルのようにproductid列ができるので、私は嫌です。ORMなしのスクリプトを必要以上に頭痛の種とする冗長性
Andrew Ingram

30
実際には、ID列の前にテーブル名を付けることを好みます。クエリの記述が少し簡単になります。また、外部キーの場合、外部キーフィールドをキーフィールドと同じにすることができます。
クレイグ、

38
同様に、テーブル名が単数形でなければならない場合は嫌です。私の本能は、たとえば「顧客」ではなく「顧客」を保持するテーブルに名前を付けることです。テーブルに「[Transaction]」ではなく「Transactions」という名前を付けることができれば節約できるすべての問題に気付くまで、マイナーに聞こえます。
アタリオ2008年

248

ほとんどすべての種類のハンガリー語表記。

ハンガリー語の表記の問題は、誤解されがちなことです。元々の考えは、意味が明確になるように変数にプレフィックスを付けることでした。例えば:

int appCount = 0; // Number of apples.
int pearCount = 0; // Number of pears.

しかし、ほとんどの人はそれを使用してタイプを判別します。

int iAppleCount = 0; // Number of apples.
int iPearCount = 0;  // Number of pears.

どちらの数値も整数ですが、誰もが知っているので、これは混乱を招きます。リンゴと梨を比較することはできません。


71
ハンガリー語表記の適切な使用がバグの削減にどのように役立つかについては、このJoel on Softwareの投稿を参照してください:joelonsoftware.com/articles/Wrong.html
flicken

9
もちろん、Cの代わりにC ++を使用することで、リンゴを梨と比較するときにコンパイラーがエラーを出すようにコードを書くことができます。
Andreas Magnusson

5
はい、ジョエルはそれを正しく理解しました。Joelのバージョンを適用するようにコンパイラーを作成できるといいのですが。
Loren Pechtel 2008年

9
それは「int cntApples = 0; int cntPeas = 0;」ではありませんか?つまり。接頭辞は変数「種類」です。
Blorgbeardは

42
少なくとも最初のものは正解です。「Apple」が含まれているものはすべて「i」をプレフィックスとして付ける必要があります。;)
ヨハネスチャラ09

240

私が現在働いている場所では三項演算子は許可されていません:

int value = (a < b) ? a : b;

...誰もが「理解する」わけではないからです。「構造が複雑になりすぎた場合は書き直さなければならなかったので、使用しないでください」(ネストされた3項演算子、誰か?)と言われたら、理解できるでしょう。しかし、一部の開発者がそれらを理解していないと私に言ったとき...ええと...もちろん。


235
誰にとっても、あなたの上司は自分自身を意味します。
ブライアンR.ボンディ

13
私はかつてこのキャンプに陥っていました...しかし、それから成長し、条件付き演算子を愛することを学びました(適切な場合)。
ジョンルディ

22
どちらかと言えば、ルールは「常に三項演算子を使用する」、つまり純粋な美しさの演算子である必要があります:)
Bobby Jack

16
私はそれを愛していますが、私が最も頻繁に使用しない理由は、「人々がそれを理解できない」あなたの経験と同じです。私の主張は、彼らがコンセプトを理解できないなら彼らは働いてはいけないということです...
Aidos

7
まったく新しい関数を記述せずに、定数変数を条件付きで初期化する方法は他にどのようにありますか(これは読みやすさの点であまり良くありません)。ローカルの「変数」にconstを使用すると、3項演算子を禁止するよりも、コードを理解して追跡するほうがはるかに効果的です。
Andreas Magnusson

239

変更を加えるときにコードを削除しないでください。すべての変更についてコメントするように言われました。ソース管理を使用することに注意してください。このポリシーは長続きしませんでした。開発者がそれについて騒動を起こし、コードが読みにくくなるからです。


3
私は実際に(それはしかし、標準または何もありません)、ここでそれを行う少数の人々があること...嫌い
chills42

7
そのようなルールがあるため、他の人から継承したソースコードをカラーで印刷する必要があると感じています。ほんの少しのページで、それは私の会社にとってあまり良くありません-しかし、私がそれを印刷しなければならない場合、それを読むことができる唯一の方法です。(私たちはこのルールに従った多くを継承しました...)
ジョン・ルディ

3
ルールのように聞こえますが、ソースコントロール前に開発されました。または、プログラマが週に1回のみチェックインするため。
クレイグ、

6
私の仕事が100倍良く見えるので、私はこれらの回答を読むのが大好きです。
rjh

2
感じてください...私たちは4年以上SVNを使用していますが、上級開発者はそれを嫌い、約2か月に1回チェックインし、壊れたコードについて次の3日間を費やしています:/
Viktor Svub

204

私はかつてMighty VB Kingの専制政治の下で働いていました。

VB王は(MS ExcelとVBAだけでなく、データベースの純粋なマスターだった:開発者がコンパイラで働いていた間、彼はエクセルで演奏し、データベース上で彼に挑戦しています...あなたのキャリアに有害な影響を持っている可能性が故に彼の姓)。

もちろん、彼の計り知れないスキルは、開発問題とプロジェクト管理ソリューションのユニークなビジョンを彼に与えました:厳密な意味で正確にコーディング標準ではありませんが、VBキングは定期的に「コーディング標準」と「ベストプラクティス」について新しいアイデアを持ちました(そしてしばしば成功した)私たちに課すこと。例えば:

  • すべてのC / C ++配列は、0ではなくインデックス1から始まります。実際、配列の最初のインデックスとしての0の使用は廃止され、Visual Basic 6の洞察に富んだ配列インデックス管理によって置き換えられました。

  • すべての関数はエラーコードを返します。VB6には例外がないので、なぜそれらが必要なのでしょうか。(すなわちC ++で

  • 「すべての関数はエラーコードを返す」は意味のある型を返す関数には実用的ではないため、すべての関数は最初の[in / out]パラメータとしてエラーコードを持たなければなりません。

  • すべてのコードがエラーコードをチェックします(これにより、VBScriptのif-indentationが私のキャリアの中で最悪のケースにつながりました...もちろん、「else」句が処理されなかったため、実際にはエラーは遅すぎるまで見つかりませんでした)。

  • C ++ / COMを使用しているため、この日から、すべてのDOMユーティリティ関数をVisual Basicでコーディングします。

  • ASP 115エラーは悪です。このため、VBScript / ASPコードでOn Error Resume Nextを使用して、それらを回避します。

  • XSL-Tはオブジェクト指向言語です。継承を使用して問題を解決します(おかしな驚きがこの日あごを開いてほとんど壊しませんでした)。

  • 例外は使用されないため、削除する必要があります。このため、例外の巻き戻しが発生した場合にデストラクタ呼び出しを要求するチェックボックスをオフにします(エキスパートがこれらのすべてのメモリリークの原因を見つけるのに数日かかり、彼が喜んで無視していたことを知ったとき、彼はほとんど暴走しました(そして非表示)オプションを再度確認することに関する彼の技術的なメモ数週間前に送信されました)。

  • COMモジュールのCOMインターフェイスですべての例外をキャッチし、それらをサイレントに破棄します(このようにすると、クラッシュする代わりに、モジュールが高速であるように見えるだけです...実際に何が起こっているのかを理解するのに少し時間がかかりました...速度と正確な結果の両方を持つことはできませんか?

  • 本日より、コードベースは4つのブランチに分割されます。私たちはそれらの同期を管理し、すべてのバグ修正/進化を手作業で統合します。

すべてが、C / C ++の配列VB DOMのユーティリティ関数XSL-T OOP言語は以下のように私たちの抗議にもかかわらず、実施されました。もちろん、時が経つにつれ、発見されたり、壊れたり、完全に放棄されたりするものもありました。

もちろん、そのためにVBキングの信頼性が損なわれることはありません。上級管理職の間で、彼は「トップガン」の技術エキスパートであり続けました...

リンクをたどることでわかるように、これによりいくつかの面白い副作用が生じました。これまでに遭遇したソースコードの中で最高のコメントは何ですか?


28
Re:1インデックス。時々、あなたは立ち上がって「それは愚かで間違っている」のような強いことを言わなければなりません。砂に線を引きます。エゴを喜ばせるのを忘れて、それを言うだけです 。私はほとんどすべての他の価値のあるプログラマはすぐにうなずきを開始しに参加することを保証することができます
カークStrauser

31
@jrista:私のテキストのスペルをコメントしない場合は、以下を無視してください... ... ... ... ... ... ... ...私のテキストをコメントする場合は、 (1)修正案を提案する、(2)自分でスペルを修正する、または(3)世界中のすべての開発者(それから遠く離れている)が英語を母国語とするわけではないことを考慮してください。または、
フランス語で

4
この人が私の上司である場合、私は上層部のすべてのメンバーに直接書いて、文書化された文書化された苦情のリストを提出し、彼を解雇させたでしょう。自分のために立ち上がるボールがない場合は-1。
muusbolla

34
@muusbolla:誰も私たちが文句を言わないと言ったの?2人の代表団(私を含む)が問題を説明するためにCEOに直接行くまで、それはエスカレートしました。しかし、正義が支配する理想主義的な世界と、一部のボスが「たとえそれがあったとしても、経営は決して間違っていない」と信じており、あえてその教義と矛盾するでしょう。そのときからお土産は、3年ほど前に辞任した日だけで、あの日から幸せな人です。とにかく、もし真実なら、あなたのダウンモッドの理由は不十分です。ごめんなさい。
paercebal 2009

7
@paercebal:Engénérale、c'est correctement ecrit、sauf que quelques petits erreurs:«squatch»:çadoitêtre«squash»; «this one day»:en cecontext-là、dirait«that day»; «ストックされた手順»:«ストックされた手順»; «chocked»s'écrit«choked»。Aussi、dans les commentaires、vous utilisez°mentionned»、ce qui doitêtre«言及»Mais vraiment、tutçane justifie pas une telle plainte。Au contraire、vous y montrez une Excellenceemaîtrisede l'anglais; フェリシテーション!
2010年

131

80年代/ 90年代に戻ると、FORTRANを使用する航空機シミュレーター会社に勤務していました。FORTRANコンパイラーでは、変数名に8文字の制限がありました。同社のコーディング標準は、最初の3つをハンガリー語表記スタイルの情報用に予約しました。したがって、5文字だけで意味のある変数名を作成する必要がありました。


17
贅沢:たった6文字でした。パッケージの名前はgで始まりました。内部関数はすべてgkを開始しました。0p(gk0pが最初)などのコードを持つワークステーションドライバーがあり、残りのFortran名に2文字残っていました。gk0paa、gk0pab、...
ジョナサンレフラー

103
「私があなたの年齢だったときは、2文字しかありませんでした。大文字と小文字は区別されませんでした。」
pookleblinky 2008年

53
以前は、就寝の3時間前の朝2時に起きてから、独自のコンパイラーを作成し、会社に出勤する特権を支払わなければなりませんでした。変数名には文字Aのみを使用できました。次に、上司がコードを削除し、ハレルヤを歌ってリスティングを踊ります。
David Arno、

12
「50の可能な識別子は誰にとっても十分であるべきです」:p
Chris Vest

5
ヘック、私たちがずっと前に作業したBASICインタープリターには2文字の変数名がありました。5について文句を言うのはなぜですか?
David Thornley、

107

2社合併の場所で働いていました。「支配的」なサーバーには、K&R C(つまり、ANSI以前)で書かれた主要サーバーがありました。彼らは、Javaチーム(両方のオフィスから-おそらく合計20人の開発者)にこのフォーマットを使用するように強制しました。このフォーマットは、「ブレースの議論」の2つの柱を喜んで無視し、まっすぐに夢中になります。

if ( x == y ) 
    {
    System.out.println("this is painful");
    x = 0;
    y++;
    }

18
CとJavaの視覚的な区別を大きくすることで、移行が容易になると思います。(+1の「そしてクレイジーに直行する」。)
ジェフリーLホイットリッジ

4
Petzoldによるオリジナルの「プログラミングウィンドウ」で使用されていたWhitesmithsスタイルのように見えます。;)
ボビージャック、

7
これは最もインテリジェントなブレーススタイルです。残念ながら、ほとんどの人はそれを使用しません。中括弧に意味的な意味がある場合は、それらをそのように扱う必要があります。行の終わりに留まって無視されません。
Ryan Lundy

7
@キラレッサ。同意しない...中括弧に意味的な意味があるかどうかはわかりませんが、パターンマッチングと空間の感覚に影響を与える可能性があります。IMO、このバージョンはそれを完全に失います。たとえば、ブックマークを本の外に突き出して、ページと同じ高さにしないでください。
マイケルイースター

6
これは実際には私の好みのスタイルですが、世界中のすべて(特にVisual Studio)はデフォルトで他のモードになっているので、あきらめました。 なぜそれが好きなのですか?中かっこ、含まれているコードの「一部」です。それらは、ifに対して単一のステートメントのように見えるように強制します。
アタリオ2008年

104

禁止:

while (true) {

許可:

for (;;) {

4
他のものは、それfor (;;) {が最初のCイディオムであると主張しました。
ロバートP

69
私が現代の新しいつまらないスマイリーを正しく理解している場合、この標準は貧しい人々を過剰に働きかけ、声を上げようとしています!
ベンブランク

15
これは事実上のルールです。VC6は、while(true)に関するコンパイラ警告を発行しますが、for(;;)に関する警告は発行しません。それ以外は同等です。そこで、警告のないものを選びます。
user9876 2009

22
Bjarne S.は彼の本の中で、「(;;)は永遠に読むべきだ」と述べた。C ++の作成者にとって十分なものであれば、それで十分です。:-)
フランク・クルーガー、

58
私が最初に取り組んだCプログラムでは、誰かが#define ever(;;)を追加したので、「いつまでも{...}」と言えるでしょう
James Curran

101

私の友達(私たちは彼をCodeMonkeyと呼びます)は、彼の最初の仕事を大学で(年も前に)COBOLの社内開発を行っていました。彼の最初のプログラムは、それを使用していたため、「標準に準拠していない」として拒否されました...ネストされたIFステートメント

コーディング標準はネストされたIFステートメントの使用を禁止しました

さて、CodeMonkeyは恥ずかしがり屋ではなく、自分の能力を確信していたので、彼はすべての人にチェーンを上り、通路を下りてこのルールが存在する理由を尋ね続けました。ほとんどは彼らが知らなかったと主張し、一部は「読みやすさ」についてのものを作り、最後に一人が元の理由を思い出しました:彼らが使用したCOBOLコンパイラの最初のバージョンにはバグがあり、ネストされたIFステートメントを正しく処理しませんでした。

もちろん、このコンパイラのバグは少なくとも10年間は​​修正されていましたが、誰も標準に挑戦していませんでした。[ばああ!]

CodeMonkeyは標準を変更することに成功しました-最終的に!


7
O):スティーブン、これは私のサルの実験の話思い出させfreekvermeulen.blogspot.com/2008/08/...
ニックDandoulakis

5
@ [ニックD]:はい、私もそうです-したがって、コード名「CodeMonkey」;-)
スティーブンA.ロウ


理由は間違っていたかもしれませんが、ネストされたifs-c2.com/cgi/wiki?ArrowAntiPattern
manojldsの

97

アンダースコアが禁止されたプロジェクトにかつて取り組んだことがある。そして私は完全に禁止されていることを意味します。したがって、c#winformsアプリでは、新しいイベントハンドラー(ボタンなど)を追加するたびに、デフォルトのメソッド名をbuttonName_Click()から別の名前に変更し、コーディングを書いた人の自我を満たす必要があります。標準。今日まで、私は彼が謙虚なアンダースコアに対して何を持っていたのかわかりません


23
多分_は彼のキーボードで壊れていました;)
ロマンプラシル

139
buttonNameUnderscoreClick()
vitule 08/10/20

9
デバッグにFILELINEを使用できないという残念な副作用があります。ヘッダーファイルの#if __cplusplus extern "C"。そして、stdint.hの整数型。そしてsize_t。
スティーブジェソップ

8
これがC#だったのは良いことです
コンフィギュレータ

4
。それはだ上記OPケースではありませんが、私は真剣に(アンダースコアを落胆私はパスカルやラクダの場合はうまくやるだろうとき私に入れているしたくないという余分な2つのキーストローク(シフト+ _)。
TGnat

92

まったく役に立たないデータベースの命名規則。すべてのテーブル名は数字で始める必要があります。数字は、テーブルにあるデータの種類を示します。

  • 0:どこでも使用されるデータ
  • 1:特定のモジュールのみが使用するデータ
  • 2:ルックアップテーブル
  • 3:カレンダー、チャット、メール
  • 4:ロギング

そのため、名前の最初の文字しかわからない場合、テーブルを見つけるのが難しくなります。また、これはmssqlデータベースなので、テーブル名をすべて角括弧で囲む必要があります。

-- doesn't work
select * from 0examples;

-- does work
select * from [0examples];

65
申し訳ありませんが、ひどく申し訳ありません...
Kirk Strauser

1
うわーいいね。手紙の使用は問題外だったと思いますか?それも良い考えではありませんが、少なくとも、すべてのテーブル名を引用する必要はありません。
マークブリッティンガム

気が遠くなる…誰がそれを思いついたの?dba?
dotjoe 2009

90

私たちはC ++プロジェクトをやっていて、チームリーダーはPascalの人でした。

そのため、厄介なCおよびC ++構文をすべて再定義するためのコーディング標準インクルードファイルがありました。

#define BEGIN {
#define END }

まだまだあります!

#define ENDIF }
#define CASE switch

等々結局今でも覚えるのは難しいです。

これにより、完全に読み取り可能なC ++コードが取得され、チームリーダー以外の誰もが判読できなくなります。

また、ハンガリー語の逆表記を使用する必要がありました。

MyClass *class_pt  // pt = pointer to type

UINT32 maxHops_u   // u = uint32

奇妙なことに私はこのように成長しました。


22
未来に向けた
保守不可能な

2
ハンガリー語の表記は正しく行っても問題ありません。間違えました... 適切な型システムは両方に勝ります。
Thelema、

5
私はあなたと一緒にいると思います。ハンガリーのいぼは、そのように最後に付け加えられても、それほど不快ではありません。
TED

私はPascalからC ++に切り替えたとき(約16年前)に私を連れ戻します。私は{はBEGINを意味することを意味します。少なくとも私にとっては、それはちょうど私の頭の中にありました。
thomasrutter 2009年

6
私がMS VC ++サポートで働いていたとき、このように書かれた再現コードをいくつかの顧客に提出してもらいました。実際にはC ++であることに気づくまでに少し時間がかかりました(#definesが含まれていませんでした)。
JBRウィルキンソン2010

88

以前の仕事で:

  • 「通常の」テーブルはT_で始まります
  • 「システム」テーブル(通常はルックアップ)はTS_で始まります(その日に誰かがそのような気分でなかったためにそうでない場合を除きます)
  • 相互参照テーブルはTSX_で始まります
  • すべてのフィールド名はF_で始まります

はい、そうです。各テーブルのすべてのフィールド。それがフィールドだとわかるように。


主キーフィールドに特別なプレフィックスはありませんでしたか???
Czimi 2008年

2
@Czimi:私はそのことを忘れていました。すべてのテーブルには、主キーとして使用されるFI_IDというフィールドがあります。
Jeromy Irvine、

31
聖なる…この悪夢を発明したT_guyはF_gunで殺され、TSX_hellに送られるべきです。
Sergey Skoblikov、

3
すべてのフィールドとテーブルにtblとfldがありました。完全に役に立たない...
コンフィギュレータ

5
@configurator:すべてのフィールドに「tbl」、すべてのテーブルに「fld」がありましたか?:
Timwi

84

私の仲間は、政府の仕事で働いている間にこのルールに遭遇しました。++(preまたはpost)の使用は完全に禁止されました。理由:コンパイラーによって、解釈が異なる場合があります。


5
ええと、その時点で、あきらめたほうがいいでしょう。
カークストラウザー2008年

90
一部の人は、postfixとprefixの違いを理解しなかったために噛まれ、コンパイラのバグを主張し、他の人にそれを与えたと私は思います。
バーナード

5
実際、状況によっては、それらは正しかった。しかし、禁止は少し上にあるようです。たとえば、次の行を考えてみます。a [i] = i ++; インデックス付けに使用される前、または後にインクリメントされる場合があります。言語はこれを定義していません。
TED

9
彼の言うとおりです。ステートメント内の他の場所で同じ変数を使用した場合、演算の順序は保証されません。ただし、あいまいになる可能性のあるコードをすべて禁止しているだけです。
Loren Pechtel 2008年

2
=未定義の動作を引き起こすために使用できるので、禁止することもできます。
コンフィギュレータ

81

チームの半分は4スペースのインデントを支持しました。残りの半分は2スペースのインデントを優先しました。

ご想像のとおり、「すべてを平等に攻撃する」ために、コーディング標準では3つが義務付けられています(直接引用)。


42
そのため、タブの識別は非常に優れています。誰もが彼のエディタでサイズを変更できます;)
xardias

41
ええ、タブのインデントは素晴らしいです...実際に他の人のファイルを開いて、スペースが本来あるべき場所に混ざっていない、または本来あるべき位置にスペースが混ざっていなかったために位置がずれているのを見つけるまで。次に、自動再フォーマットし、バージョン管理の差分が醜くなります。ああ。
アランヘンゼル、

41
そのため、インデントにはタブのみを使用し、配置にはスペースのみを使用することになっています。トウェインは決して接触しません。ファイルの空白に変更を加える場合は、それがその特定のチェックインに対して行う唯一の変更である必要があります。
joh6nn 2009年

16
...そしてそれは決して機能しません。:P
ロバートP

10
「すべてを平等に攻撃する」...私はそれが大好きです。次回、インデント標準化戦争に何らかの形で興味を抱いたときは、これを覚えておく必要があります。
マイケル・バー、

74

マネージャーが「魔法」が多すぎると主張したため、Reflectionを使用できない。


10
ええ、魔法は維持するのが難しいようです。
Rik

19
間違った理由から、それはおそらく正しいルールです:)
ボビージャック

71
「魔法の」読み取りパフォーマンスのために、保守不可能なあいまいな悪夢のコードを殺します。彼は正しい。
gbjbaanb 2008年

4
そのときは、.Netでのコード作成はまったく許可されていなかったと思います。結局のところ、フレームワークの実行方法の多くはリフレクションによるものです。
NotMe 2008年

5
それらのウィザードでダウン!! 彼らの魔法で常に周りに、私たちの仕事を盗み、私たちの女性を誘惑し、私たちの子供たちを堕落させています!
ZJR、2010年

71

私が持っていた非常に奇妙なもの、そして私を倒すのにかなりの時間を要したものは、私たちの会社の所有者が私たちの新製品がIEのみであることを要求したときでした。FireFoxで動作する場合は問題ありませんが、IEのみである必要があります。

これは、1つの小さな欠陥を除いて、あまり奇妙に聞こえないかもしれません。すべてのソフトウェアはLinux上で実行されるオーダーメイドのサーバーソフトウェアパッケージ用であり、お客様が購入していたすべてのクライアントボックスはLinuxでした。これらのすべてのボックスでWine(当時は非常に信頼性が低い)を起動して実行する方法を理解し、IEを実行して管理者にWineの問題をデバッグする方法をトレーニングできるかどうかを見極めるのではなく、単に不可能でした。所有者の要求を満たすため。問題は、彼がWebデザインを行っていて、WebサイトをFireFoxに準拠させる方法を知らなかったことでした。

私たちの会社が倒産したことを知ってあなたにショックを与えることはおそらくないでしょう。


1
それはかなり奇妙です。
Brad Gilbert、

14
資本主義のための3つの歓声!
starblue

46
適者生存のためのイェイ...この男は彼自身のソフトウェアビジネスを運営するに値しませんでした。
マークブリッティンガム

10
最後の文は素晴らしかった。このような決定を下すときに、誰かがどのように真剣に受け止められるでしょうか。
Shickadance氏、2009年

54

一般的な番号付き識別子名の使用

私の現在の仕事では、本当に意味のある2つのルールがあります。

ルール1:データベーステーブルに新しいフィールドを作成するたびに、将来使用するために予備のフィールドを追加する必要があります。これらの予約フィールドには番号が付けられます(誰がいつどのデータを保持するかわからないため)。次に新しいフィールドが必要になったとき、最初に未使用の予約フィールドを探します。

つまりcustomer.reserve_field_14、お客様の電子メールアドレスが含まれることになります。

ある日、私たちの上司は予約テーブルの導入を考えましたが、幸い、私たちは彼にそれを行わないように説得することができました。

ルール2:当社の製品の1つはVB6で記述されており、VB6にはさまざまな識別子名の総数の制限があり、コードが非常に大きいため、常にこの制限に遭遇します。「解決策」として、すべてのローカル変数名に番号が付けられます。

  • Lvarlong1
  • Lvarlong2
  • Lvarstr1
  • ...

これで識別子の制限を効果的に回避できますが、これら2つのルールを組み合わせると、次のような美しいコードになります。

...

If Lvarbool1 Then
  Lvarbool2 = True
End If

If Lvarbool2 Or Lvarstr1 <> Lvarstr5 Then
  db.Execute("DELETE FROM customer WHERE " _ 
      & "reserve_field_12 = '" & Lvarstr1 & "'")
End If

...

古いコードや他の誰かのコードを修正するのがどれほど難しいか想像できます...

最新の更新:プライベートメンバーの「予約手続き」も使用しています。

Private Sub LSub1(Lvarlong1 As Long, Lvarstr1 As String)
  If Lvarlong1 >= 0 Then 
    Lvarbool1 = LFunc1(Lvarstr1)
  Else
    Lvarbool1 = LFunc6()
  End If
  If Lvarbool1 Then
    LSub4 Lvarstr1
  End If
End Sub

編集:このコードパターンはますます人気が高まっているようです。詳しくは、The Daily WTFの投稿をご覧ください。乱視 :)


10
冗談ではありません。私はこれらのSQLインジェクションをすべて実行して削除するのに永遠にかかったに違いない。;-)
Kirk Strauser、2008年

それは純粋な悪です。あなたの上司/ TLは彼の機会を待っているだけの君主だと確信しています。
Manuel Ferreria、2008年

5
omg、誰がこのようなルールを思いつくのでしょうか??? 最も重要なこと:あなたのチームはどのようにしてコードを管理するのですか?
2008

2
デフォルトですべてのフィールドを選択して、すべてを指定する必要なしに、すべての「予約」フィールドも取得することを彼は意味していたと思います。
シカダンス氏、2009年

2
);あなたは「%sの/メール/ reserve_field_12 / G」のようなsomegtinhをコンパイルする前に、意味のある変数名を使用してコードを記述して、「正しいもの」と交換する場所、preprosessingコードを使用することができますmaibe
ジョアン・ポルテラ

53

私のC ++時代には、==、> =、<=、&&などを使用することが許可されていませんでした。このためのマクロがありました...

if (bob EQ 7 AND alice LEQ 10)
{
   // blah
}

これは明らかに「条件付きバグでの古い偶然の割り当て」に対処するためのものでしたが、「変数の前に定数を置く」というルールあったため、

if (NULL EQ ptr); //ok
if (ptr EQ NULL); //not ok

覚えていると思いますが、今まで聞いた中で最も単純なコーディング標準は、「次のメンテナがあなたがどこに住んでいるかを知っている悪質な精神病者であるかのようにコードを書くこと」でした。


1
rofl .. Cでfortranを書く
Robert Paulson

私はまだc#でnull ==変数を実行しています。心配する必要はないのですが、自分ではどうしようもありません。逆に見ると緊張します。古い習慣は死ぬ。
Troy Howard

サイコパスについての最後の話は、ほとんどすぐに殺された人がいるだろう。
シカダンス氏、2009年

31
悪質な精神病者のための+1。
rcollyer

フォーラムにコードを投稿するとき、オペレーターがHTMLに変更されないようにするために、LTやSHLなどを使用することがあります。
スーパーキャット

45

ハンガリー語表記全般。


11
まあ、私はページのコントロールのためにH / Nが好きです。IntelliSenseドロップダウンですべてのテキストボックスコントロールを見つけるのは、txtFooBarだけを探す方がはるかに簡単です。
cciotti 2008年

20
ハンガリー語の表記は悪ではありません。適切に使用する必要がありますjoelonsoftware.com/articles/Wrong.html
Czimi

1
コントロールに関しては認めます。次に、ハンガリー語の表記が役立ちます。しかし、一般的には、ハンガリー語の表記法は時代遅れであり、一般的に誤用されていると思います。本来の意図から外れています。
vfilby 2008年

9
恐ろしく誤用された、はい。違います。
Loren Pechtel 2008年

2
多くの人々は、インタフェースはIで始めるI、IEnumerableを、IListの...では.NET Frameworkのアルとインタフェース名を開始
tuinstoel

43

私は愚かなルールをたくさん持っていますが、まったく奇妙と思ったものはたくさんありません。

最も愚かなのは、私が90年代前半に戻って働いたNASAの仕事でした。これは非常に大きな仕事であり、100人を超える開発者が参加しました。コーディング標準を作成した経験豊富な開発者は、すべてのソースファイルは4文字の頭字語で始める必要があり、最初の文字はファイルを担当するグループを表す必要があると決定しました。これは、慣れ親しんだ古いFORTRAN 77プロジェクトにとってはおそらく素晴らしいアイデアでした。

しかし、これはAdaプロジェクトであり、階層的なライブラリ構造が優れていたため、まったく意味がありませんでした。すべてのディレクトリは、同じ文字で始まるファイルでいっぱいで、その後にさらに3つの意味のない文字、アンダースコア、そして重要なファイル名の一部が続きました。すべてのAdaパッケージは、この同じ5文字のいぼで始まる必要がありました。エイダ「使用」の句は、そのソースファイルにローカルではありませんでした任意の識別子を意味任意の参照がそうすることを、いずれかの(通常の状況下で、間違いなく良いこと)は許されなかったまた、この無用いぼを含める必要がありました。おそらくこれに対する反乱があったはずですが、プロジェクト全体はジュニアプログラマーが配置され、大学の新入社員(私自身は後者)の新入社員です。

典型的な割り当てステートメント(Adaでは既に冗長)は、次のようになります。

NABC_The_Package_Name.X := NABC_The_Package_Name.X + 
  CXYZ_Some_Other_Package_Name.Delta_X;

幸いなことに、それらは少なくとも80カラムを超えることができるほど十分に啓発されました!それでも、施設のいぼは、Adaの「名前の変更」を使用していぼを取り除くために、すべてのソースファイルの上部に定型コードになるほど嫌いでした。インポートされた(「withed」された)パッケージごとに1つの名前変更があります。このような:

package Package_Name renames NABC_Package_Name;
package Some_Other_Package_Name renames CXYZ_Some_Other_Package_Name;
--// Repeated in this vein for an average of 10 lines or so

私たちの間でよりクリエイティブになったことは、いぼを使って実際に意味のある(またはばかげた)パッケージ名を作成しようとすることでした。(私はあなたが何を考えているのか知っていますが、露骨な表現は許されず、恥ずかしいです!それは嫌です)。たとえば、私はC monmonコードグループに属しており、W orkstationグループとインターフェイスするためのパッケージを作成する必要がありました。Workstationの担当者とのブレーンストーミングセッションの後、両方を必要とする誰かが次のように書く必要があるように、パッケージに名前を付けることにしました。

with CANT_Interface_Package;
with WONT_Interface_Package;

1
それでも、NASAはキロメートルで計算するかマイルで計算するかを判断できませんでした...
NotMe

16
くそー、私はあなたがすべてに出かけてCUN * _とW * NK_パッケージの命名規則を使用するつもりだと本当に思っていました。申し訳ありませんが、燃焼が遅く、爆発的な、テキスト形式のトゥレットがあります。しかし、あなたのものはずっとずっとおかしかったです!
defmeta 2008年

41

ある場所で作業を開始し、コードをソース管理に入力し始めたとき、上司が突然私に近づき、あまりコミットをやめるように頼みました。彼は、ソース管理が面倒なので、開発者に対して1日1回以上のコミットを行うことはお勧めできないと私に言った。私はただ彼にぽつんと...

後で彼が私にたどり着いた理由は、SVNサーバーが彼(およびさらに10人の幹部)に、誰かがコミットするたびにメールを送信するためだと後で理解しました。そして、ソースコントロールを散らかすことによって、彼はメールボックスをメンターしていると思いました。


メールをハイライトし、[削除]をクリックして完了
TheLQ

私は、いわゆる「分厚いチェックイン」のファンではありません。変更が完了したらコミットします。そのように単純です。また、私のコードはコンパイル可能であり、少なくとも翌朝、他のコーダーのためにプロジェクトの残りの部分で実行可能である必要があることを強制するので、作業日の終わりにコミットすることも好きです。
ジェシーC.スライサー

2
両方の長所を手に入れましょう-何かを失いたくないときはいつでもローカルブランチにコミットしてください。それらをマスターに入れる準備ができたら、それらのコミットをリベースしてスカッシュします。(gitの用語を許してください-Mercurialや他の多くのシステムでも可能です)
Michael Anderson

上記のすべてに同意します。これは、バージョン管理に取り組むという根本的な問題です。技術的な解決策はありません。私はgit-svnに移動することを検討しました。これにより、ローカルリポジトリを操作してSVNリポジトリにプッシュできるようになりますが、1日のすべてのコミットのメールを1つの巨大なバッチで送信するだけで解決しました。上司には何もありません。
Avihu Turzion

34

SQL Server 2000のストアドプロシージャを介してすべてのデータベースクエリを実行します。複雑なマルチテーブルクエリから次のような単純なクエリまで。

select id, name from people

手順を支持する議論は次のとおりです。

  • パフォーマンス
  • 安全保障
  • 保守性

手順のトピックはかなり物議を醸していることを知っているので、自分の答えを否定的に採点してください;)


2
テーブル名と列名は一意ではないが、SP名は一意である場合、保守性が向上する可能性があります。これにより、コード参照を見つけやすくなります。他に、より優れた保守性の利点がある場合、私はそれらを知りません。SPを使用する主な理由はセキュリティです。
Jeffrey L Whitledge、2008年

2
一般的な目的では100%wtfではないことに同意しますが、次のリンクを参照してください。codinghorror.com
archives

2
「セキュリティがSPを使用する主な理由」いいえ。SQLServerのSPについては、より安全なものはありません。パラメータ化されたクエリとして呼び出された場合にのみ安全であり、動的SQLでも同様に実行できます。
Flory

4
Nah:sprocsは便利です。時には面倒なこともありますが、最終的には、より優れた、再利用可能なデータベースインターフェイスを作成することになります。また、dbaを使用すると、パフォーマンスの問題を簡単に分析でき、アプリのコードを変更せずに本番システムを更新できます。私はsprocsでビズロジックを提唱していません。
ロバートポールソン、

4
コンパイルされたコードにクエリを埋め込むのは大変なことです。抽象化だけでも100%sprocsポリシーに100%遅れています
annakata

33

1000行のコードあたり165のユニットテスト(必ずしも自動化されていない)が必要です。これは、およそ8行ごとに1つのテストで機能します。

言うまでもなく、一部のコード行は非常に長く、関数はこのポインターを返し連鎖を可能にします。


単体テストはどのように自動化されていませんか?
pupeno 2008年

彼らはどのようにしてマジックナンバー8を思いついたのですか?
Rohit

1
164の場合はどうなりますか?166?
ダニエルダラナス09

8
6行のように。
再帰

1
それはあなたのテストがどれだけ細かい粒度かにもよると思います。私はfunction(x).should == 2単一のテストであると考えていますが、他の人はそれらの10をバンドルして単一のテストと呼んでいます。
オリオンエドワーズ

30

クラス内のすべての関数をアルファベット順にソートして、「見つけやすく」する必要がありました。IDEが低下したことを気にしないでください。クリック数が多すぎます。

(同じ技術リーダーが、ソースコードからすべてのコメントを削除するアプリを作成しました)。


3
確かに、結局のところ、コメントはすっきりしているためです...そして、プリプロセッサがコンパイル時に節約するサイクル数を考えてください!(このアプリはルールよりももっと
おかしい

7
もちろん!開発者はコメントを書くのに時間を無駄にするのではなく、コードを書くことになっています:)
Daniel Rikowski 2008年

2
うん!そしてコメントはビルドを遅くします!
Greg D

2
それでも、タイプ(フィールド、プロパティ、メソッド)と名前でメンバーを並べ替えるのは良いルールだと思います
abatishchev

3
メソッド、メンバーなどを、ヘッダーとソースの両方で、それぞれのグループ内でアルファベット順に並べ替えます。
Jon Purdy 2010

29

1987年頃、私は黙示録の使い方を知っている少数の少数の人々の1人だったので、私を雇った会社に就職しました。啓示は、聞いたことがない場合、本質的にはPCベースのPickオペレーティングシステムの実装でした。知らなかった場合、その名前はその発明者であるすばらしい名前のDick Pickに由来します。Pick OSについては多くのことが言えるが、そのほとんどが良い。多くのスーパーミニベンダー(少なくともPrimeとMIPS)がPickまたは独自のカスタム実装を使用しました。

この会社はプライムショップであり、社内システムには情報を使用していました。(いいえ、それは本当にその名前でした。それはPrimeのPickの実装でした。)彼らは州とPCベースのシステムを構築する契約を結んでおり、彼がすべての作業を行う前に約1年を黙示録プロジェクトに投入していました。彼らのMISディレクターでもある彼は、彼はもう両方の仕事をすることができないと判断し、私を雇いました。

とにかく、彼はPrimeベースのソフトウェアのコーディング標準をいくつか確立しました。その多くは、2つの基本的な条件から派生しました。1)80列のダム端末の使用、2)Prime以来、ビジュアルエディターがなければ、彼は自分で書きました。Pickコードの魔法の移植性のために、彼はエディターをRevelationに移し、それを使用してPCでプロジェクト全体をビルドしました。

もちろん、啓示はPCベースであり、完全に優れたフルスクリーンエディターを備えていて、80カラムを超えても異議はありませんでした。しかし、最初の数か月間、私はそこにいたので、彼のエディターを使用するように強く要求しました彼の基準。

したがって、最初の標準は、コードのすべての行にコメントを付ける必要があるというものでした。すべての行。例外なく。彼の理論的根拠は、あなたのコメントがあなたがコードで書いたばかりのことを正確に言っていたとしても、コメントする必要があるということは、少なくともその行について2回考えたことを意味しました。また、陽気に指摘したように、コードの各行をフォーマットするコマンドをエディターに追加して、行末のコメントを入力できるようにしました。

ああ、そうです。コードのすべての行にコメントを付けたとき、それは行末のコメントでした。簡単に言うと、各行の最初の64文字はコード用で、次にセミコロンがあり、次に、64文字の機能を説明する15文字がありました。つまり、ピック/ベーシックコードのフォーマットにアセンブリ言語の規則を使用していました。これにより、次のようになります。

EVENT.LIST[DATE.INDEX][-1] = _         ;ADD THE MOST RECENT EVENT
   EVENTS[LEN(EVENTS)]                 ;TO THE END OF EVENT LIST

(実際には、20年後、ようやくR / Basicの行継続構文を忘れてしまったので、見た目が違うかもしれません。しかし、あなたはその考えを理解しています。)

さらに、複数行のコメントを挿入する必要がある場合は常に、フラワーボックスを使用するという規則がありました。

************************************************************************
**  IN CASE YOU NEVER HEARD OF ONE, OR COULDN'T GUESS FROM ITS NAME,  **
**  THIS IS A FLOWER BOX.                                             **
************************************************************************

はい、各行にそれらを閉じるアスタリスクが必要でした。結局のところ、彼のエディタを使用した場合、フラワーボックスを挿入するのは単純なエディタコマンドでした。

Revelationの組み込みエディターを彼に容赦なく使用させ、かなりの戦いでした。最初は、それがルールだったからといって、彼はしつこく言った。私が異議を唱えたとき、a)Revelationエディターをすでに知っていたb)彼のエディターよりも実質的に機能的だったc)他のRevelation開発者も同じ視点を持っているだろう私たち二人が知っているように、地獄が凍っていない限り、これは起こりませんでした。最後に彼は降参した。

しかし、コーディング標準は最後の手段でした。特にフラワーボックスのコメントは愚かな時間の無駄であり、彼は私に歯と爪をかけて戦い、私が適切なエディターを使用すればそれらを維持することは完全に簡単だと言った。(全体がかなりパッシブアグレッシブになりました。)最後に私は静かに屈服し、それ以降、コードレビューに持ってきたすべてのコードに彼の貴重なフラワーボックスコメントがありました。

ある日、仕事の数か月前に、自分が有能であることが証明されたとき(特に、そこで働いていたときにそのオフィスを通過した他のコーダーの驚くべきパレードと比較して)、彼は私の肩越しに私を見ていた彼は私がフラワーボックスのコメントを使用していないことに気づきました。ああ、私は言った、私がそれらを印刷するときに私のコメントをあなたのスタイルに変換するソースコードフォーマッタを書いた。エディターでそれらを維持するよりも簡単です。彼は口を開け、しばらく考えて、それを閉じて立ち去りました。コーディング標準について二度と話しませんでした。その後、私たちの仕事はどちらも簡単になりました。


14
印刷時のコメントフォーマッタの+1
BradC 2009年

1
フラワーボックスは使いすぎないでください。コードに沿って読んでいるときは嫌いです。いいコメントを書いて、「これはこれでこれ、これでこれだ」と叫ぶ花の箱を見る
TheLQ

26

私の最初の仕事では、すべてのCプログラムは、単純であれ複雑であれ、4つの関数しか持っていませんでした。他の3つの関数を順番に呼び出すメインがありました。名前は思い出せませんが、begin()、middle()、end()に沿ったものでした。begin()はファイルとデータベース接続を開き、end()はそれらを閉じ、middle()はその他すべてを行いました。言うまでもなく、middle()は非常に長い関数でした。

そして、物事をさらに良くするために、すべての変数はグローバルでなければなりませんでした。

その仕事について私の最も誇りに思っている思い出の1つは、これらの基準の破壊につながった一般的な反乱の一部であったことです。


2
会議室の紙に書いてあると良さそうだったと思いますが、それに従わなければならなかったプログラマには残念です
TheLQ

英語の先生によってデザインされたに違いありません。
yodie

COBOLプログラマーが設計したものでなければなりません。
ブルーノ

をたくさん使ったに違いありませんgoto
new123456 2011

26

「組み込み演算子の優先順位に依存せず、常に角かっこを使用する」というルールを持った外部で記述されたCコーディング標準

十分に公正で、明白な意図は禁止することでした:

a = 3 + 6 * 2;

賛成:

a = 3 + (6 * 2);

ことは、これは、「=」、「==」、「。」というCの構文規則に従ったツールによって実施されていました。配列アクセスは演算子です。したがって、次のようなコード:

a[i].x += b[i].y + d - 7;

次のように書かなければなりませんでした:

((a[i]).x) += (((b[i]).y + d) - 7);

2
多分(((a)[(i)])。x)+ =((((((b)[(i)])。y)+(d))-(7)); ?
Behrooz、2010
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.