web-dev-qa-db-ja.com

Cの異なる行に関数タイプとメソッド名を配置する理由

会社で始めたばかりで、最初のコードレビューでのスタイルコメントの1つは、戻り値の型とメソッド名は別の行にあるべきだというものでした。たとえば、これ

void foo() {
}

これでなければなりません

void
foo() {
}

私はいつも最初のスタイルを使用してきましたが、個人的な好み以外に2番目のスタイルを使用する理由があるのだろうかと思いました。最初のものは読みやすさを損なうことはないと思います。 Cプログラマーと大規模なオープンソースプロジェクトでは、どちらが一般的ですか?

16
gsingh2011

なぜ人々がセカンドスタイルを使うのか、個人的な好み以外の理由があるのだろうかと思っていましたか?

それはCの初期の頃に人気があったスタイルです。その理由は、彼らが非常に長い間それを行ってきた方法であり、そのようなコードがたくさんあり、それが誰もが慣れています。企業の勢いほど個人的な好みではありません。

別の理由は、関数名は常に最初の列から始まることです。戻り値の型は長さが異なり、多少複雑になる可能性があります。型を1行に置くと、関数名を見つけやすくなります。

会社に設定されたスタイルがある場合は、コーディング標準のドキュメントもある場合があります。それを求めます。この選択の理由を説明している可能性があり、コピーがあると、将来のレビューで同様の問題を回避するのに役立ちます。

19
Caleb

これは、私が実際に読みやすさに顕著な影響を与えることがわかっている唯一のコードフォーマットルールであり、ほとんど労力を要しません(コードエディターがあなたとの戦いを開始しないと仮定します)。

宣言/定義の一貫した位置に名前を表示することは、優れたプログラミング言語の設計です。理論的根拠は簡単です。名前の始まりをすぐに見つけるために使用できる素敵な視覚的アンカー(中括弧またはぶら下がったインデント)があります。ファイルをスキャンして名前を見つけるときに、実際に言語を解析する必要はありません。

これは、ドキュメントをフォーマットするときと同じです。新しいセクションを開始するときは、名前を太字で、多くの場合それ自体の行に入れます。

初期のCには非常に簡潔な署名がありました。戻り値の型はオプションであり、引数の型は署名の後に宣言されました。名前も非常に短くなる傾向がありました。これにより、名前をオフセットする戻り型が時々発生する影響が緩和されました。

double dot(x, y);

まだかなり消化しやすいです。

C++はこれを少し悪化させました。引数の型指定をシグネチャに移動し、シグネチャを長くしました。この構文は、後でCの標準化中に採用されました。

static struct Origin *find_Origin(struct scoreboard *sb,
                  struct commit *parent,
                  struct Origin *Origin)

消化しにくいですが、悪くないです。 (Gitからの抜粋)

ここで、長くわかりやすい名前とパラメータ化された型を使用した最新のプログラミング手法を検討し、この選択がどのように悲惨なものになったかを確認します。 Boostヘッダーの例:

template <class A1, class A2, class A3, class A4, class A5, class A6>
inline typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type make_policy(const A1&, const A2&, const A3&, const A4&, const A5&, const A6&)
{ 
   typedef typename normalise<policy<>, A1, A2, A3, A4, A5, A6>::type result_type;
   return result_type(); 
}

一般的なコードを書いている場合、そのようなシグネチャは異常ではありません。頑張らずに、これよりもはるかに悪いケースの例を見つけることができます。

C、C++、およびそれらの派生物、JavaおよびC#は、読み取り可能な宣言/定義を持っていることの例外のようです。彼らの人気のある先行およびピア(Fortran、ALGOL、Pascal)は、結果タイプの前に名前を付けましたそしてありがたいことに、後継者の多く(Go、Scala、TypeScript、およびSwift))がより読みやすい構文を選択しています。

7
user2313838

このスタイルに初めて出会ったのは、C&C++を使用して19年目になったときです。誰かがこの邪悪なものをどのように発明できるかについてはかなり困惑していました。

私が見つけた唯一の(潜在的に)良い点は、grep ^ FuncNameを使用して関数の定義を見つけることができるということです。 10年以上前のいくつかの実際のツール嫌いなコミュニティでは関連要素かもしれません...私がそれをC++とクラスメンバーの関数に適用したところ、この属性さえも殺してしまうところを見ました。

私の意見を推測してください。 :)

5
Balog Pal