トップページ⇒tech
1001コメント438KB

-OOP限定-プログラム設計相談室

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2005/09/24(土) 16:35:59
全部publicでいいじゃん!ってならないようにするスレです。
0951デフォルトの名無しさん2012/08/10(金) 17:07:13.87
というのはユースケース図書いてもシーケンス図とかクラス図とか書くんですけど、実装になるとなんかつじつまというかそういうのが合わなくなって途中でダメになるんですよね
0952デフォルトの名無しさん2012/08/10(金) 17:17:27.60
実装を先にやらないからだよ
0953uy2012/08/10(金) 17:29:58.47
LLとかでさっと試作プログラムの作成→それみながら設計→本番プログラム
0954デフォルトの名無しさん2012/08/10(金) 17:38:11.11
やべぇ
uyに同意だ
0955uy2012/08/15(水) 01:49:41.59
オブジェクト指向厨にききたいんだけど
本気でオブジェクト指向で書くとグローバル変数1個もなくなるよね?

でも色んな場所で使う情報はグローバル変数に入れたほうがコーディング効率が良い
オブジェクト指向的にグローバル変数って概念は有りなの?無しなの?特例なの?
0956デフォルトの名無しさん2012/08/15(水) 03:22:21.34
Applicationなんちゃらというようなオブジェクトがグローバルに
参照可能になっていて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のオブジェクトは構造化の関数と違い
機能にデータを渡すのではなく
データに機能が付いている。

つまり、オブジェクトは変数と同等。

オブジェクトがどこからでも参照でき
更新に制約がなければ、そのオブジェクトはグローバル変数と変わらない。

オブジェクト=機能と取られる人が多いが
OOの本質からするとオブジェクト=変数だと理解出来ている人が少ない。
0960uy2012/08/15(水) 14:10:50.02
OOでグローバル変数はなしか

またゲームの話になってしまうけど
Player情報っていうか、
残機 、残ボム、 得点 、プレイヤー自身のオブジェクトのポインタ(Enemy_shotとかでプレイヤー座標が欲しい為)

この4つくらいはどうしてもグローバル変数になっちゃうんだけど
ここら辺だけが唯一ソースがまとまらない

一応ライブラリ内部のみでグローバル変数アクセスは行って、表面上は相対アクセスのように見せかけたりは出来るけど
ゴミ箱に蓋をしたに過ぎないと思う
0961uy2012/08/15(水) 14:11:49.32
>>959
そのグローバル変数をなくしたい
0962デフォルトの名無しさん2012/08/15(水) 14:29:49.18
>>959
データでも関数でもない単位を扱いたいから、
わざわざ抽象化してそれをオブジェクトと呼んだのでは?

しかも、インタフェースのデザインを考える場合、
実質的にはメソッド群とそれにつける名前を設計するわけで、
そう考えるとどっちかというとOOPでの設計の本質は、
「メソッド群+その命名」の設計だと思う。データというよりはね。
0963デフォルトの名無しさん2012/08/15(水) 14:41:51.03
>>955
シングルトン
0964デフォルトの名無しさん2012/08/15(水) 14:45:42.06
>>960

ゲーム管理クラスがそれぞれのオブジェクトを管理する。

シーンを木構造で考えるとどこに配置するのが良いか見えてくると思う。

システム-> メニュー
ゲーム -> プレイヤー情報
スコア
ステージ -> 自機
-> 背景
                  -> 敵

アーケードでSTG作ったときはCしか使えなかったのでCでツリー構造の処理系作ってこんな感じで処理してた。
まあ、いわゆるアレシステム。 弾とかアイテムは数が多いので1つのアレでまとめて管理
0965デフォルトの名無しさん2012/08/15(水) 14:46:55.38
半角スペースだめだったっけかwww

システム-> メニュー
       ゲーム -> プレイヤー情報
             スコア
             ステージ -> 自機
                  -> 背景
                  -> 敵

