-OOP限定-プログラム設計相談室
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2005/09/24(土) 16:35:590951デフォルトの名無しさん
2012/08/10(金) 17:07:13.870952デフォルトの名無しさん
2012/08/10(金) 17:17:27.600953uy
2012/08/10(金) 17:29:58.470954デフォルトの名無しさん
2012/08/10(金) 17:38:11.11uyに同意だ
0955uy
2012/08/15(水) 01:49:41.59本気でオブジェクト指向で書くとグローバル変数1個もなくなるよね?
でも色んな場所で使う情報はグローバル変数に入れたほうがコーディング効率が良い
オブジェクト指向的にグローバル変数って概念は有りなの?無しなの?特例なの?
0956デフォルトの名無しさん
2012/08/15(水) 03:22:21.34参照可能になっていてset/get的なメソッドがあって、
メジャーなクラスライブラリのリファレンスを見て行くと
グローバル変数的な何かを発見してしまうことしばしばw
0957デフォルトの名無しさん
2012/08/15(水) 07:14:36.42ただしグローバル変数に直アクセス出来るならクソ
Cであっても関数経由でのみアクセス出来るならいい
0958デフォルトの名無しさん
2012/08/15(水) 09:29:16.21グローバル定数ならあるけど
0959デフォルトの名無しさん
2012/08/15(水) 13:59:06.14機能にデータを渡すのではなく
データに機能が付いている。
つまり、オブジェクトは変数と同等。
オブジェクトがどこからでも参照でき
更新に制約がなければ、そのオブジェクトはグローバル変数と変わらない。
オブジェクト=機能と取られる人が多いが
OOの本質からするとオブジェクト=変数だと理解出来ている人が少ない。
0960uy
2012/08/15(水) 14:10:50.02またゲームの話になってしまうけど
Player情報っていうか、
残機 、残ボム、 得点 、プレイヤー自身のオブジェクトのポインタ(Enemy_shotとかでプレイヤー座標が欲しい為)
この4つくらいはどうしてもグローバル変数になっちゃうんだけど
ここら辺だけが唯一ソースがまとまらない
一応ライブラリ内部のみでグローバル変数アクセスは行って、表面上は相対アクセスのように見せかけたりは出来るけど
ゴミ箱に蓋をしたに過ぎないと思う
0962デフォルトの名無しさん
2012/08/15(水) 14:29:49.18データでも関数でもない単位を扱いたいから、
わざわざ抽象化してそれをオブジェクトと呼んだのでは?
しかも、インタフェースのデザインを考える場合、
実質的にはメソッド群とそれにつける名前を設計するわけで、
そう考えるとどっちかというとOOPでの設計の本質は、
「メソッド群+その命名」の設計だと思う。データというよりはね。
0963デフォルトの名無しさん
2012/08/15(水) 14:41:51.03シングルトン
0964デフォルトの名無しさん
2012/08/15(水) 14:45:42.06ゲーム管理クラスがそれぞれのオブジェクトを管理する。
シーンを木構造で考えるとどこに配置するのが良いか見えてくると思う。
システム-> メニュー
ゲーム -> プレイヤー情報
スコア
ステージ -> 自機
-> 背景
-> 敵
アーケードでSTG作ったときはCしか使えなかったのでCでツリー構造の処理系作ってこんな感じで処理してた。
まあ、いわゆるアレシステム。 弾とかアイテムは数が多いので1つのアレでまとめて管理
0965デフォルトの名無しさん
2012/08/15(水) 14:46:55.38システム-> メニュー
ゲーム -> プレイヤー情報
スコア
ステージ -> 自機
-> 背景
-> 敵
C++ならそれぞれをオブジェクトにしてそれぞれの生成/破棄を管理する感じかね。
0966uy
2012/08/15(水) 15:14:00.17一応、木構造だけど、
rubyの
class A
end
このclass Aの内部からアクセスできるのはグローバル変数だけなんだ
Cでいうところのグローバルstatic変数が欲しいけどそれは無い
システム-> メニュー
ゲーム ->
ステージ -> 自機( プレイヤー情報( スコア )
-> 背景
-> 敵
システム-> オブジェクトパターン ->
-> 自機
-> 自機ショット
-> 敵
-> 敵ショット( 誘導弾とかの作成の為に自機の情報へアクセスしたい )
-> エフェクト etc
設計はいまこんな感じで、いま自機のところに情報を詰め込んだ
この オブジェクトパターン 自体はライブラリにされていて
そこのパターンから選択してゲームを作る形
自機情報と、現在どのシーンを見ているか?っていう情報だけグローバル変数にポインタを持たせてる
0967959
2012/08/15(水) 15:32:12.81>そのグローバル変数をなくしたい
グローバル変数とローカル変数の違いは
・スコープ
・生存期間
これを管理すれば、ローカル変数と同等。
オブジェクトを指す”変数”のスコープや生存期間を制御すればいい。
>>962
>わざわざ抽象化してそれをオブジェクトと呼んだのでは?
抽象化はクラスレベルで定義。オブジェクトでは具象化されている。
>実質的にはメソッド群とそれにつける名前を設計するわけで、
メソッドは手段であって目的はフィールド(変数)の操作。
「○○○をXXXする」○○○の主語がフィールドで、XXXの動詞がメソッド。
メソッドの存在しないオブジェクトはありえるが
フィールドがないオブジェクトは関数ライブラリと同じ。
0968uy
2012/08/15(水) 16:02:40.83シーン自体に初期化や、解放の為のコードは書きたくない
俺様のはOOとしてみたらクズ設計だと分かった
オブジェクトの動作パターンはシーン以下の階層には置かないことは決定してて
そこからステージ内の変数にアクセスって事は、アレか
初期化のための
セッター & げったー か グローバル変数と大差ない
もういいや
0969uy
2012/08/15(水) 16:03:45.96いける
0970デフォルトの名無しさん
2012/08/16(木) 01:49:29.27C++ならファクトリー関数をクラスに持たせてやることでカプセル化が強固になる。
クラス内での生成はしたくないということだが、必要なときに必要なものだけ生成するようにしないと
全部のリソースオンメモリなゲームになる。STG程度ならまあいまのPCなら余裕ではあるが。
0971uy
2012/08/16(木) 04:12:01.50グローバル変数が出来る事は別によかったんだ
rubyはモジュール、クラスのスコープが複雑だから、そこにさらにMix-inの関係も複雑になる場合だと
メンバ変数、クラス変数がどこまでスコープ聞いてるか俺でも分からなくなるので
思い切ってグローバル変数にした方が圧倒的にマシ
どこにその変数作るかとか、そのグローバル変数の初期化場所で悩んでただけかもしれない
クラスは使ってないけどカプセル化については、完璧すぎるくらいに出来てる
いやクラスは1個だけ使ってるんだけどね
シーンも含めゲーム中のオブジェクトの全てを生成するクラスが根にあって
そのクラスでオブジェクトを生成してから、lambdaで実装を書くような感じだから
メンバ変数やクラス変数もないし、基本的にローカル変数しか必要としないので最強
0972デフォルトの名無しさん
2012/08/16(木) 23:40:25.51,,r::::::::::::〈:::::::::) ィ::::::ヽ
〃::::::::::::;r‐''´:::::::::::::::::::::ヽ::ノ
,'::;'::::::::::::::/::::::::::::::::::::::::::::::::::::
l::::::::::::::::::l::::::::::●::::::::::::::●:::::ji
|::::::::::::::::::、::::::::::::::( _●_)::::::,j:l クマー!
}::::::::::::::::::::ゝ、::::::::::|∪|_ノ::;!
. {::::::::::::::::::::::::::::`='=::ヽノ:::::/
';::::::::::::ト、::::::::::::::i^i::::::::::::/
`ー--' ヽ:::::::::::l l;;;;::::ノ
【ラッキーレス】
このレスを見た人はコピペでもいいので
10分以内に3つのスレへ貼り付けてください。
そうすれば14日後好きな人から告白されるわ宝くじは当たるわ
出世しまくるわ体の悪い所全部治るわでえらい事です
0973uy
2012/08/17(金) 00:15:40.80,,r::::::::::::〈:::::::::) ィ::::::ヽ
〃::::::::::::;r‐''´:::::::::::::::::::::ヽ::ノ
,'::;'::::::::::::::/::::::::::::::::::::::::::::::::::::
l::::::::::::::::::l::::::::::●::::::::::::::●:::::ji
|::::::::::::::::::、::::::::::::::( _●_)::::::,j:l クマー!
}::::::::::::::::::::ゝ、::::::::::|∪|_ノ::;!
. {::::::::::::::::::::::::::::`='=::ヽノ:::::/
';::::::::::::ト、::::::::::::::i^i::::::::::::/
`ー--' ヽ:::::::::::l l;;;;::::ノ
【ラッキーレス】
このレスを見た人はコピペでもいいので
10分以内に3つのスレへ貼り付けてください。
そうすれば14日後好きな人から告白されるわ宝くじは当たるわ
出世しまくるわ体の悪い所全部治るわでえらい事です
0974uY
2012/08/18(土) 03:43:22.24最高の気分です
0975uY
2012/08/21(火) 20:43:54.16Windowsにあるようなウィンドウをプログラム内で作りたいんだけど
一応WinAPIにならってウィンドウオブジェクトにメッセージを飛ばす形で作ってる
アクティブウィンドウと非アクティブウィンドウってあるけど、
非アクティブウィンドウをクリックした際のメッセージを送るタイミングってどうするべき?
非アクティブ状態ではメッセージをウィンドウは受け取らず、
"アクティブにする"というメッセージを送ってからアクティブにさせてから
クリック判定されたとかのメッセージを送るか
そもそも非アクティブ状態でもメッセージを送信するようにしておいて
ウィンドウ側で、自身が非アクティブな場合は不必要なメッセージをスルーするようにするか
Windowsのウィンドウのカスタマイズ性を考えると
後者の実装のような気がしなくもないけど、アクティブ非アクティブ関係なく全ウィンドウに常にメッセージ送信してるのってどうなんだろう
0976デフォルトの名無しさん
2012/08/21(火) 20:54:43.69>ウィンドウのカスタマイズ性を考えると とか >どうなんだろう とか
そんなもんお前がどうカスタマイズしたいのか、メッセージをどんな風に扱いたいのかに依るだろう
0977uY
2012/08/21(火) 21:42:36.82何でもいいから実装方法かいてよ
作ったことないプログラムは無理ですか?
>アクティブ非アクティブ関係なく全ウィンドウに常にメッセージ送信
これは普通に作ったら、実行速度に影響する
だから「非アクティブでもメッセージを受け取る or 受け取らない」
っていうようなフラグが必要になってしまうようなカス設計しか今は思いつかないから相談しにきたんだけど?
0978デフォルトの名無しさん
2012/08/21(火) 22:04:57.64ウィンドウ何個作る気だよ
0979uY
2012/08/21(火) 22:09:29.58OS設計として考えて欲しい
ウィンドウ( ウィンドウオブジェクトとして扱うと楽になるオブジェクト ) は
OSの中ではめちゃめちゃ数が多い
軽く100,200は想定すべき
0980uY
2012/08/21(火) 22:14:11.82マウスクリックだけじゃなくてマウスオーバーや
マウスがクリックされていないというメッセージも必要なんだよ
あるいは、キーマウスだけじゃなく、ウィンドウ制御用のメッセージもおそらく後から必要になる
俺はひとつ"W_WIN_CHANGE" みたいなメッセージ作った
これはウィンドウのアクティブ、非アクティブが切り替わった時に発行するメッセージ
少なくとも、アクティブになった、非アクティブになった、ウィンドウが生成された、ウィンドウが重なった
今思いつくだけでもこれだけのメッセージは最低限必要になり、
キーマウスイベントなどが発生するたびに飛ばす事になる
0981デフォルトの名無しさん
2012/08/21(火) 23:47:52.87そんなくらいでコストって言ってたら、WM_NCHITTESTの発行回数みて発狂しそうだな。
0982デフォルトの名無しさん
2012/08/21(火) 23:53:24.76>そもそも非アクティブ状態でもメッセージを送信するようにしておいて
>ウィンドウ側で、自身が非アクティブな場合は不必要なメッセージをスルーするようにするか
MSのWindowsはこれだね。だから
>これは普通に作ったら、実行速度に影響する
一応この方式でも問題ないと思うけど。
OO的に考えると、アクティブか非アクティブかはメッセージ送信側が考えるじゃなく
受け取る側(オブジェクト)が考える方がOO的だけど
OSならある程度レスポンスを考慮してもいいと思う。
0983デフォルトの名無しさん
2012/08/22(水) 00:33:24.55アクティブリストに載せたりはずしたりすればいいだけだと思うが。
shared_ptrとweak_ptrを使えば容易にそのようなリストを無制限に作れる。
0984デフォルトの名無しさん
2012/08/22(水) 00:48:15.58その中はゲームみたいにアプリケーションごとに箱庭でやるのが流行りだよね
0985デフォルトの名無しさん
2012/08/22(水) 00:49:30.72ウィンドウシステムによってもアプリによっても非アクティブ時の挙動の標準が異なる
例えばWindowsは非アクティブ時、クリックを受け付けるのが標準で
MacOSXは非アクティブ時、クリックはアクティブ化のみってのが標準だが
どちらもそうでない実装をしてるアプリはあるしな
0986uy
2012/08/22(水) 05:36:18.57ゲームで使う気はまだない
ただ仕組みをそのまま作りたいだけ
>>982
参考になるわ
Cでかけば問題ないんだろけど
rubyだから速度はかなり気にしながら書かないといけない
>>984
ほう
>>985
そこら辺が謎なんだよな
アプリによってウィンドウの挙動を変えられるようにしてるってことは
マジでソースがフラグや設定項目だらけになりそう
0987デフォルトの名無しさん
2012/08/22(水) 10:42:40.860988デフォルトの名無しさん
2012/08/22(水) 11:09:08.74態々自前のより細かく条件指定できるメッセージロガー作るのを強いられるぐらい凄い
0989uy
2012/08/22(水) 11:09:35.630990uy
2012/08/22(水) 11:16:07.76余裕でこんなもの以上の作れるな
0991デフォルトの名無しさん
2012/08/22(水) 11:37:43.790992デフォルトの名無しさん
2012/08/22(水) 14:00:03.86流行ってるの?
0993uY
2012/08/22(水) 14:26:45.78ゲームを作るのに飽きたら1日だけ脱線して作業する為のSubプロジェクト
0994デフォルトの名無しさん
2012/08/22(水) 15:51:27.74どんだけ脳味噌小さいんだ
0995デフォルトの名無しさん
2012/08/22(水) 15:57:26.51実行速度の話だぜ
0996デフォルトの名無しさん
2012/08/23(木) 00:51:38.72馬鹿なの?
0997デフォルトの名無しさん
2012/08/23(木) 01:49:50.640998デフォルトの名無しさん
2012/08/23(木) 05:18:25.100999デフォルトの名無しさん
2012/08/23(木) 05:19:13.551000デフォルトの名無しさん
2012/08/23(木) 05:29:10.26r:...、 /::::::}
_{::-::> ´ ̄ ̄` 、
く::::/ \
. 〉′{ / ハ }∧ ヽ ハ きょろーん
{ i ∨ノ }-ノ \ノハi }
| | | ● ● 〈从リ
| | ⊂⊃ 、_,、_, ⊂} |
} i⌒ヽ、 (_.ノ ノ八__/⌒)
i ヽ ヽ>-´-r彡; | :::ヽ/.
/ /∧__,ヘ}:ヽ }::/l| |',:::ハ\
. / / ヾ_:::ッリ:ヘ_{::| .| |<''´i ヽ
/ / / 人 | ::::V:: .| ノ| } } }
{ { { | .|∨`冗´ノ |ノノ ノ
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。