このプログラムはどうでしょうか?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
derok
記事: 51
登録日時: 12年前

このプログラムはどうでしょうか?

#1

投稿記事 by derok » 12年前

C++とDXライブラリを使ってマインスイーパーの様な物を作りました。
しかし、オブジェクト指向でのプログラムは初めてでありちゃんとしたソースが掛けているかどうか心配です。
実際、Releaseビルドするとバグを発生します。(Debugビルドだと起こりません)
Releaseビルドのバグの原因は調べてみたのですが分かりませんでした。
ソースコードの評価も含めて教えてもらえないでしょうか?
添付ファイル
minesweeper.zip
(1.79 MiB) ダウンロード数: 141 回

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

Re: このプログラムはどうでしょうか?

#2

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

すごく追いかけづらいので第一印象は、クラスやメンバ名と機能がズレている気がします。そのため直感的に追いかけれません。
あと同じような意味で英語だったりローマ字日本語だったり統一性が感じられないのも問題です。

それとSTLの活用やスマートポインタの活用などをすれば、Releaseビルドするとバグを発生は防げるかもしれません。
Class_mainってスマートポインタを使っていないのが原因で「念の為に初期化」とか変なことしてません?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

derok
記事: 51
登録日時: 12年前

Re: このプログラムはどうでしょうか?

#3

投稿記事 by derok » 12年前

softya(ソフト屋) さんが書きました: すごく追いかけづらいので第一印象は、クラスやメンバ名と機能がズレている気がします。そのため直感的に追いかけれません。
あと同じような意味で英語だったりローマ字日本語だったり統一性が感じられないのも問題です
一応、投稿にあたり読みやすさを重視したつもりだったのですが。
クラス名についてはこんな感じですかね?
masu_sousa → CellOpen (クリックされた所のマスに関するクラス)
Hata_sousa → CheckMark (チェックに関するクラス)
end_gard → SceneMgr (処理する場面を管理するクラス)
Make_brock → DefiniteCellOpen (爆弾がないことが簡単にわかる場所を自動的に開けるクラス)
後、メンバ名なんですが、
nyuusyu関数→Get+データ名の様に変えるのでしょうか?
また、英語と日本語が混じることとよくないとおしゃられていますが、
Definite(確定的)なんかは少しわかりにくい気がしますが、
こういう風に英語にしにくい場合はどうするべきなのでしゅうか
softya( ソフト屋) さんが書きました:
それとSTLの活用やスマートポインタの活用などをすれば、Releaseビルドするとバグを発生は防げるかもしれません。
Class_mainってスマートポインタを使っていないのが原因で「念の為に初期化」とか変なことしてません?
スマートポインタと言う言葉自体初めて聞きました。
調べてみたのですが、ブロックが終了した場合自動的に解放するものの様ですが、
これをどの様に使うのでしょうか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: このプログラムはどうでしょうか?

#4

投稿記事 by h2so5 » 12年前

derok さんが書きました:
softya(ソフト屋) さんが書きました: すごく追いかけづらいので第一印象は、クラスやメンバ名と機能がズレている気がします。そのため直感的に追いかけれません。
あと同じような意味で英語だったりローマ字日本語だったり統一性が感じられないのも問題です
一応、投稿にあたり読みやすさを重視したつもりだったのですが。
クラス名についてはこんな感じですかね?
masu_sousa → CellOpen (クリックされた所のマスに関するクラス)
Hata_sousa → CheckMark (チェックに関するクラス)
end_gard → SceneMgr (処理する場面を管理するクラス)
Make_brock → DefiniteCellOpen (爆弾がないことが簡単にわかる場所を自動的に開けるクラス)
後、メンバ名なんですが、
nyuusyu関数→Get+データ名の様に変えるのでしょうか?
また、英語と日本語が混じることとよくないとおしゃられていますが、
Definite(確定的)なんかは少しわかりにくい気がしますが、
こういう風に英語にしにくい場合はどうするべきなのでしゅうか
英語かどうかは関係なく、「確定的」だと日本語でも意味が分かりにくいですよね。
「爆弾がないことが簡単にわかる場所を自動的に開けるクラス」なら、 CleanCellOpener というクラス名はどうでしょう。

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

Re: このプログラムはどうでしょうか?

#5

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

同じ意味で英語と日本語が使われるのが問題なので統一はして下さい。
> nyuusyu関数→Get+データ名の様に変えるのでしょうか?
これですね。英語と日本語が混ざる事自体は分かりやすければ問題ありません。

>masu_sousa → CellOpen (クリックされた所のマスに関するクラス)
>Hata_sousa → CheckMark (チェックに関するクラス)
>end_gard → SceneMgr (処理する場面を管理するクラス)
>Make_brock → DefiniteCellOpen (爆弾がないことが簡単にわかる場所を自動的に開けるクラス)

どれもですがオブジェクト的に的確に分かれていない気がします。
そういう無理があるから、クラス名やメンバ関数名で機能とのズレが生じるのでは無いでしょうか?

例えば、Hata_sousa → CheckMark (チェックに関するクラス)ですが、結局何をするクラスか不明確に成る一方です。


>調べてみたのですが、ブロックが終了した場合自動的に解放するものの様ですが、

Class_mainに使えばdeleteが不要になります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

derok
記事: 51
登録日時: 12年前

Re: このプログラムはどうでしょうか?

#6

投稿記事 by derok » 12年前