C++ならそれぞれをオブジェクトにしてそれぞれの生成/破棄を管理する感じかね。
0966uy2012/08/15(水) 15:14:00.17
>>965
一応、木構造だけど、
rubyの
class A
end
このclass Aの内部からアクセスできるのはグローバル変数だけなんだ
Cでいうところのグローバルstatic変数が欲しいけどそれは無い


システム-> メニュー
        ゲーム ->
               ステージ -> 自機( プレイヤー情報( スコア )
                    -> 背景
                    -> 敵


システム-> オブジェクトパターン ->
                     -> 自機
                     -> 自機ショット
                     -> 敵
                     -> 敵ショット( 誘導弾とかの作成の為に自機の情報へアクセスしたい )
                     -> エフェクト etc 
設計はいまこんな感じで、いま自機のところに情報を詰め込んだ

この オブジェクトパターン 自体はライブラリにされていて
そこのパターンから選択してゲームを作る形

自機情報と、現在どのシーンを見ているか?っていう情報だけグローバル変数にポインタを持たせてる

09679592012/08/15(水) 15:32:12.81
>>961
>そのグローバル変数をなくしたい
グローバル変数とローカル変数の違いは
・スコープ
・生存期間
これを管理すれば、ローカル変数と同等。
オブジェクトを指す”変数”のスコープや生存期間を制御すればいい。

>>962
>わざわざ抽象化してそれをオブジェクトと呼んだのでは?
抽象化はクラスレベルで定義。オブジェクトでは具象化されている。

>実質的にはメソッド群とそれにつける名前を設計するわけで、
メソッドは手段であって目的はフィールド(変数)の操作。
「○○○をXXXする」○○○の主語がフィールドで、XXXの動詞がメソッド。

メソッドの存在しないオブジェクトはありえるが
フィールドがないオブジェクトは関数ライブラリと同じ。
0968uy2012/08/15(水) 16:02:40.83
>オブジェクトを指す”変数”のスコープや生存期間を制御すればいい。
シーン自体に初期化や、解放の為のコードは書きたくない


俺様のはOOとしてみたらクズ設計だと分かった

オブジェクトの動作パターンはシーン以下の階層には置かないことは決定してて
そこからステージ内の変数にアクセスって事は、アレか

初期化のための
セッター & げったー か グローバル変数と大差ない


もういいや
0969uy2012/08/15(水) 16:03:45.96
あ、これセッターゲッターでいいわ
いける
0970デフォルトの名無しさん2012/08/16(木) 01:49:29.27
ぶっちゃけRubyはなにがどうなってるのかまったく知らないのでアドバイスはできんが
C++ならファクトリー関数をクラスに持たせてやることでカプセル化が強固になる。

クラス内での生成はしたくないということだが、必要なときに必要なものだけ生成するようにしないと
全部のリソースオンメモリなゲームになる。STG程度ならまあいまのPCなら余裕ではあるが。
0971uy2012/08/16(木) 04:12:01.50
>>970
グローバル変数が出来る事は別によかったんだ
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日後好きな人から告白されるわ宝くじは当たるわ 
出世しまくるわ体の悪い所全部治るわでえらい事です
0973uy2012/08/17(金) 00:15:40.80
            ,:::-、       __
      ,,r::::::::::::〈:::::::::)    ィ::::::ヽ
      〃::::::::::::;r‐''´:::::::::::::::::::::ヽ::ノ
    ,'::;'::::::::::::::/::::::::::::::::::::::::::::::::::::
     l::::::::::::::::::l::::::::::●::::::::::::::●:::::ji
    |::::::::::::::::::、::::::::::::::( _●_)::::::,j:l  クマー!
    }::::::::::::::::::::ゝ、::::::::::|∪|_ノ::;!
