私がこの質問をしたとき、私はほとんど常に明確なイエスを得ました、あなたはコーディング標準を持つべきです。
あなたが従わざるを得なかった最も奇妙なコーディング標準ルールは何でしたか?
そして、最も奇妙なのは、おかしな、または最悪の、または単なる奇妙なことです。
それぞれの回答で、どの言語、あなたのチームの規模、およびあなたとあなたのチームにどのような悪影響を及ぼしたかを述べてください。
私がこの質問をしたとき、私はほとんど常に明確なイエスを得ました、あなたはコーディング標準を持つべきです。
あなたが従わざるを得なかった最も奇妙なコーディング標準ルールは何でしたか?
そして、最も奇妙なのは、おかしな、または最悪の、または単なる奇妙なことです。
それぞれの回答で、どの言語、あなたのチームの規模、およびあなたとあなたのチームにどのような悪影響を及ぼしたかを述べてください。
回答:
私は嫌い、複数のリターンの使用が禁止されているときにそれを。
逆インデント。例えば:
for(int i = 0; i < 10; i++)
{
myFunc();
}
そして:
if(something)
{
// do A
}
else
{
// do B
}
おそらくあなたが得る最も奇妙なものではないかもしれませんが、データベーステーブル名の前に 'tbl'を付ける必要がある場合、私は本当に嫌いです
ほとんどすべての種類のハンガリー語表記。
ハンガリー語の表記の問題は、誤解されがちなことです。元々の考えは、意味が明確になるように変数にプレフィックスを付けることでした。例えば:
int appCount = 0; // Number of apples.
int pearCount = 0; // Number of pears.
しかし、ほとんどの人はそれを使用してタイプを判別します。
int iAppleCount = 0; // Number of apples.
int iPearCount = 0; // Number of pears.
どちらの数値も整数ですが、誰もが知っているので、これは混乱を招きます。リンゴと梨を比較することはできません。
私が現在働いている場所では三項演算子は許可されていません:
int value = (a < b) ? a : b;
...誰もが「理解する」わけではないからです。「構造が複雑になりすぎた場合は書き直さなければならなかったので、使用しないでください」(ネストされた3項演算子、誰か?)と言われたら、理解できるでしょう。しかし、一部の開発者がそれらを理解していないと私に言ったとき...ええと...もちろん。
変更を加えるときにコードを削除しないでください。すべての変更についてコメントするように言われました。ソース管理を使用することに注意してください。このポリシーは長続きしませんでした。開発者がそれについて騒動を起こし、コードが読みにくくなるからです。
私はかつて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キングの信頼性が損なわれることはありません。上級管理職の間で、彼は「トップガン」の技術エキスパートであり続けました...
リンクをたどることでわかるように、これによりいくつかの面白い副作用が生じました。これまでに遭遇したソースコードの中で最高のコメントは何ですか?
80年代/ 90年代に戻ると、FORTRANを使用する航空機シミュレーター会社に勤務していました。FORTRANコンパイラーでは、変数名に8文字の制限がありました。同社のコーディング標準は、最初の3つをハンガリー語表記スタイルの情報用に予約しました。したがって、5文字だけで意味のある変数名を作成する必要がありました。
2社合併の場所で働いていました。「支配的」なサーバーには、K&R C(つまり、ANSI以前)で書かれた主要サーバーがありました。彼らは、Javaチーム(両方のオフィスから-おそらく合計20人の開発者)にこのフォーマットを使用するように強制しました。このフォーマットは、「ブレースの議論」の2つの柱を喜んで無視し、まっすぐに夢中になります。
if ( x == y )
{
System.out.println("this is painful");
x = 0;
y++;
}
禁止:
while (true) {
許可:
for (;;) {
for (;;) {
が最初のCイディオムであると主張しました。
私の友達(私たちは彼をCodeMonkeyと呼びます)は、彼の最初の仕事を大学で(何年も前に)COBOLの社内開発を行っていました。彼の最初のプログラムは、それを使用していたため、「標準に準拠していない」として拒否されました...ネストされたIFステートメント
コーディング標準はネストされたIFステートメントの使用を禁止しました
さて、CodeMonkeyは恥ずかしがり屋ではなく、自分の能力を確信していたので、彼はすべての人にチェーンを上り、通路を下りてこのルールが存在する理由を尋ね続けました。ほとんどは彼らが知らなかったと主張し、一部は「読みやすさ」についてのものを作り、最後に一人が元の理由を思い出しました:彼らが使用したCOBOLコンパイラの最初のバージョンにはバグがあり、ネストされたIFステートメントを正しく処理しませんでした。
もちろん、このコンパイラのバグは少なくとも10年間は修正されていましたが、誰も標準に挑戦していませんでした。[ばああ!]
CodeMonkeyは標準を変更することに成功しました-最終的に!
アンダースコアが禁止されたプロジェクトにかつて取り組んだことがある。そして私は完全に禁止されていることを意味します。したがって、c#winformsアプリでは、新しいイベントハンドラー(ボタンなど)を追加するたびに、デフォルトのメソッド名をbuttonName_Click()から別の名前に変更し、コーディングを書いた人の自我を満たす必要があります。標準。今日まで、私は彼が謙虚なアンダースコアに対して何を持っていたのかわかりません
まったく役に立たないデータベースの命名規則。すべてのテーブル名は数字で始める必要があります。数字は、テーブルにあるデータの種類を示します。
そのため、名前の最初の文字しかわからない場合、テーブルを見つけるのが難しくなります。また、これはmssqlデータベースなので、テーブル名をすべて角括弧で囲む必要があります。
-- doesn't work
select * from 0examples;
-- does work
select * from [0examples];
私たちは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
奇妙なことに私はこのように成長しました。
以前の仕事で:
はい、そうです。各テーブルのすべてのフィールド。それがフィールドだとわかるように。
私の仲間は、政府の仕事で働いている間にこのルールに遭遇しました。++(preまたはpost)の使用は完全に禁止されました。理由:コンパイラーによって、解釈が異なる場合があります。
=
未定義の動作を引き起こすために使用できるので、禁止することもできます。
チームの半分は4スペースのインデントを支持しました。残りの半分は2スペースのインデントを優先しました。
ご想像のとおり、「すべてを平等に攻撃する」ために、コーディング標準では3つが義務付けられています(直接引用)。
マネージャーが「魔法」が多すぎると主張したため、Reflectionを使用できない。
私が持っていた非常に奇妙なもの、そして私を倒すのにかなりの時間を要したものは、私たちの会社の所有者が私たちの新製品がIEのみであることを要求したときでした。FireFoxで動作する場合は問題ありませんが、IEのみである必要があります。
これは、1つの小さな欠陥を除いて、あまり奇妙に聞こえないかもしれません。すべてのソフトウェアはLinux上で実行されるオーダーメイドのサーバーソフトウェアパッケージ用であり、お客様が購入していたすべてのクライアントボックスはLinuxでした。これらのすべてのボックスでWine(当時は非常に信頼性が低い)を起動して実行する方法を理解し、IEを実行して管理者にWineの問題をデバッグする方法をトレーニングできるかどうかを見極めるのではなく、単に不可能でした。所有者の要求を満たすため。問題は、彼がWebデザインを行っていて、WebサイトをFireFoxに準拠させる方法を知らなかったことでした。
私たちの会社が倒産したことを知ってあなたにショックを与えることはおそらくないでしょう。
私の現在の仕事では、本当に意味のある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の投稿をご覧ください。乱視 :)
私のC ++時代には、==、> =、<=、&&などを使用することが許可されていませんでした。このためのマクロがありました...
if (bob EQ 7 AND alice LEQ 10)
{
// blah
}
これは明らかに「条件付きバグでの古い偶然の割り当て」に対処するためのものでしたが、「変数の前に定数を置く」というルールもあったため、
if (NULL EQ ptr); //ok
if (ptr EQ NULL); //not ok
覚えていると思いますが、今まで聞いた中で最も単純なコーディング標準は、「次のメンテナがあなたがどこに住んでいるかを知っている悪質な精神病者であるかのようにコードを書くこと」でした。
ハンガリー語表記全般。
私は愚かなルールをたくさん持っていますが、まったく奇妙だと思ったものはたくさんありません。
最も愚かなのは、私が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日1回以上のコミットを行うことはお勧めできないと私に言った。私はただ彼にぽつんと...
後で彼が私にたどり着いた理由は、SVNサーバーが彼(およびさらに10人の幹部)に、誰かがコミットするたびにメールを送信するためだと後で理解しました。そして、ソースコントロールを散らかすことによって、彼はメールボックスをメンターしていると思いました。
SQL Server 2000のストアドプロシージャを介してすべてのデータベースクエリを実行します。複雑なマルチテーブルクエリから次のような単純なクエリまで。
select id, name from people
手順を支持する議論は次のとおりです。
手順のトピックはかなり物議を醸していることを知っているので、自分の答えを否定的に採点してください;)
1000行のコードあたり165のユニットテスト(必ずしも自動化されていない)が必要です。これは、およそ8行ごとに1つのテストで機能します。
言うまでもなく、一部のコード行は非常に長く、関数はこのポインターを返して連鎖を可能にします。
function(x).should == 2
単一のテストであると考えていますが、他の人はそれらの10をバンドルして単一のテストと呼んでいます。
クラス内のすべての関数をアルファベット順にソートして、「見つけやすく」する必要がありました。IDEが低下したことを気にしないでください。クリック数が多すぎます。
(同じ技術リーダーが、ソースコードからすべてのコメントを削除するアプリを作成しました)。
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開発者も同じ視点を持っているだろう私たち二人が知っているように、地獄が凍っていない限り、これは起こりませんでした。最後に彼は降参した。
しかし、コーディング標準は最後の手段でした。特にフラワーボックスのコメントは愚かな時間の無駄であり、彼は私に歯と爪をかけて戦い、私が適切なエディターを使用すればそれらを維持することは完全に簡単だと言った。(全体がかなりパッシブアグレッシブになりました。)最後に私は静かに屈服し、それ以降、コードレビューに持ってきたすべてのコードに彼の貴重なフラワーボックスコメントがありました。
ある日、仕事の数か月前に、自分が有能であることが証明されたとき(特に、そこで働いていたときにそのオフィスを通過した他のコーダーの驚くべきパレードと比較して)、彼は私の肩越しに私を見ていた彼は私がフラワーボックスのコメントを使用していないことに気づきました。ああ、私は言った、私がそれらを印刷するときに私のコメントをあなたのスタイルに変換するソースコードフォーマッタを書いた。エディターでそれらを維持するよりも簡単です。彼は口を開け、しばらく考えて、それを閉じて立ち去りました。コーディング標準について二度と話しませんでした。その後、私たちの仕事はどちらも簡単になりました。
私の最初の仕事では、すべてのCプログラムは、単純であれ複雑であれ、4つの関数しか持っていませんでした。他の3つの関数を順番に呼び出すメインがありました。名前は思い出せませんが、begin()、middle()、end()に沿ったものでした。begin()はファイルとデータベース接続を開き、end()はそれらを閉じ、middle()はその他すべてを行いました。言うまでもなく、middle()は非常に長い関数でした。
そして、物事をさらに良くするために、すべての変数はグローバルでなければなりませんでした。
その仕事について私の最も誇りに思っている思い出の1つは、これらの基準の破壊につながった一般的な反乱の一部であったことです。
goto
。
「組み込み演算子の優先順位に依存せず、常に角かっこを使用する」というルールを持った外部で記述された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);