2017-10-22 1 views
1

私は自分のプロジェクトのいくつかを見て、私がgithubで見たことと比較して、私は事を熟考しているように感じます。私はOOPを好きですが、あまりにも多くのファイルを作るように、あまりにも多くのクラスを作るように感じます。OOP - 私はものを複雑にするか?

たとえば、小規模なプロジェクトでは私はチェッカーゲームをしていましたが、私は非常に多くのファイルを持っていて、1つのファイル/クラスに入る可能性があります。私が私のソリューションを過度に考えたとき、どうすればわかりますか?私のファイルのいくつかは次のようになります。

|src 
| |- player.cpp 
| |- piece.cpp 
| |- color.cpp 
| |- ... 

そしてもちろん、より多くのルールのようなものに対処するファイル、ゲームの設定、GUIなどがあり、。しかし、この短い例では、私のプロジェクトがどのようにして非常に大きくなるのかを理解することができます。このようなことを書いているのは、この共通点ですか?または、私は単に、player.cppというファイルを書くべきですか?この場合、複数のクラスが含まれていて、関連性があり、ピース/カラー/キング情報などが設定されています。

+0

これは[ソフトウェア工学](https://softwareengineering.stackexchange.com/)に属しています – gman

+0

最後に、あなたのコードベースに対処しなければならないのはあなたですあなたの痛みの原因となっているコードの側面あなたが何かを維持するために多くの時間を費やしていることや、コードベースの特定の側面が問題を引き起こしていることに気がついたら、それがなぜあなたの問題を引き起こしているのか、そして問題を減らすか、 。その後、新しい方法で試してみましょう。そうであれば、それをあなたの新しい「ベストプラクティス」として採用してください。もしそうでなければ、それを投げて別のものを探してください。あなたが幸せになるまで繰り返す:) –

+0

^^上記のプロセスの終わりに、(あなたとは違った考えをする可能性のある他の人とは対照的に)*あなたのために働くアプローチが分かっているだけでなく、あなたはあなたが他の方法でそれを試して、それが好きではなかったので、なぜあなたがあなたがそれらをやっているやり方でやっているのかを非常によく理解しているでしょう。 –

答えて

-1

各クラスを設計し、プログラム1を達成するために、各クラスは、単一の責任を持つように設計されているので一つだけが、事 は、多くのクラスは、アプリケーション全体を構築するために使用されるべきである

3

はい、あなたを配布コードを複数のファイルに変換することは、プロジェクトをに保守可能にするため、良い方法です。

私は小さなプロジェクトであなたの懸念を見ることができます(それは価値がありますか?)しかし、実際の大きなプロジェクトでは、そうしないと永遠に大きなファイルでスクロールすることになりますファイルを検索して、探しているものを見つけ出します。

ファイルをコンパクトに保つ​​ようにしてください。ファイルごとに1つのクラスが用意されています。すべてのクラスが堅牢で、目的は明確です。

時には、関数をファイルに書き込むことがあります。小さな、インライン関数ごとにファイルを持つことは賢明ではありません。なぜなら、理由なくファイルの数を増やすからです。ファイルの中に関数のファミリを持つ方が良いでしょう(例えば、印刷に関連する関数)。

最終的には、ファイルサイズとファイル数の理想的なバランスではないかと思われますが、私は自分自身を明確にしたいと思います。

+0

これに加えて、OOPでファイルを分離するために使うべき方法は、単一の責任パラダイムです。それぞれのクラスは、あなたの問題空間にちょうど1つの「もの」を表すべきです。だから、あなたは絶対に 'player'クラスと' piece'クラスのためのクラス(そして通常はafile)を持たなければなりません。これは各関数が単一の振る舞いを表す関数の単一責任パラダイムに似ています。つまり、関数が動詞になるので、クラスは名詞になります。 – Spaceman1701

1

実際には、「機能をクラスに分けるための粒度はどれくらいですか」と「プロジェクトファイル構造を整理するための良い方法は何か」という2つの明確な質問があります。両方ともかなり広いです。

最初の回答への答えは、おそらく単一責任のイディオムに従うことでしょう。 2番目の答えは、フォルダ構造を名前空間構造に似せるようにすることです(例:boostのように)。 srcフォルダにすべてを格納する現在の方法は、同じ名前を持つクラスが異なる名前空間に現れると、名前の衝突を防ぐためにファイル名が長くなるため、C++ではうまくありません。大きなプロジェクトでは、1つのクラスで4〜5個のファイルが必要になるため、実際にはファイルが多すぎます。そして、それはプロジェクトのための適切な粒度を選択するさらに別の問題につながります...

0

人々は "あまりにも多くのクラス"または "あまりにも多くのファイル"について多くを心配する傾向がありますが、それは主に歴史的な持ち越しです。 40年前、パンチカードでプログラムを書いたときに、大きなトレイや箱を持ち運ぶ必要がありました(落とさないように!)、これは確かに懸念されていました。 35年前、PCの最大のハードドライブは33MBでしたが、これは心配でした。現在、512GB未満のSSDを搭載したPCを購入したり、テラバイトとペタバイトのオンラインストレージにアクセスすることを検討しない場合、プログラムのファイル数とバイト数は開発プロセスにとって本質的に重要ではありません。

人間にとって私たちが意味することは、この豊富な能力をコードの他の面を改善するために使用することです。より多くのファイルがコードの理解に役立つ場合は、より多くのファイルを使用してください。ファイル名が長いほどコードの理解に役立ちますが、長いファイル名を使用してください。 「クラスごとに1つの.cppと1つの.hファイル」のようなルールに従うと、人々がコードベースを維持するのに役立ち、そのルールに従います。重要な点は、「このコードをより保守性が高く、読みやすく、わかりやすいものにするために」というような、本当に重要な問題に焦点を当てることです。

これにアプローチするもう1つの方法は、コードが保守可能かどうかを判断するための「ファイル数」が有用な基準であるかどうかを尋ねることです。明らかにアプリケーションには低すぎる数字が関係していますが、10または100または1000が適切な数であるかどうかをあなたに伝えることはできません(少なくともクラスに含まれるクラスの数はわかりません)。有用なメトリックではないようです。

これは、すべてのファイルが1つのフォルダにまとめられ、すべてがコンパイルされて単一のライブラリまたは実行可能ファイルにリンクされることを意味しますか?それは依存しますが、同じ名前空間内の1000のクラスが少し混雑し、結果として生じるプログラムがあまりにもモノリシックなように思えます。ある時点では、おそらくアーキテクチャをより小さく、より密着したパッケージにリファクタリングして、それぞれが適切な責任領域を持つことが望まれます。もちろん、完全にアプリケーションに依存するので、その魔法の数が何であるかは誰にも分かりません。しかし、このような決定を導くのはファイルの数ではなく、ファイルが論理的にも構造的にも関連している必要があります。

関連する問題