C++とDXライブラリを使ってマインスイーパーの様な物を作りました。
しかし、オブジェクト指向でのプログラムは初めてでありちゃんとしたソースが掛けているかどうか心配です。
実際、Releaseビルドするとバグを発生します。(Debugビルドだと起こりません)
Releaseビルドのバグの原因は調べてみたのですが分かりませんでした。
ソースコードの評価も含めて教えてもらえないでしょうか?
このプログラムはどうでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: このプログラムはどうでしょうか?
すごく追いかけづらいので第一印象は、クラスやメンバ名と機能がズレている気がします。そのため直感的に追いかけれません。
あと同じような意味で英語だったりローマ字日本語だったり統一性が感じられないのも問題です。
それとSTLの活用やスマートポインタの活用などをすれば、Releaseビルドするとバグを発生は防げるかもしれません。
Class_mainってスマートポインタを使っていないのが原因で「念の為に初期化」とか変なことしてません?
あと同じような意味で英語だったりローマ字日本語だったり統一性が感じられないのも問題です。
それとSTLの活用やスマートポインタの活用などをすれば、Releaseビルドするとバグを発生は防げるかもしれません。
Class_mainってスマートポインタを使っていないのが原因で「念の為に初期化」とか変なことしてません?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: このプログラムはどうでしょうか?
一応、投稿にあたり読みやすさを重視したつもりだったのですが。softya(ソフト屋) さんが書きました: すごく追いかけづらいので第一印象は、クラスやメンバ名と機能がズレている気がします。そのため直感的に追いかけれません。
あと同じような意味で英語だったりローマ字日本語だったり統一性が感じられないのも問題です
クラス名についてはこんな感じですかね?
masu_sousa → CellOpen (クリックされた所のマスに関するクラス)
Hata_sousa → CheckMark (チェックに関するクラス)
end_gard → SceneMgr (処理する場面を管理するクラス)
Make_brock → DefiniteCellOpen (爆弾がないことが簡単にわかる場所を自動的に開けるクラス)
後、メンバ名なんですが、
nyuusyu関数→Get+データ名の様に変えるのでしょうか?
また、英語と日本語が混じることとよくないとおしゃられていますが、
Definite(確定的)なんかは少しわかりにくい気がしますが、
こういう風に英語にしにくい場合はどうするべきなのでしゅうか
スマートポインタと言う言葉自体初めて聞きました。softya( ソフト屋) さんが書きました:
それとSTLの活用やスマートポインタの活用などをすれば、Releaseビルドするとバグを発生は防げるかもしれません。
Class_mainってスマートポインタを使っていないのが原因で「念の為に初期化」とか変なことしてません?
調べてみたのですが、ブロックが終了した場合自動的に解放するものの様ですが、
これをどの様に使うのでしょうか?
Re: このプログラムはどうでしょうか?
英語かどうかは関係なく、「確定的」だと日本語でも意味が分かりにくいですよね。derok さんが書きました:一応、投稿にあたり読みやすさを重視したつもりだったのですが。softya(ソフト屋) さんが書きました: すごく追いかけづらいので第一印象は、クラスやメンバ名と機能がズレている気がします。そのため直感的に追いかけれません。
あと同じような意味で英語だったりローマ字日本語だったり統一性が感じられないのも問題です
クラス名についてはこんな感じですかね?
masu_sousa → CellOpen (クリックされた所のマスに関するクラス)
Hata_sousa → CheckMark (チェックに関するクラス)
end_gard → SceneMgr (処理する場面を管理するクラス)
Make_brock → DefiniteCellOpen (爆弾がないことが簡単にわかる場所を自動的に開けるクラス)
後、メンバ名なんですが、
nyuusyu関数→Get+データ名の様に変えるのでしょうか?
また、英語と日本語が混じることとよくないとおしゃられていますが、
Definite(確定的)なんかは少しわかりにくい気がしますが、
こういう風に英語にしにくい場合はどうするべきなのでしゅうか
「爆弾がないことが簡単にわかる場所を自動的に開けるクラス」なら、 CleanCellOpener というクラス名はどうでしょう。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: このプログラムはどうでしょうか?
同じ意味で英語と日本語が使われるのが問題なので統一はして下さい。
> nyuusyu関数→Get+データ名の様に変えるのでしょうか?
これですね。英語と日本語が混ざる事自体は分かりやすければ問題ありません。
>masu_sousa → CellOpen (クリックされた所のマスに関するクラス)
>Hata_sousa → CheckMark (チェックに関するクラス)
>end_gard → SceneMgr (処理する場面を管理するクラス)
>Make_brock → DefiniteCellOpen (爆弾がないことが簡単にわかる場所を自動的に開けるクラス)
どれもですがオブジェクト的に的確に分かれていない気がします。
そういう無理があるから、クラス名やメンバ関数名で機能とのズレが生じるのでは無いでしょうか?
例えば、Hata_sousa → CheckMark (チェックに関するクラス)ですが、結局何をするクラスか不明確に成る一方です。
>調べてみたのですが、ブロックが終了した場合自動的に解放するものの様ですが、
Class_mainに使えばdeleteが不要になります。
> nyuusyu関数→Get+データ名の様に変えるのでしょうか?
これですね。英語と日本語が混ざる事自体は分かりやすければ問題ありません。
>masu_sousa → CellOpen (クリックされた所のマスに関するクラス)
>Hata_sousa → CheckMark (チェックに関するクラス)
>end_gard → SceneMgr (処理する場面を管理するクラス)
>Make_brock → DefiniteCellOpen (爆弾がないことが簡単にわかる場所を自動的に開けるクラス)
どれもですがオブジェクト的に的確に分かれていない気がします。
そういう無理があるから、クラス名やメンバ関数名で機能とのズレが生じるのでは無いでしょうか?
例えば、Hata_sousa → CheckMark (チェックに関するクラス)ですが、結局何をするクラスか不明確に成る一方です。
>調べてみたのですが、ブロックが終了した場合自動的に解放するものの様ですが、
Class_mainに使えばdeleteが不要になります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: このプログラムはどうでしょうか?
アドバイス有難う御座います。確かにこういう場合日本語でも分かりにくい場合が多いかもしれませんね。h2so5 さんが書きました: 英語かどうかは関係なく、「確定的」だと日本語でも意味が分かりにくいですよね。
「爆弾がないことが簡単にわかる場所を自動的に開けるクラス」なら、 CleanCellOpener というクラス名はどうでしょう。
そうなのですか。プログラムを人に見せること自体初めてなので、そう言う事を考えてことが有りませんでしたsoftya(ソフト屋) さんが書きました:同じ意味で英語と日本語が使われるのが問題なので統一はして下さい。
> nyuusyu関数→Get+データ名の様に変えるのでしょうか?
これですね。英語と日本語が混ざる事自体は分かりやすければ問題ありません。
Hata_sousa → CheckMark (チェックに関するクラス)ですが「チェックマーク」という一つのオブジェクトだと思っていたのですが違うのでしょうか?softya(ソフト屋) さんが書きました: >masu_sousa → CellOpen (クリックされた所のマスに関するクラス)
>Hata_sousa → CheckMark (チェックに関するクラス)
>end_gard → SceneMgr (処理する場面を管理するクラス)
>Make_brock → DefiniteCellOpen (爆弾がないことが簡単にわかる場所を自動的に開けるクラス)
どれもですがオブジェクト的に的確に分かれていない気がします。
そういう無理があるから、クラス名やメンバ関数名で機能とのズレが生じるのでは無いでしょうか?
例えば、Hata_sousa → CheckMark (チェックに関するクラス)ですが、結局何をするクラスか不明確に成る一方です。
具体的にどう使えばいいんでしょう?softya(ソフト屋) さんが書きました: >調べてみたのですが、ブロックが終了した場合自動的に解放するものの様ですが
Class_mainに使えばdeleteが不要になります。
普通に使おうとしたのですが、これらのオペランドと一致する"="は有りませんと言われます。
いろいろ調べてみたのですがよく分かりません。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: このプログラムはどうでしょうか?
マスはオブジェクトですがチェックボックスはマスの状態ですよね。マス1つの状態と言うオブジェクトは良いと思うのですが、「チェックに関するクラス」がマスに直接干渉するとしたら、オブジェクト間の結合度が強すぎませんか?って事になると思います。[補正]derok さんが書きました:Hata_sousa → CheckMark (チェックに関するクラス)ですが「チェックマーク」という一つのオブジェクトだと思っていたのですが違うのでしょうか?
こんな感じです。 どのスマートポインタを使ったかわかりませんでしたのでboostで記述してあります。derok さんが書きました:具体的にどう使えばいいんでしょう?softya(ソフト屋) さんが書きました: >調べてみたのですが、ブロックが終了した場合自動的に解放するものの様ですが
Class_mainに使えばdeleteが不要になります。
普通に使おうとしたのですが、これらのオペランドと一致する"="は有りませんと言われます。
いろいろ調べてみたのですがよく分かりません。
#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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: このプログラムはどうでしょうか?
なるほど、オブジェクト間の結合度ですか、そう言うことも考えなければいけないませんね。softya(ソフト屋) さんが書きました:マスはオブジェクトですがチェックボックスはマスの状態ですよね。マス1つの状態と言うオブジェクトは良いと思うのですが、「チェックに関するクラス」がマスに直接干渉するとしたら、オブジェクト間の結合度が強すぎませんか?って事になると思います。[補正]derok さんが書きました:Hata_sousa → CheckMark (チェックに関するクラス)ですが「チェックマーク」という一つのオブジェクトだと思っていたのですが違うのでしょうか?
なるほど、newするたびにshared_ptrを使うのですか。おかげでReleaseビルドできました。softya(ソフト屋) さんが書きました:こんな感じです。 どのスマートポインタを使ったかわかりませんでしたのでboostで記述してあります。derok さんが書きました:具体的にどう使えばいいんでしょう?softya(ソフト屋) さんが書きました: >調べてみたのですが、ブロックが終了した場合自動的に解放するものの様ですが
Class_mainに使えばdeleteが不要になります。
普通に使おうとしたのですが、これらのオペランドと一致する"="は有りませんと言われます。
いろいろ調べてみたのですがよく分かりません。
アドバイスを下さったsoftya(ソフト屋)様、h2so5様有難うございました。