4

私は自分のコードの美学について特にばかげた不安を抱いています...率直に言って、私の空白の使用は厄介です。私のコードはオタクが踊っているように見えます。それほど恐ろしいわけではありませんが、見つめていると気分が悪くなるほどぎこちなく、それでも目をそらすことはできません。

空行を残すか、行コメントの上ではなく行末コメントを使用する必要があるかどうかはわかりません。私は自分のコードの上にコメントすることを好みますが、3 語のコメントでフローを中断するのは奇妙に思えることがあります。コード ブロックの前後に空の行を挿入することは、スムーズなコード セクションにスピード バンプを挿入するようなものです。たとえば、ネストされたループでは、中央で 3 行または 4 行のコード ブロックを分離すると、インデントの視覚効果がほとんどなくなります (K&R ブレイサーは、Allman/BSD/GNU スタイルよりもこの問題が発生しにくいことに気付きました)。

私の個人的な好みは、関数/メソッド/コメント ブロック間を除いて「スピード バンプ」がほとんどない高密度のコードです。コードのトリッキーなセクションについては、何をしようとしているのか、その理由を説明する大きなコメント ブロックを残しておき、そのコード セクションにいくつかの「マーカー」コメントを続けるのが好きです。残念なことに、私は一般的に縦方向の余白を十分に楽しんでいる人がいることに気付きました。一方では、他の人がフローがあまりうまくないと考えるよりも高い情報密度を持つことができ、他方では、より低い信号対ノイズ比を犠牲にして、より良いフロー コード ベースを持つことができます。

これがとても些細で愚かなことであることはわかっていますが、残りのスキルセットを改善するために本当に取り組みたいことです.

誰かがヒントを提供してくれませんか? よく流れるコードとはどのようなものだと思いますか? また、垂直方向の空白を使用するのが適切な場所はどこですか? 2 語または 3 語のコメントに対する行末コメントについて何か考えはありますか?

ありがとう!

PSこれは、私が取り組んできたコードベースのメソッドです。私の最高ではありませんが、私の最悪ではありません。

/**  
 * TODO Clean this up a bit.  Nothing glaringly wrong, just a little messy.  
 * Packs all of the Options, correctly ordered, in a CommandThread for executing.  
 */  
public CommandThread[] generateCommands() throws Exception
 {  
  OptionConstants[] notRegular = {OptionConstants.bucket, OptionConstants.fileLocation, OptionConstants.test, OptionConstants.executable, OptionConstants.mountLocation};  
  ArrayList<Option> nonRegularOptions = new ArrayList<Option>();  
  CommandLine cLine = new CommandLine(getValue(OptionConstants.executable));  

  for (OptionConstants constant : notRegular)  
   nonRegularOptions.add(getOption(constant));  

  // --test must be first  
  cLine.addOption(getOption(OptionConstants.test));  

  // and the regular options...  
  Option option;  
  for (OptionBox optionBox : optionBoxes.values())  
   {  
    option = optionBox.getOption();  
    if (!nonRegularOptions.contains(option))  
     cLine.addOption(option);  
   }  

  // bucket and fileLocation must be last  
  cLine.addOption(getOption(OptionConstants.bucket));  
  cLine.addOption(getOption(OptionConstants.fileLocation));  

  // Create, setup and deploy the CommandThread  
  GUIInteractiveCommand command = new GUIInteractiveCommand(cLine, console);  
  command.addComponentsToEnable(enableOnConnect);  
  command.addComponentsToDisable(disableOnConnect);  
  if (!getValue(OptionConstants.mountLocation).equals(""))  
   command.addComponentToEnable(mountButton);  

  // Piggy-back a Thread to start a StatReader if the call succeeds.  
  class PiggyBack extends Command  
   {  
    Configuration config = new Configuration("piggyBack");  
    OptionConstants fileLocation  = OptionConstants.fileLocation;  
    OptionConstants statsFilename = OptionConstants.statsFilename;  
    OptionConstants mountLocation = OptionConstants.mountLocation;  

    PiggyBack()  
     {  
      config.put(OptionConstants.fileLocation, getOption(fileLocation));  
      config.put(OptionConstants.statsFilename, getOption(statsFilename));  
     }  

  @Override  
  public void doPostRunWork()  
   {  
    if (retVal == 0)  
     {  
// TODO move this to the s3fronterSet or mounts or something.  Take advantage of PiggyBack's scope.  
      connected = true;  
      statReader = new StatReader(eventHandler, config);  
      if (getValue(mountLocation).equals(""))  
       {  
        OptionBox optBox = getOptionBox(mountLocation);  
        optBox.getOption().setRequired(true);  
        optBox.requestFocusInWindow();  
       }  

      // UGLY HACK... Send a 'ps aux' to grab the parent PID.  
      setNextLink(new PSCommand(getValue(fileLocation), null));  
      fireNextLink();  
     }  
   }  
 }  

PiggyBack piggyBack = new PiggyBack();  
piggyBack.setConsole(console);  
command.setNextLink(piggyBack);  
return new CommandThread[]{command};  
}  
4

