2009-06-12 13 views
4

私のC++プロジェクトはますます大きくなっています。私たちは今でも建物を作るためにcmakeを使うように動いています。私は次のように今、私は図書館に私のコードを分割うなど、アプリケーションパッケージを準備し、彼らはテストのためにリンクすることができるようにライブラリにアプリケーションを分割したい:C++アプリケーションをライブラリに分割する

  • コア
  • GUI
  • ユーティリティ(これらはコアと他のコンポーネントによって使用される)
  • IO(XML解析/コアのクラスの印刷機能を使用してoutputing)
  • テスト(単体テスト)
  • シミュレータ(コアをテスト)

代わりに、ディレクトリ構造に基づいて分割することもできます(各ディレクトリごとに1つのライブラリ)。しかし、私の過去の経験から、それはあまりにも多くのライブラリにつながり、ライブラリの依存関係はリンク中に扱うのが難しくなります。

この点に関するベストプラクティスはありますか?

答えて

5

1枚の紙で座って、ライブラリのアーキテクチャを決めます。

ライブラリは一連のレベルとして設計する必要があります。レベルA(ベース)上libaryのみシステムライブラリにdependencioesを有するべきであり、それはレベルA.

  • 上のライブラリにレベルBにライブラリがレベルAでのライブラリの依存関係を持つことができなければならない場合にのみ

    • とシステムlibarariesとだけレベルBのライブラリにそれがなければならない場合など

    各ライブラリは、その特定のレベルで完全な仕事を表している必要があります。下位レベルのものは、一般的には仕事が少なくて済みますが、より高いレベルの図書館は完全な仕事を提示しなければならない。つまり、Windowsオブジェクト用のlibとイベント用のlibがありません。このレベルでは、ここでの仕事はウィンドウとのすべてのやりとりを行います(これはイベントとのやりとり方法を含みます)。

    あなたは、いくつかの共鳴可能な官能基を特定したようです。ちょっと疑わしいと思うのはioだけです。あなたが本当に本当の機能をうまく提供するいくつかの一般的なIOルーチンを持っているなら。しかし、それはちょうど別のオブジェクトの束のIOをグループ化している場合は、私はそれを(それはすべての用途に依存して)スクラップします。

    したがって、次のステップは、それらの間の関係を特定することです。

    ディレクトリ構造を使用しています。通常、あるディレクトリ内のすべてが同じライブラリ内に存在しますが、存在している他のディレクトリの可能性を排除するものではありません。クラスの半分をlibAのディレクトリに配置し、残りの半分をlibBなどに入れないでください。

  • +0

    ioはXML(またはその他の形式)を解析して出力することを意味しました。ioはコアのクラスからファクトリと印刷機能を使用します。 –

    +0

    私は間違っていると言っているわけではありません。あなたはコードを見て判断を下す必要があります。ファクトリーと印刷機能が十分に充実していれば、大丈夫です。 –

    1

    妥当と思われます。

    あなたのunit_testsは、ライブラリが行う予定のものですか? libA、libB、libCをビルドした "projects"のコレクションがあります。いくつかのマッチングされたプロジェクトtestA testB testC(ビルドされたテストがスタンドアロンで実行されるのか、テストランナーにロードされるのかに依存します)。

    私はまた、 "ユーティリティ"ライブラリに少し気を付けています。これらは長期的には痛みや苦しみを引き起こす驚くべき能力を持っているようです。たとえば、IOライブラリにはユーティリティライブラリ以外の依存関係はありません。ある日、別のプラットフォームの別のプロジェクトでIOライブラリを再利用したいとします。問題があるだけでなく、すべてのユーティリティライブラリ(IOのうち90%は使用しない)を移植するか、IOが実際に依存するIOライブラリの10%を解消する必要があります。時には、コードの重複を犠牲にして、ライブラリの依存性をもう少しなくする方がよい場合もあります。

    +0

    私はあなたが "ユーティリティ"ライブラリについて言うことに同意します。しかし、うまくいけば、Visual Studioコンパイラとg ++でlinuxを使ってWindows上にビルドしているので、あなたが与える例は問題にはならないでしょう。 –

    2

    あなたはJohn LakosのLarge-Scale C++ソフトウェアデザインを読んでください。

    作業を開始する前に読めないかもしれませんが、この本はあなたのリストに入れるべきです。

    それ以外の場合、Martin Yorkの助言は妥当です。

    さらにもう1つ、doxygenのようなコードベースの依存関係図を表示できるツールを選ぶことをお勧めします。このタイプのリストラを行うことに迷惑をかける場合は、ライブラリ間の循環依存関係を取り除く必要があります。 Lakosは依存性を減らすための多くの方法を説明しています。

    +1

    私はLakosの本をあまりにも冗長に見出しています。この本では、きれいで、役に立たず、直感的でないヒントを、汚れた、役に立たない、明らかなヒントから分離することは難しい。私は誰かが本の良い部分を抽出したかどうかを知ることに興味があります。 –

    +0

    ああ、それはかなり冗長です!退屈なところへ。一方、そこにはいくつかの本当の宝石があります。いいえ、私はもっと簡潔なバージョンは分かりません。 :( –

    関連する問題