h2so5 さんが書きました: 英語かどうかは関係なく、「確定的」だと日本語でも意味が分かりにくいですよね。
「爆弾がないことが簡単にわかる場所を自動的に開けるクラス」なら、 CleanCellOpener というクラス名はどうでしょう。
アドバイス有難う御座います。確かにこういう場合日本語でも分かりにくい場合が多いかもしれませんね。
softya(ソフト屋) さんが書きました:同じ意味で英語と日本語が使われるのが問題なので統一はして下さい。
> nyuusyu関数→Get+データ名の様に変えるのでしょうか?
これですね。英語と日本語が混ざる事自体は分かりやすければ問題ありません。
そうなのですか。プログラムを人に見せること自体初めてなので、そう言う事を考えてことが有りませんでした
softya(ソフト屋) さんが書きました: >masu_sousa → CellOpen (クリックされた所のマスに関するクラス)
>Hata_sousa → CheckMark (チェックに関するクラス)
>end_gard → SceneMgr (処理する場面を管理するクラス)
>Make_brock → DefiniteCellOpen (爆弾がないことが簡単にわかる場所を自動的に開けるクラス)

どれもですがオブジェクト的に的確に分かれていない気がします。
そういう無理があるから、クラス名やメンバ関数名で機能とのズレが生じるのでは無いでしょうか?

例えば、Hata_sousa → CheckMark (チェックに関するクラス)ですが、結局何をするクラスか不明確に成る一方です。
Hata_sousa → CheckMark (チェックに関するクラス)ですが「チェックマーク」という一つのオブジェクトだと思っていたのですが違うのでしょうか?
softya(ソフト屋) さんが書きました: >調べてみたのですが、ブロックが終了した場合自動的に解放するものの様ですが

Class_mainに使えばdeleteが不要になります。
具体的にどう使えばいいんでしょう?
普通に使おうとしたのですが、これらのオペランドと一致する"="は有りませんと言われます。
いろいろ調べてみたのですがよく分かりません。

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

Re: このプログラムはどうでしょうか?

#7

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

derok さんが書きました:Hata_sousa → CheckMark (チェックに関するクラス)ですが「チェックマーク」という一つのオブジェクトだと思っていたのですが違うのでしょうか?
マスはオブジェクトですがチェックボックスはマスの状態ですよね。マス1つの状態と言うオブジェクトは良いと思うのですが、「チェックに関するクラス」がマスに直接干渉するとしたら、オブジェクト間の結合度が強すぎませんか?って事になると思います。[補正]
derok さんが書きました:
softya(ソフト屋) さんが書きました: >調べてみたのですが、ブロックが終了した場合自動的に解放するものの様ですが

Class_mainに使えばdeleteが不要になります。
具体的にどう使えばいいんでしょう?
普通に使おうとしたのですが、これらのオペランドと一致する"="は有りませんと言われます。
いろいろ調べてみたのですがよく分かりません。
こんな感じです。 どのスマートポインタを使ったかわかりませんでしたのでboostで記述してあります。

コード:

#include <iostream>
#include <boost/shared_ptr.hpp>
using namespace std;

class CTestBase {
public:
	CTestBase()         {
		cout << "CTestBase::コンストラクタ\n";
	};
	virtual ~CTestBase()    {
		cout << "CTestBase::デストラクタ\n\n";
	};
	virtual void Draw(int val) = 0;
};

class CTest1 : public CTestBase {
public:
	CTest1() {
		cout << "CTest1::コンストラクタ\n\n";
	}
	~CTest1() {
		cout << "CTest1::デストラクタ\n";
	}
	virtual void Draw(int val) {
		cout << "CTest2::Draw " << val << "\n\n";
	}
};

class CTest2 : public CTestBase {
public:
	CTest2() {
		cout << "CTest2::コンストラクタ\n\n";
	}
	~CTest2() {
		cout << "CTest2::デストラクタ\n";
	}
	virtual void Draw(int val) {
		cout << "CTest2::Draw " << val << "\n\n";
	}
};


int main() {
	boost::shared_ptr<CTestBase> pShared;
	pShared = boost::shared_ptr<CTestBase>( new CTest1() );
	for( int i=0 ; i<5 ; i++ ) {
		pShared->Draw(i);
	}
	pShared = boost::shared_ptr<CTestBase>( new CTest2() );
	for( int i=10 ; i<15 ; i++ ) {
		pShared->Draw(i);
	}
	
	return 0;
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

derok
記事: 51
登録日時: 12年前

Re: このプログラムはどうでしょうか?

#8

投稿記事 by derok » 12年前

softya(ソフト屋) さんが書きました:
derok さんが書きました:Hata_sousa → CheckMark (チェックに関するクラス)ですが「チェックマーク」という一つのオブジェクトだと思っていたのですが違うのでしょうか?
マスはオブジェクトですがチェックボックスはマスの状態ですよね。マス1つの状態と言うオブジェクトは良いと思うのですが、「チェックに関するクラス」がマスに直接干渉するとしたら、オブジェクト間の結合度が強すぎませんか?って事になると思います。[補正]
なるほど、オブジェクト間の結合度ですか、そう言うことも考えなければいけないませんね。
softya(ソフト屋) さんが書きました:
derok さんが書きました:
softya(ソフト屋) さんが書きました: >調べてみたのですが、ブロックが終了した場合自動的に解放するものの様ですが

Class_mainに使えばdeleteが不要になります。
具体的にどう使えばいいんでしょう?
普通に使おうとしたのですが、これらのオペランドと一致する"="は有りませんと言われます。
いろいろ調べてみたのですがよく分かりません。
こんな感じです。 どのスマートポインタを使ったかわかりませんでしたのでboostで記述してあります。
なるほど、newするたびにshared_ptrを使うのですか。おかげでReleaseビルドできました。

アドバイスを下さったsoftya(ソフト屋)様、h2so5様有難うございました。

閉鎖

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