13 に答える 13

11

それは問題ではありません。

1) 自分らしいスタイルを確立する。あなたが最も簡単で快適だと思うことは何であれ、それを実行してください。できる限り一貫性を保つように努めますが、一貫性の奴隷にならないようにしてください。約 90% を撮影します。

2) 別の開発者のコ​​ードを変更する場合、またはグループ プロジェクトで作業する場合は、コードベースに存在するか、スタイル ガイドに記載されているスタイル規則を使用します。それについて文句を言わないでください。スタイルを定義する立場にある場合は、好みを提示しますが、妥協することをいといません。

この2つを守ればOKです。同じ言語を 2 つの異なる方法で話すと考えてください。たとえば、友達と話すときは、祖父と話すときとは違う話し方をする。

于 2009-06-18T05:32:10.663 に答える
5

きれいなコードを作るのはささいなことではありません。本当に誇りに思うことを書いているときは、通常、一歩下がってメソッドやクラス全体を見て、一目でそれが何をしているのかを正確に理解できます。数か月後であっても。美学は、優れたデザインほど大きくはありませんが、その役割を果たします。また、きれいなコードを常に書けるとは限らないことも理解しておいてください (型指定されていない ADO.NET の誰か?)。

残念ながら、少なくともこのより高いレベルでは、美的に満足のいくコードを常に生成するために遵守できる厳しい規則があるかどうかはわかりません。私が提供できるアドバイスの 1 つは、単純にコードを読むことです。たくさん。多くの異なるフレームワークと言語で。

于 2009-06-18T05:34:02.860 に答える
4

コードの論理的な「フレーズ」を空白で分割するのが好きです。これにより、他の人がメソッド内のロジックを簡単に視覚化できます。または、古いコードに戻って見たときに思い出させてくれます。たとえば、私は

reader.MoveToContent();
if( reader.Name != "Limit" )
    return false;

string type = reader.GetAttribute( "type" );
if( type == null )
    throw new SecureLicenseException( "E_MissingXmlAttribute" );

if( String.Compare( type, GetLimitName(), false ) != 0 )
    throw new SecureLicenseException( "E_LimitValueMismatch", type, "type" );

それ以外の

reader.MoveToContent();
if( reader.Name != "Limit" )
    return false;
string type = reader.GetAttribute( "type" );
if( type == null )
    throw new SecureLicenseException( "E_MissingXmlAttribute" );
if( String.Compare( type, GetLimitName(), false ) != 0 )
    throw new SecureLicenseException( "E_LimitValueMismatch", type, "type" );

中括弧を使用しても同じブレークをほぼ達成できますが、実際には視覚的なノイズが追加され、同時に視覚的に使用できるコードの量が減少することがわかりました。

コード行のコメント

行末のコメントについては、ほとんどありません。コードをスキャンするときに見逃しやすいだけで、それほど悪くはありません。また、行が乱雑になり、コードが読みにくくなります。私たちの脳は、すでに行ごとに grok に接続されています。コメントが行末にある場合、行をコードとコメントという 2 つの具体的な概念に分割する必要があります。コメントするほど重要な場合は、コードの前の行に記載してください。

そうは言っても、特定の値の意味に関する 1 行または 2 行のヒント コメントが問題ない場合もあります。

于 2009-06-18T05:50:44.563 に答える
3

コード内の論理構造を見つけるには実際にコードを読む必要があるため、空白がほとんどないコードは読みにくく、ナビゲートするのが難しいと思います。関数内の論理部分を区切るために空白を巧みに使用すると、作成者だけでなく他の人にとってもコードの理解が容易になります。

