C ++のJavaスタイルクラス


8

私はこの記事に出くわし、最初は少し奇妙に見えるc ++でのコーディングのスタイルを提案しました。しかし、それを読んで少し考えた後、私は本当にそれを試してみることを考えています。

最も魅力的な利点は、メソッドのリファクタリングの容易さです。新しいクラスを作成している間、私は常にメソッド名やパラメーターなどを変更していることに気づき、c ++では2つのファイル(.h、.cpp)のメソッド名を変更しなければならないのは非常に面倒です。

私はこのスタイルに問題があることを見つけようとしましたが、経験豊富なc ++プログラマーにとってコードが実際に奇妙に見えて感じられるという事実は別として、大きな欠陥を見つけることはできません。しかし、私は非常に経験の浅いc ++プログラマなので、ここにいる誰かが潜在的な危険について私に警告してくれることを願っています。

だから私の質問は:

このスタイルのコーディングを使用することの重大な欠点はありますか?


2
おそらくテンプレートに問題があります。
トーマス・エディング

1
および名前マングリング
ラチェットフリーク

@ThomasEdingについて詳しく説明していただけますか?struct B例をテンプレートに変更したところ、問題なくコンパイルされました。
bughi

1
記事の要点がわかりません。すべてがC ++の優れた最新コードと見なされます...
Klaim

1
実装からのインターフェースの分離が好きです。* .hファイルを読んでインターフェースを一目で確認するのは非常に簡単です(コンパクトであるため)。編集中のコードでない限り、ソースファイルを確認する必要はないでしょう。すべてを1つのファイルにまとめると、私が最も役立つと思う言語の機能の1つが破壊されます(そのため、感謝しません)。
Martin York

回答:


13

はい、そのようなコードをすべて作成すると、他のC ++プログラマーを混乱させることになります。ヘッダーファイルにすべてが含まれている、テンプレート以外のC ++コードをこのように記述したことはありません。これについては、スタックオーバーフローの質問でも詳しく説明しています。

実際の技術的な問題に関しては、いくつかのことが頭に浮かびます。

  • すべてのコードは事実上になりinlineます。コンパイル時間が増える可能性があります。
  • 再コンパイルするたびに、世界をコンパイルする必要があります。
  • 単一定義ルールに違反しないように注意する必要があります。変数名は事実上1つの巨大なファイルになるため、すべてのソースファイルで一意である必要があります。

また、チェックアウトする場合がありますDプログラミング言語私が聞く、これらの問題の多くを解決し、。Dコンパイラーはこのスタイルを念頭に置いて設計されており、サポートする30年のC下位互換性はありません。


私は実際に、私の学部の大学の研究でC。++を(.hのすべてが)そのように書いた。理由はわかりません。私は物事を分離し、自分で適切にリンクする方法を学ぶ必要がありました。
KChaloux

9

それはまったく新しい考えではありません。初心者のプログラマは、ペストのような宣言を避け、プログラムが非常に小さいため、ほとんどの場合それを回避します。結果として、関数を定義する順序を気にする必要があります。定義の順序を気にした結果は、関数を大きくしすぎて問題を最小限に抑えようとする誘惑です。

また、インターフェイスと実装の優れた分離も失われます。著者自身は、プライベートメンバーがヘッダーファイルの一部であることを嘆き、すべての実装の詳細をヘッダーファイルの一部にすることで問題を「解決」します。


7

Javaスタイルのクラスが必要な場合は、Javaでプログラミングしてください。

彼は彼の記事で多くの推測をしているが、それは間違いである。順不同:

コンパイル時間

これも問題ではありません。すべてのオペレーティングシステムヘッダーと頻繁に使用されるコンテナー(STL)または数学ライブラリがプリコンパイル済みヘッダーにあると想定し、プログラムが非常に大きい場合、上記のようにコンポーネントに分割していると想定すると、残りのコード量は絶対に無視できます最新のC ++コンパイラ。

これはまったく間違っており、大規模なC ++プログラムに取り組んだことがないことを示しています。大規模なオープンソースのC ++プログラムをダウンロードしプログラムをコンパイルして、セミコロンを忘れるたびに、それだけ長く待ちたいかどうかを教えてください。

使用前に宣言

C ++の機能があり、プログラマーが知っているように思われるプログラマはほとんどいない(または、少なくとも悪用した)。つまり、クラス内で、使用前に宣言しない(!)明らかにBjarneはC ++のこのレガシー問題を認識しており、クラスの内部でそれを修正しましたが、Cとの後方互換性があるため、トップレベルの宣言に対して同じことを行うことができませんでした(なぜですか? 。

[...はるかに多く、各行は最後の行よりも苦痛です...]

さて、最初に、それは「ごく少数のプログラマーが知っているように見える」機能ではありません。第二に、これはフォワード宣言とそれが何に使用されるかについての完全な誤解です。Googleのコーディングスタイルガイドの説明は中途半端です:http : //google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Forward_Declarations

これらはコンパイラを簡素化するためのものであり、コンパイル時間を大幅に短縮します。


1
Googleスタイルガイドへのリンクに反対票を投じる必要がありました。それは間違った巨大な山です。リンクするのではなく、ブラックリストに載せるべきです。
DeadMG 2012

0

それは私がフォワード宣言をすることの代わりに間抜けな名前を与えるだけのように私に見え#include <blah>ます。

前方宣言の利点は、コンパイル時間を大幅に短縮できることですが、IMOの主な欠点は、前方宣言を回避できる場合とできない場合に注意しなければならないこと、そして失敗した場合に失敗することです。些細なエラーのための、一見不可解なエラーメッセージ。

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