コードのフォーマット:クラスファイル内の呼び出し階層に基づいて関数をレイアウトしますか?


10

ボブマーティンの「クリーンコード」からの提案により、頭が痛くなります。

これまでのところ、タイプ(プロパティ、アクター、関数)と可視性(パブリック/プロト/プライベート)によってクラスメンバーをグループ化する.Netガイドラインにほぼ固執してきました。チップは最初は問題があるようですが、「うまくいくかもしれません」。私は個人的に、このレイアウトが好きなケースに遭遇しました-適切なコールチェーンにいると、より簡単にドリルダウンできます。

ヒントの背後にある考えは確かに思えますが、「このクラスのパブリックインターフェイスを見てみましょう」などの他のシナリオはさらに悪化する可能性があります。たぶんボクルおじさんは小さなクラスとタイプを表示するためのIDEサポートに頼っています...

誰かが長期間これを試しましたか?

更新:コードスニペットが正しいようです

class SomeType()
{
  /// fields, ctors, et. all
  public void Method1()   { // calls HelperMethod1 and HelperMethod2 }
  private void HelperMethod1 { // calls HelperMethod3 }
  private void HelperMethod3 {}
  private void HelperMethod2 {}

  public void Method2 () { // and so on... }

}

2
恐ろしい「ボブおじさん」は、箱の中で最も鋭い鉛筆ではありません。
ニールバターワース2011年

1
アイデアは、「重要な詳細の前に全体像を示してください」だけです。必要に応じて調整してください。
Ryan Culpepper、2011年

2
私はニールのコメントに私自身が同意しているので、イーグルスは再び一緒に戻ることに近づいているに違いない。PASCALコンパイラーはすべて、参照される前に定義する必要があり、FORWARD宣言は一般に嫌われていたので、PASCALで育ち、「小さなものを最初に置きます」。
John R. Strohm、2011年

@ニール-私はアドバイスのメリットを判断しようとしています。ソースに関係なく。@ジョン-そして先端は前方宣言の反対です..あなたは最初に呼び出し元を置きます..「呼び出し先」は呼び出し元のすぐ下で宣言されます
岐阜

@ryanc-その段落の前置きは、「密接に関連する/まとまりのある」概念は垂直方向に互いに接近している必要があることを強調しています[何かを理解しようとしているときにスクロールできないようにします]。呼び出された関数は、呼び出し順に呼び出し元の下に配置されます。追加されたコードスニペットを参照してください
Gishu

回答:


2

私はここで手足を出しているかもしれませんが、使用しているツールがこれに影響を与えているのではないかと思います。私は、開発者が下さなければならないIDEに関するテキストエディタの決定について言及しています。

IDEには、ソースファイルを表示するためのより多くの機能があります。通常、メソッドのリストはアルファベット順、表示順、またはサイドバーの戻り値のタイプで取得できます。メソッドを使用している場合は、そのメソッドにジャンプすることもできます。メソッドの呼び出しツリーを生成してドリルダウンすることもできます。また、通常、正規表現をサポートする強力なfindコマンドがあります。この状況では、ソースコード以外のビューを利用できるため、作成するメソッドの順序は重要ではありません。

テキストエディターでは、通常これらの機能はありません。おそらく最も近いのは強力な検索/置換です。ここでは、ナビゲートが難しくなる可能性があるため、ファイルの構造にもっと注意を払う必要があります。ファイルのスクロールに費やす時間を最小限に抑えて、探しているものを見つける必要があります。また、メソッドの一貫した論理的な順序が役立ちます。


IDEの+1。IDEが優れているほど、そのようなことについて心配する必要が少なくなります
user281377

1

要点は、呼ばれるものは呼ぶものほど面白くないということです。メソッドが他のメソッドを呼び出すほど、そのメソッドはオブジェクトの外部APIの一部である可能性が高くなります(実装の詳細ではありません)。つまり、クラスの外部API(言語がその概念をサポートしている場合はパブリックメソッド)は、当然ファイルの先頭に「なりたい」ため、これらのメソッドを見つけやすくなります。逆に、ヘルパー関数などは、ファイルの最後に「置きたい」ものです。

(その有効性を評価するのではなく、概念を説明しています。)


はい、しかしそれはすべてのパブリック関数が1つのグループとしてファイルの先頭に浮かぶことを意味します。従来のアプローチ。提案されたアプローチは異なります(または少なくとも私がそれをどのように読んだか)。問題の更新を参照してください
Gishu

はい、確かに、パブリック関数は上に浮かぶはずです。もちろん、一部の言語には可視性修飾子がまったくありません...
Frank Shearar

1

延長された期間で数日以上を意味する場合?その後、いいえ
。数年前、私はいくつかの新しいコードでこれを開始し、止まるまでゆっくりと狂っていました。

クラスをレイアウトするための私の個人好みは

class MyClass
{
    // static fields
    // fields
    // constructors
    // properties
    // methods
} 

しかし、それは宗教的なことではなく、プロパティとメソッドが混在する可能性があります。可視性はそれに含まれていません(私はパブリック/保護/プライベートでグループ化していません)

私たちはオフィスにいる男がクラスファイル内のすべてについて厳密な構造を保持しており、すべてがメイングループとサブグループにグループ化され、すべてがリージョンにうまくネストされています。。。地域はサタンの働きだと私は認めざるを得ません。彼らは私を悪党のひねりに駆り立てます。

私は彼のクラスの1つを開くたびに、少し死んでしまいます:(


私は、匂いを隠すためにリージョンを追加した大きなクラスを推奨していません。信心深くしようとはしていませんが、プロジェクト内のレイアウトが一貫していると、物事がスピードアップします。特定のエントリポイントを見つけてそこからドリルダウンできるようにパブリックAPIを互いに近づけることの追加の利点としての可視性のグループ化
Gishu

そしてコンストラクタ?それらは「メソッド」の下にありますか?
コーディグレイ

@Cody Grey:謝罪、俳優を忘れた!
Binary Worrier

@Gishu:最新の視覚化およびナビゲーションツールにより、厳密なファイルレイアウトの必要性がなくなったことがわかりました。使用法を右クリックして「定義に移動」できる場合、メソッドが実装される場所は重要ですか?
Binary Worrier、2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.