あなたのコードが他の人によって維持される可能性が高い環境で作業している場合、彼らはあなたが書いたものではないコードを見てほとんどの時間を費やしていることに注意してください。あなたのスタイルが彼らが見慣れているものと明らかに異なる場合、スムーズなコードは彼らにとってスピードバンプになる可能性があります.

于 2009-06-18T05:40:19.510 に答える
1

空白を最小限に抑えます。コード ブロックの上にメイン コメント ブロックを配置し、他の開発者には明らかでない可能性があるものに行末コメントを追加しました。もうやってると思うよ

于 2009-06-18T05:34:33.123 に答える
1

C# の場合、「if」は単なる単語ですが、「if(」はコードです。「if」、「for」、「try」などの後のスペースは読みやすさにまったく役立たないので、そのほうがよいと思います。スペースなし。

また、Visual Studio> Tools> Options> Text Editor> All Languages> Tabs> KEEP TABS!

あなたがソフトウェア開発者で、タブが属する場所にスペースを使用することを主張する場合、私はあなたがだらしない人だと主張しますが、それが何であれ、最終的にはすべてコンパイルされています. 一方、あなたが Web 開発者で、HTML/CSS/JavaScript 全体に連続したスペースやその他の余分な空白がたくさんある場合は、クライアント側のコードについて無知であるか、与えていないだけです。がらくた。クライアント側コードはコンパイルされません (IIS の既定の設定では圧縮されません) - クライアント側スクリプトの無意味な空白は、サーバー側コードに無意味な Thread.Sleep() 呼び出しを追加するようなものです。

于 2009-11-10T16:42:08.147 に答える
1

覚えておくべき最も重要なことは、既存のコード ベースに参加する場合 (プロとしてのキャリアではほとんどの場合そうであるように)、プロジェクトで指定されたコード スタイル ガイドに従う必要があるということです。

多くの開発者は、プロジェクトを新たに開始するときに、Linux カーネル コーディング スタイル ドキュメントに基づくスタイルを使用することを選択します。そのドキュメントの最新バージョンは、http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/CodingStyle;h=8bb37237ebd25b19759cc47874c63155406ea28f で表示できます。 ;hb=頭

同様に、多くのメンテナは、バージョン管理に変更を提出する前に Checkpatch を使用するよう主張しています。Linux カーネルに同梱されている最新バージョンは、上記の scripts/checkpatch.pl でリンクしたのと同じツリーで確認できます (リンクしたいのですが、初心者なので、回答ごとにハイパーリンクを 1 つしか投稿できません)。

Checkpatch は空白の使用に関する質問とは特に関係ありませんが、末尾の空白やタブの前のスペースなどを削除するのに役立ちます。

于 2009-06-18T13:49:25.580 に答える
1

私の好みのスタイルは、ほとんどの開発者にとっておそらく忌み嫌われるものですが、コードの適切な「段落」と思われるものを区切るために、ときどき空白行を追加します。それは私にとってはうまくいきます.コードレビュー中に誰も文句を言っていませんが(まだ!)、他の人にとっては恣意的に見えるかもしれないと想像できます. 他の人がそれを気に入らなければ、私はおそらくやめるでしょう。

于 2009-06-18T05:43:07.027 に答える
1

私はあなたとまったく同じ量の空白を使用します:)メソッドの前、コメントブロックの前の空白。C、C++ では、一部の行に開き/閉じ波括弧が 1 つしかないため、角括弧は「疑似空白」も提供するため、これはコード密度を分割するのにも役立ちます。

于 2009-06-18T13:53:33.590 に答える
1

Steve McConnell 著の Code Complete (通常の場所で入手可能) は、この種のことに関する私のバイブルです。レイアウトとスタイルに関する章全体があり、非常に優れています。本全体は、有用で実用的なアドバイスでぎっしり詰まっています。

于 2009-06-18T13:58:48.120 に答える
0

私はウィンドウに表示できるコードの量を最大化するのが好きなので、関数間に空白行を 1 行だけ使用し、関数内ではめったに使用しません。関数が長すぎないことを願っています。あなたの例を見ると、開き中括弧の空白行は好きではありませんが、閉じるための空白行があります。構造を示すには、インデントと色付けで十分です。

于 2009-06-18T12:57:39.943 に答える