強制コード再フォーマットの利点と欠点


19

私は現在、開発者にバージョン管理チェックインで自動コードフォーマッタを使用するように強制することを検討している場所で作業しています。私はこれを行うことの利点と欠点について開発者の意見を探しています...あなたがそれがどのように開発者を助けるか妨げると思うか。私の特定のケースはJava / JSPに関係していますが、質問はどの言語にも当てはまると思います。


JSPの自動再フォーマット?これには、結果の出力を非常に簡単に破壊/変更できるHTML / XMLコードと再フォーマットが含まれます。
edA-qa mort-ora-y

回答:


23

これを行うことが非常に重要だと思います。その理由は次のとおりです。

  • これにより、ソース管理の差分実際のコードの変更のみが表示され、空白やその他の重要でないフォーマットの選択に起因する「差分ノイズ」がほとんどなくなります。
  • すべてのコードがより類似するため、開発者はコードベースをより快適にペアリングおよび共有できます。

あなたがそれをするなら、誰もがすべてのコードをチェックインすることをお勧めします、そして一人がコードベース全体にわたって再フォーマットを行い、それからすべてをチェックインして、フォーマットのための1つの「巨大な」変更セットがあります(誰でも無視できます)が、その後、すべての差分は実際のコード差分になります。

少しずつやると、実際のコードの変更とフォーマットの変更が混ざり合い、変更の土地で物が不必要に乱雑になります。


1
グローバルな変化に弾丸を噛むことは本当に最善の方法です、私は同意します。それを成し遂げれば、誰も二度と心配する必要はありません。
パトリックヒューズ

...スタイルの規則を変更するまで。
オタクフェスト

1
@Nerdfestその後、1回のコミットですべてのプロジェクトに新しい規則を適用します。それは大したことではありません。
ギズモ

2
空白の変更を適切に処理できない場合、「diff」ツールは不愉快です。
edA-qa mort-ora-y

2
わずかに異なる形式が規定のスタイルよりもクリーンである可能性が高い例外が常に存在します。したがって、自動変換は特定のコードブロックの意図を隠すことができます。これは、コードに欠陥を追加するのと同じくらい効果的です。
edA-qa mort-ora-y

10

人々が利点を追加しているように見えるので、ここで自分の答えを投げます。私が不利だと思うものは:

  • 自動フォーマッターよりも「良い」ことをする能力を排除します...それはあなたのきれいなフォーマットを元に戻します。この例としては、列ベースのパラメーター宣言、オブジェクトの個別の追加リストなどがあります。
  • スタイル規則の変更に対する抵抗を作成します。これにより、誤解を招くような大きな差分変更が作成されるようになります。
  • 代替フォーマットによりコードが読みやすくなる「特殊なケース」フォーマットを実行する機能を削除します。
  • 必要な再フォーマット機能を正確にサポートするIDEを使用することにつながります。別のIDEでは、必要なオプションの1つが欠落しているため、少なくともいくつかの問題が発生します。
  • グループとまったく同じ形式の規則を使用しない限り、書き込み可能なコードリポジトリを外部グループと共有することは問題になります(通常はそうではありませんが、常にではありません)。
  • わずかに異なる形式が規定のスタイルよりもクリーンである可能性が高い例外が常に存在します。したがって、自動変換は特定のコードブロックの意図を隠すことができます。これは、コードに欠陥を追加するのと同じくらい効果的です。

簡単に言えば、自動化されていない規則のセットは最小のスタイル/読みやすさの要件を設定し、自動化された規則は最小値と最大値を設定します。

VB(バージョン5かもしれません)を見て、それについて最も面倒なことの1つを見つけたのは、コードを強制的に再フォーマットし、その基本的なフォーマットを超えるものを削除することでした。


一貫性が犠牲になった場合、1つのフォーマット規則が他のフォーマット規則よりも利点をもたらすことはほとんどありません。あなたはそれに慣れます。ボヘミアンのアドバイスに従って、猶予期間を作成して、書式設定スタイルを決定し、それに従ってください。とにかく、フォーマットの変更を軽視すべきではありません。
ジェフ

3
@ジェフ、一貫性のないコード形式を主張しているのではなく、自動化が難しい一貫したコード形式を主張しているとは思わない。たとえば、多くのコーディングスタイルでは、関連するデータの行が複数ある場合に、見栄えの良い方法で列の整列を指定します。これにより読みやすさが大幅に向上しますが、「美的」または「関連」の定義を自動化することは非常に困難です。これが、特定の状況下で一部のコードフォーマッタが手動の書式設定を上書きできるようにする理由です。
カールビーレフェルト

