2012-03-07 27 views
2

私はかなり長い間C++とJavaをプログラミングしてきましたが、一般的なC++アーキテクチャーに関するいくつかの質問があります。一般的なC++アーキテクチャ

私はJavaでプログラムを作成するときに、IterableやSerializableなどのインターフェイスを使用し、同様の命名規則と機能を持つ標準ライブラリを模倣しようとしています。しかし、C++では、STL規約を模倣しようとすると躊躇します(イテレータは例外です)。

私は(実装するために、以下の一般的な慣例です)以下の質問にそれを煮詰めてきました:

  • アロケータ
  • インターフェイス(純粋仮想メソッドのみを持つクラス)
  • テンプレートの代わりに、抽象基底クラス
  • 制限の投げ込みを制限する...
  • ...クラスを持っていても、例外をスローすることができます(例えば、標準ストリームなど)
  • 多かれ少なかれ、のためのtypedef、明白なタイプ(reference_type、pointer_type、VALUE_TYPE、...)

またはまったくまねるC++価値がないのはstdでの使用

  • ご意見ありがとうございます。

  • +1

    Hm。これは意味のある方法で答えるのが難しいです。あなたは本当に6つの大きな質問をしています。 <なぜあなたのSTLはを使用するのですか?これは、やりすぎ。私は、その過度に広い範囲のために、この質問を閉じるために投票しています。代わりにそれらの1つについて尋ねてみてください。 「なぜSTLはアロケータを使用するのですか?私は決してそれらを使用していませんし、なぜそこにいるのだろうかと思っています。 –

    +0

    もし私がそれらを別の質問に分ければ、それらはすべて同じようになります: カスタムコンテナにアロケーターを使用するのが一般的な規則ですか? インターフェイスを使用するのが一般的な規則ですか?そんなこと...私自身のプロジェクトでは良い練習に従うことを好みます。それから私のプロジェクトから他の人へのジャンプは小さくなります。ですから、本当に私が知りたいのは、「STLスタイルのコーディングに従うのは良い習慣ですか?」ということです。 –

    答えて

    1

    私がC++を使用したことが多ければ多いほど、私が見つけたライブラリの中で最高のものを模倣することは少なくなりました。この問題は、ジュニア開発者がチームに参加したときに発生します。彼らは基本を理解しますが、言語の微妙な部分は理解しません。テンプレート構文を使用してマップやリストを作成する方法を知っているかもしれませんが、別のオブジェクトに適用されたときにそれを理解することはできません。デバッグの複雑さとコードのリードスルーの複雑さは、問題を解決したり、製品を進化させることから貴重な時間を奪います。

    私は、言語の最も基本的な機能を使うようになってきました。これは、通常、コードをより自然に読める状態にしています。私はこの道からの逸脱を後悔しました.8-12ヶ月後に、コードではっきりしないバグを見つけました。

    Javaは、Java開発者の方がよく理解しているより単純なライブラリ実装です。ジュニアJava開発者は、中級C++開発者の言語をよりよく理解する傾向があることがわかりました。言われているように、C++開発者は、中間的なC++プログラマになるために必要とされるより低いレベルの思考のために、本当に有能になる機会が増えています。

    +0

    私は「追加された複雑さ」を買わない。私の知る限り、標準ライブラリは複雑さを軽減する上で非常に優れています。実際、使いやすい汎用ライブラリは難しいですが、それは常にです。これらの機能を残しておくと、クライアントコードの複雑さが大幅に増加します。 –

    +1

    彼らはC++よりもJavaを教える優れた仕事をしているように思えます。また、ジュニア開発者がたくさんいる場合は、どの言語でもダンジョンダウンする必要があります。私はこの問題をPythonとCでも打ちました。ポインタにポインタを付ける理由を理解できないジュニア開発者は何人ですか? –

    +0

    ... C++の標準スタイルをスクラップして、自分のフレームワークスタイルを作っていますか? –

    0

    これはプロジェクトによって大きく異なります。一般的なアドバイスは、次のようなものです:C++の具体的な標準を持っていても構いません。

    など。 typedefsには、 "for"と "against"の両方に複数の意見があります。

    C++の具体的なコーディングスタイルがC++でそれほど重要でない理由は、言語がそれらのスタイルを強制して確認する方法を提供しないためです。 I.文法は簡単に解析できないので、C++コードをスタイルチェック/リファクタリングするためのツールはほとんどありません。 これは、スタイルチェックの重みがプログラマの肩に当たっていることを意味します。私。スタイルガイドを理解することはあまり意味がありません。なぜなら、それらによって保存された時間の多くが手動のスタイルチェックで無駄になるからです。

    プロジェクト/会社が使用するものを使用するか、使用することを決定します。

    アロケータ:ませ意見ここ

    は私の個人的な好みです。カスタムアロケータが必要な場合は、それをどうすればいいのか分かります。
    インターフェイス:パフォーマンスに影響を受けやすい作業を行っている場合は実行しないでください。リアルタイムアプリケーションでは、処理が著しく遅くなります。抽象仮想クラスとpImplパターンの両方。
    抽象基本クラスの代わりにテンプレート:それは異なります。しかし、一般的な見解は、テンプレートがコンテナのような機能や他の単純なケースに使用されるべきであると思われます。そうでなければ、まともなパターンです。これらのデバッグは、依然として深刻な苦痛であり、今後数年以内に行われる予定です。
    制限の例外をスローする:ええ、そうです。それを信じているかどうかにかかわらず、2012年にはまだ普遍的にサポートされていないので、例外を使用しないでください。
    typedefの使用::C++ 11のstd :: autoを試してみてください。そうでなければ、マクロを定義する途中にあるので、あなたの人生をもっと難しくします。私は個人的に長い名前の入力ストレスを緩和し、長い名前を書くためにIDE(またはVim)を使用したいと思います。

    +0

    テンプレートには説明が難しいほどの力があります。 AlexandrescuはModern C++ Design *で良い試みをしました。 –

    +0

    Re:Restricting exception Throwing - この例はありますか?私は埋め込まれた空間でさえも、まったく新しいコンパイラを見たことがありません。 – Collin

    +0

    私が例外をスローすることを制限することは、単に(ほとんどまたはすべての)メソッドでthrow(...)キーワードを使用することです。 –

    関連する問題