ヘッダファイルのまとめかた

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
PIKCHE

ヘッダファイルのまとめかた

#1

投稿記事 by PIKCHE » 11年前

現在DxLibを使用したゲームを作成しています。

現在、一般的なコードの書き方がわからず悩んでいるため質問します。

基本的にはクラスごとに2ファイル(.cpp/.h)を原則として書いています。
しかし、似たようなクラスごとにヘッダファイルを作るのは手間もあり保守性も悪いので、
ヘッダファイルは1つに纏めてしまいたいと考えています。
そこで下記のように書きました。

command_common.h

コード:

#pragma once
#include <string>
#include "command.h"
#include <vector>
#include "resources.h"
using namespace std;

namespace Project{
	class CmdBgLoad : public Command{
	public:
		CmdBgLoad(vector<string> text_command, Resources* resources);
		~CmdBgLoad();
		void execute();
	private:
		string tag;
		string filename;
		Resources* resources;
	};
	class CmdBgDraw : public Command{
	public:
		CmdBgDraw(vector<string> text_command, Resources* resources);
		~CmdBgDraw();
		void execute();
		void restoreCommand();
	private:
		string field;
		string filename;
		Resources* resources;
	};
}
単純にヘッダファイル内にクラス定義を並べただけですが、今後ここにクラスが追加されていきます。
動作もしますし、記述自体は間違っていないとは思いますが、
一般的な記法なのか、もしくはもっとイケてる書き方があるのではないか、と疑問に思っています。
複数のヘッダファイルを一つにまとめる場合は、上記のような書き方をするのが一般的なのでしょうか。

box
記事: 2002
登録日時: 14年前

Re: ヘッダファイルのまとめかた

#2

投稿記事 by box » 11年前

ヘッダーファイルを何でもかんでも一緒くたにする方が、
かえって使い勝手は悪くなるような気がします。

あるクラスを利用しようとする人は、
そのクラス「だけ」に関する情報が書いてある
ヘッダーファイル「だけ」をインクルードするようにした方が、
「よけいな、見せたくない情報を隠す。隠すことによって
めったやたらにアクセスされずにすむ」という
オブジェクト指向の趣旨に合致しているような気がします。

外した回答ならば、申し訳ありません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

PIKCHE

Re: ヘッダファイルのまとめかた

#3

投稿記事 by PIKCHE » 11年前

box様

確かに仰るとおりかと思います。
今回の場合は、見せたくない情報を隠す の例外として考えていただけたらと思います。
プロジェクト内の全てのヘッダを1ファイルにまとめるのではなく、一部の関連するクラスのみヘッダを纏めます。
一つ一つのクラスは非常に小さいものなので、見せたくない情報を隠すよりも全体の見通しを良くすることを優先としています。

index

Re: ヘッダファイルのまとめかた

#4

投稿記事 by index » 11年前

自分の場合今までの経験上一概にこれと言った方法は無いと思います。

ケースバイケースですね。
ですが、少なくてもincludeをまとめたヘッダーを作って全cppファイルでincludeするのは(よっぽど小規模なプログラムではない限り)止めた方がいいです。
プロジェクトが肥大化するとコンパイル時間が長くなってきます。

セガの社員さんが書かれた
『ゲームプログラマになる前に覚えておきたい技術』
ではヘッダーを参照するヘッダーは止めてくれと書かれています。

コード:

//common.h
//全cppでこのヘッダーをincludeする
#include"a.h"
#include"b.h"
//以下略

詳しい内容は今現在手元に本がないので(外出先からの投稿なので)書きません(家に帰ったら書きます)

またこれは自分の書き方なのですが、基本的に同じグループ内に属するクラス同士なら同じヘッダーにまとめて書きます。

コード:

//Enemy.h
//敵の種類が少ないので一つのグループとして同じヘッダーに複数クラスを定義してます。
//敵1
class Enemy1{
    //以下略
};

//敵2
class Enemy2{
    //(ry
};

//上の敵を種類ごとにクラス定義する事自体無駄でしょうが例の一つとしてあえて書いてます。
私のしている上記の方法は巨大なグループで行うともしかしたら可読性が落ちるかもしれません(ウン千~万行レベルの巨大さなら・・・)が、参考までにどうぞ・・・
一番いいのは「他の人の(できれば上級者の)プロジェクトを見る」ことでしょうか。このサイトでも、他のサイトでも探せばゴロゴロと落ちていると思いますよ。
その中で一番自分にしっくりくる方法を真似させてもらうのも一つでしょう。この手の話は最終的にプログラマの宗教戦争になるでしょうし。

もちろんこのサイトを利用していて、豊富な経験のある様々な上級者様にご意見を伺うのも一つですが。

SEGA本の続きは家に帰った後、覚えていたら投稿します。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: ヘッダファイルのまとめかた

#5

投稿記事 by softya(ソフト屋) » 11年前

1つ1つ小さいクラスなら1つのhと1つのcppにまとめてやれば可読性はさほど落ちないと思います。
ただし、そもそもクラス構成が正しいのかが不明な上での回答です。

【補足】
継承やテンプレート、委譲で整理できないのかってのは先に考えた方が良いかもしれません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

zeek

Re: ヘッダファイルのまとめかた

#6

投稿記事 by zeek » 11年前

PIKCHE さんが書きました:基本的にはクラスごとに2ファイル(.cpp/.h)を原則として書いています。
しかし、似たようなクラスごとにヘッダファイルを作るのは手間もあり保守性も悪いので、
ヘッダファイルは1つに纏めてしまいたいと考えています。
1つに纏めた場合と別々にした場合の DSM(Dependency Structure Matrix) を作成してファイル間の依存関係を見てはいかがでしょうか?
不必要な依存関係は、問題領域を複雑にし保守性を悪化させます。ですので個人的には、提示されている原則がお勧めです。

あと質問には関係しませんが...
PIKCHE さんが書きました: command_common.h

コード:

using namespace std;
となると command_common.h を include する cpp ファイルは、すべて std 名前空間に汚染されてしまいますね。
このようなヘッダは、私が見たくないヘッダの1つです。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: ヘッダファイルのまとめかた

#7

投稿記事 by usao » 11年前

やたら細かいものが複数あるような場合は一個にまとめちゃってることもありますね.
ただ,それは特殊ケースというか
(「細かーいファイルをたくさん作るのが嫌」という謎の精神的作用に逆らえなかったとき…)
で,基本的にはちゃんと分けていく方が良いと思います.

初回記述時に横着してとりあえず詰め込んだ場合でも
大抵,次の日とかには個別に分ける作業を実施してたり…

ISLe()

Re: ヘッダファイルのまとめかた

#8

投稿記事 by ISLe() » 11年前

個人的には、ヘッダファイルに対応するのはライブラリファイル、という感覚ですが。

閉鎖

“C言語何でも質問掲示板” へ戻る