.    {::::::::::::::::::::::::::::`='=::ヽノ:::::/     
    ';::::::::::::ト、::::::::::::::i^i::::::::::::/
      `ー--' ヽ:::::::::::l l;;;;::::ノ
【ラッキーレス】
このレスを見た人はコピペでもいいので
10分以内に3つのスレへ貼り付けてください。
そうすれば14日後好きな人から告白されるわ宝くじは当たるわ
出世しまくるわ体の悪い所全部治るわでえらい事です
0974uY2012/08/18(土) 03:43:22.24
OO厨に意見もらったおかげで設計は完璧になった
最高の気分です
0975uY2012/08/21(火) 20:43:54.16
無理だと思うけど質問してみる

Windowsにあるようなウィンドウをプログラム内で作りたいんだけど
一応WinAPIにならってウィンドウオブジェクトにメッセージを飛ばす形で作ってる

アクティブウィンドウと非アクティブウィンドウってあるけど、

非アクティブウィンドウをクリックした際のメッセージを送るタイミングってどうするべき?


非アクティブ状態ではメッセージをウィンドウは受け取らず、

"アクティブにする"というメッセージを送ってからアクティブにさせてから
クリック判定されたとかのメッセージを送るか

そもそも非アクティブ状態でもメッセージを送信するようにしておいて
ウィンドウ側で、自身が非アクティブな場合は不必要なメッセージをスルーするようにするか

Windowsのウィンドウのカスタマイズ性を考えると
後者の実装のような気がしなくもないけど、アクティブ非アクティブ関係なく全ウィンドウに常にメッセージ送信してるのってどうなんだろう
0976デフォルトの名無しさん2012/08/21(火) 20:54:43.69
そんなもんOOP的にどうかじゃなくてお前がどう使いたいのかで決めることだろ
>ウィンドウのカスタマイズ性を考えると とか >どうなんだろう とか
そんなもんお前がどうカスタマイズしたいのか、メッセージをどんな風に扱いたいのかに依るだろう
0977uY2012/08/21(火) 21:42:36.82
Windowsのウィンドウシステムのフルスクラッチをしたいんだよ

何でもいいから実装方法かいてよ
作ったことないプログラムは無理ですか?

>アクティブ非アクティブ関係なく全ウィンドウに常にメッセージ送信
これは普通に作ったら、実行速度に影響する
だから「非アクティブでもメッセージを受け取る or 受け取らない」
っていうようなフラグが必要になってしまうようなカス設計しか今は思いつかないから相談しにきたんだけど?
0978デフォルトの名無しさん2012/08/21(火) 22:04:57.64
そんなもん速度に全く影響しないだろ
ウィンドウ何個作る気だよ
0979uY2012/08/21(火) 22:09:29.58
>>978
OS設計として考えて欲しい

ウィンドウ( ウィンドウオブジェクトとして扱うと楽になるオブジェクト ) は
OSの中ではめちゃめちゃ数が多い
軽く100,200は想定すべき
0980uY2012/08/21(火) 22:14:11.82
そんでメッセージっていうのは

マウスクリックだけじゃなくてマウスオーバーや
マウスがクリックされていないというメッセージも必要なんだよ

あるいは、キーマウスだけじゃなく、ウィンドウ制御用のメッセージもおそらく後から必要になる
俺はひとつ"W_WIN_CHANGE" みたいなメッセージ作った
これはウィンドウのアクティブ、非アクティブが切り替わった時に発行するメッセージ
少なくとも、アクティブになった、非アクティブになった、ウィンドウが生成された、ウィンドウが重なった
今思いつくだけでもこれだけのメッセージは最低限必要になり、
キーマウスイベントなどが発生するたびに飛ばす事になる
0981デフォルトの名無しさん2012/08/21(火) 23:47:52.87
どうせゲーム用のUIを独自で作ろうなんて考えてるんだろう。
そんなくらいでコストって言ってたら、WM_NCHITTESTの発行回数みて発狂しそうだな。
0982デフォルトの名無しさん2012/08/21(火) 23:53:24.76
>>975
>そもそも非アクティブ状態でもメッセージを送信するようにしておいて
>ウィンドウ側で、自身が非アクティブな場合は不必要なメッセージをスルーするようにするか
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
最近はOSはウィンドウ(便宜上そう扱うんじゃなくて本当の意味のウィンドウ)だけ管理して
その中はゲームみたいにアプリケーションごとに箱庭でやるのが流行りだよね
0985デフォルトの名無しさん2012/08/22(水) 00:49:30.72
そもそも既存のウィンドウアプリケーションにおいて
ウィンドウシステムによってもアプリによっても非アクティブ時の挙動の標準が異なる

例えばWindowsは非アクティブ時、クリックを受け付けるのが標準で
MacOSXは非アクティブ時、クリックはアクティブ化のみってのが標準だが
どちらもそうでない実装をしてるアプリはあるしな
0986uy2012/08/22(水) 05:36:18.57
>>981,983
ゲームで使う気はまだない
ただ仕組みをそのまま作りたいだけ


>>982
参考になるわ
Cでかけば問題ないんだろけど
rubyだから速度はかなり気にしながら書かないといけない

>>984
ほう


>>985
そこら辺が謎なんだよな
アプリによってウィンドウの挙動を変えられるようにしてるってことは
マジでソースがフラグや設定項目だらけになりそう
0987デフォルトの名無しさん2012/08/22(水) 10:42:40.86
Spy++で実際にどんなメッセージがどんだけ流れてるか見て発狂したらいいと思うよ
0988デフォルトの名無しさん2012/08/22(水) 11:09:08.74
15年前の段階でも多すぎてspy++のフィルタリングじゃどれがどれだかさっぱりなので
態々自前のより細かく条件指定できるメッセージロガー作るのを強いられるぐらい凄い
0989uy2012/08/22(水) 11:09:35.63
そんなゴミカス設計にしたくないは
0990uy2012/08/22(水) 11:16:07.76
Windowsをウィンドウメッセージを考えてたら自信が出てきた
余裕でこんなもの以上の作れるな
0991デフォルトの名無しさん2012/08/22(水) 11:37:43.79
uyには無理
0992デフォルトの名無しさん2012/08/22(水) 14:00:03.86
uyには無理っていいな
流行ってるの?
0993uY2012/08/22(水) 14:26:45.78
趣味の中の趣味で作るだけ
ゲームを作るのに飽きたら1日だけ脱線して作業する為のSubプロジェクト
0994デフォルトの名無しさん2012/08/22(水) 15:51:27.74
Spy++で流れてるメッセージの量見て発狂するなんて
どんだけ脳味噌小さいんだ
0995デフォルトの名無しさん2012/08/22(水) 15:57:26.51
話の流れ読んでから書こうぜ
実行速度の話だぜ
0996デフォルトの名無しさん2012/08/23(木) 00:51:38.72
作りたいと思ってるのに何で人に訊くんだ?
馬鹿なの?
0997デフォルトの名無しさん2012/08/23(木) 01:49:50.64
日本語
0998デフォルトの名無しさん2012/08/23(木) 05:18:25.10
 
0999デフォルトの名無しさん2012/08/23(木) 05:19:13.55
 
1000デフォルトの名無しさん2012/08/23(木) 05:29:10.26
              __
       r:...、 /::::::}
       _{::-::> ´ ̄ ̄`   、
      く::::/         \
.      〉′{ / ハ }∧ ヽ ハ   きょろーん
      { i ∨ノ }-ノ \ノハi }
      | |  | ●   ● 〈从リ
      | | ⊂⊃ 、_,、_, ⊂} |
      } i⌒ヽ、  (_.ノ  ノ八__/⌒)
      i ヽ  ヽ>-´-r彡; | :::ヽ/.
      / /∧__,ヘ}:ヽ  }::/l| |',:::ハ\
.     / / ヾ_:::ッリ:ヘ_{::| .| |<''´i ヽ
    / / / 人  | ::::V:: .| ノ|  } } }
    { { { |  .|∨`冗´ノ |ノノ ノ
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。