C++にある言語機能を避けるべきであるがJavaない? によると、JavaのようにC++を記述するのは恐ろしいことです。 C++言語の有益な機能。
しかし、この質問のポイント2に対応する:
C++固有の機能(例:フレンド関数、多重継承)を備えたC++コードは、C++プログラマーのみが保守またはレビューできますが、Java(C++言語固有の機能なし))のようにC++を記述するだけの場合、コードはC++とJavaプログラマーの両方が保守またはレビューできます。
次の質問が上記のステートメントをサポートしているようです。
ジュニアプログラマーは、シニアプログラマーのプロジェクトでコードレビューアとして関与する必要がありますか?
彼らはこの点を支持しているようだと思います:
1.より多くの人(Javaプログラマー)が私のC++コードをレビューできる
2.それはJavaプログラマーが私のC++コードをレビューする間にC++をより簡単に学ぶことを可能にします
つまり、極端な場合ではすべてのC++機能を削除するわけではありませんが、置換が複雑でない場合はC++機能を使用しないほうがよいでしょう。たとえば、単一の.Javaファイルのように、すべてのC++クラスを.hに記述しません。
class A{
private:
int b;
void methodC(){
//some other code
}
}
.hと.cppを分離することは、C++初心者にとっては簡単です。しかし、C++機能をC++とJavaの両方の疑似コードで簡単に置き換えることができる場合は、C++機能を避けます。たとえば、多重継承、構成+複数のインターフェースで置き換えることができます。
だから私の質問は、「より多くの人(例:Javaプログラマーに私のコードをレビューさせる)」が「JavaのようにC++を書く」理由である )?
「C++をJavaとして書く」という文全体はまったくナンセンスです。 C++をJavaとして作成することはできません。試した場合、プログラムがリークするか、クラッシュするか、またはその両方が発生します。 C++にはガベージコレクションはありません。 C++には適切な例外はありません。 C++は、パラメトリック多態性に対して非常に異なるアプローチを持っています。
そして結局のところ、それはすべての開発者がJavaを知っているであることを意味します。
また、レビューに集中しすぎているようです。他の開発者はコード内のバグを見つけて修正できますか?基本的に、レビューは、レビュアー、そしておそらくチームの他のメンバーが、作者がいなくてもコードを操作できるようにするためだけにあります。
「C++の一部の機能を回避して、開発者(手元にある人)が理解しやすく、編集しやすくなるように」という質問に言い換えると、答えは「はい、もちろんです」です。ほとんどのプロジェクトのコードスタイルガイドには、「...は使用しない」という注記があります。実際には、一部の機能が正しく動作しないため、回避する必要があると考える経験豊富なC++開発者がたくさんいます。
JavaプログラマーがC++コードを確認(つまり、間違いを見つける)または維持(つまり変更)できるのは、Javaひどく見当違いです。
C++の基礎となる実行モデルはJavaとは十分に異なります。そのような試みはバグ、苦痛、そして場合によっては顧客からの高額な訴訟につながります。
Java=からC++に切り替える際の主な困難は、言語のいくつかの追加機能を学習することではなく、実行モデルとイディオムを理解することです。なぜnew
in Java =ユビキタスですが、最新のC++では不快感を覚えていますか?メモリリークを防ぐにはどうしたらよいですか?解放後使用または無効化されたイテレータをどのように防止しますか?配列で無効なインデックスを使用するとどうなりますか。これらは、C++プログラマーが答えることができる必要がある質問であり、Javaプログラマーは答えられないだけです。
JavaであるかのようにC++を書くことはまったく不可能です。メモリリークや所有権のセマンティクス、ポインタや参照の明示的な使用などはありません。さらに、コードをレビューしている人は誰でも、コードの動作を理解できるはずです。
それは学習C++開発者がコードをレビューできないことを意味しますか?まあ、コードレビューは優れた学習ツールであるため、確かに可能です。レビュー担当者が知らないC++の機能を使用する場合は、彼らは質問できますです。これらの追加の質問は、間違いを見つけるのにも役立ちます。
多重継承などの機能は控えめに使用する必要がありますが、言語の機能/構文を認識していない人が理解できるようにすることを目的としてはいけません。
読みやすく強力なc ++を書くための非常に効果的な方法は、意味的に単純なインターフェースの背後に専門家の複雑さを隠すことです。
この良い例がstd::shared_ptr<T>
です。マルチスレッドプログラムのパフォーマンスや正確さを犠牲にすることなくstd::shared_ptr
の実装を正しく行うことは簡単ではありません。
ただし、レビュー担当者がこのコードを見た場合:
auto px = std::make_shared<X>();
ロックフリーの参照カウントや複雑な削除者の型消去(2と名付けた)の複雑さに関係なく、pxが共有の所有権を持つポインターであることは彼には明らかです。
さらに、Xの所有権が常に共有されている場合は、値として処理できるより高レベルのラッパーを作成するのが理にかなっています。
struct SharedX
{
int some_x_method() { return px_->some_x_method(); }
private:
std::shared_ptr<X> px_ = std::make_shared<X>();
};
これで、次のようなコードを記述できます。
auto x = SharedX();
do_something_with(x);
また、誤って無効なSharedXを作成することはできません。
Nullハンドルを提供できるようにしたい場合は、プログラマーに具体的に要求することを要求することで、安全にそれを行うことができます。
struct SharedX
{
SharedX()
: px_(std::make_shared<X>())
{}
static SharedX invalidHandle() { return SharedX(nullptr); }
int some_x_method() {
assert(px_);
return px_->some_x_method();
}
private:
explicit SharedX(std::nullptr_t)
: px_(nullptr)
{}
private:
std::shared_ptr<X> px_;
};
// create a new shared x
auto sx = SharedX();
// create an uninitialised shared x to act as a placeholder for
// some later value (eg if deserialised)
auto nsx = SharedX::invalidHandle();
初心者、Java=プログラマー、専門家、そして私自身のような価値セマンティックな純粋主義者は今やすべて幸せになります。