1
99.9%の時間で一貫したフォーマットを使用し、個人的に気に入らない奇妙なビットを我慢する方が、規律のないミスマッシュを我慢するよりもはるかに優れています。私はおそらく、バランスがどこにあるのか、チームがどれほど規律を持っているかにかかっています。言語の確立された規範に固執する場合、すべての適切なエディター/ IDEはそのようにフォーマットできます。規範からの移動を主張する場合、問題が発生します。
-mattnz

3

コードの強制フォーマットは素晴らしいと思います。開発者は、目をどこにでもバウンドさせることなく、コードのコーパス全体を横断できます。また、この標準を導入すると、初心者の開発者が悪い習慣を打破するのに役立ちます。


3

主な欠点は、本当に重要な場所でカスタム書式設定が失われることです。

特定の条件のいずれかが存在するが満たされていない場合に失敗する典型的な健全性チェックif()を想像してください...

  if(
      (user.id == TEST_ID)
    ||(
         (user.id == UserID)
       &&( 
             ( user.type == HUMAN_USER && user.name.size() >= MIN_NAME )
           ||( user.type == EMULATION && input.source != SOURCE_INTERNAL ))
       && ( user.email == NULL || emailValidator.isValid(user.email))
       && ( (user.phone == NULL) == (user.type == EMULATION) )

       // several more lines like this.)
    ){ /* handle results */ }

これは、条件の論理構造に従う合理的なインデントのおかげで読み取り可能です。

現在、自動化ツールには、さまざまな条件を関連する行に論理的に分離する手掛かりがありません。各行が3〜4個の条件を1行にまとめ、次の条件を半分に分割する理由はありません。または、行ごとに1つの比較式を分割します。画面上でもきれいに見えるかもしれませんが、ロジックは失われます。


これは混乱です、私の陽電子の脳はちょうど溶けました。(と)の前後の空白との非常に多くの矛盾。それがまさに、コードをフォーマットするマシンが必要な理由です。そして、条件のグループ化を強制するために、常に(慣例に応じて)前後に単一行のコメントを入れることができます。この条件の背後にあるビジネスルールを読者に説明することも役立ちます。この1行のコメントで。
ステファンOravec

@ŠtefanOravec:これをオートフォーマッターで実行し、これらのコメントを適用します。より読みやすいかどうかを確認します。テストユーザー-常に。有効なユーザー名を持つ人間のユーザー。エミュレートされたユーザー-外部ソースのみ。電子メールは、存在する場合、有効でなければなりません。人間のユーザーには電話番号が必要です。エミュレート-してはいけません。単一行のコメントがオートフォーマットされたコードとどのように整合するかを確認してください。
SF。

2

欠点を伴う回答を追加しましたが、大きな利点と思われるものも追加します。

コミット時に自動化されたコードの再フォーマットを使用すると、実際には他の人に好みを与えるという通常の効果なしに、個人的な好みのバリエーションの可能性が開かれます。コミット時にIDE形式のコードを共通の標準にすることができますが、他に影響を与えることなく、好みの形式で表示できます。

私にとってこれは、慣例に基づいたコーディングのほぼ聖杯です...あなたは一般的なコード形式の利点を得ることができますが、それでも個人的な好みを矛盾なくサポートすることができます。


0

それはあなたのニーズに依存しますが、いくつかの制約は非常に役立ちます。例えば、すべてのif()の後に中括弧が続くべきです。

その場合を考慮してください:

if( x == 0 ) 
   return foo;
//do something else
return bar;

ifケースにログを追加したい場合は、誤って次のように書きます:

if( x == 0 ) 
  log.info("x was 0");
  return foo;
//do something else
return bar;

そして、突然あなたのメソッドは常に戻ります foo

編集:自動書式設定ではなく、スタイルチェックです。その回答も話題にならなかった場合は申し訳ありません。:)


それはフォーマットの問題ではなく、コードスタイルの問題です。そのためのビルドツールがあります。

@ボヘミアン、あなたは正しい、私は質問を読み違えました。選択したビルドツールはcheckstyle btwです。:)
トーマス

0

会社のコードを統一するのに非常に役立ちます。そのおかげで、通常、製品の構造をより簡単に理解し、より簡単に保守できるようになります。


0

まあ、利点は、など、開発者間の意味、コードの標準化と同様に、任意のコードフォーマッタと同じであり、私が見る唯一の可能な欠点人間の目の欠如である後にいくつかの例外を追加するには、書式設定など
だから私推測は、チェックイン時間フォーマッタではなくIDEフォーマッタを検討する方が適切です。


0

私の経験では、それは良いことです。コードがないと、コード比較で空白の書式設定の混乱が頻繁に表示され、実際のコード変更が隠される場合があります。私の経験では、誰かの書式設定をいじることは、特にチーム全体の一貫性の潜在的な利点に関して、明らかにされた罪ではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.