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

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

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん2005/09/24(土) 16:35:59
全部publicでいいじゃん!ってならないようにするスレです。
0876uy2012/07/22(日) 23:53:31.26
相変わらずOOスレはかっわいそうなことになってんな
0877デフォルトの名無しさん2012/07/22(日) 23:57:36.79
で、お前はソフトの1本でもリリースできたか?
早くこらのスレが黒歴史になってコテ付けて書き込んだことを絶対公言できないようになれよ
0878デフォルトの名無しさん2012/07/23(月) 00:12:44.61
>>868
生ポインタをあつかう理由がまったくないのでそのファクトリー関数はshared_ptrを返すように書き換える
0879デフォルトの名無しさん2012/07/23(月) 00:46:46.47
>>874
クラス 描画先
{
public:
 描画する(直線);
 描画する(円);
 描画する(円弧);
 描画する(図形)
 {
  assert(0);
 }
};

クラス 直線 : 図形
{
 上書 描画する(描画先)
 {
  描画先.描画する(this);
 }
};
0880デフォルトの名無しさん2012/07/23(月) 00:59:40.57
>>879
なんの解決にもなってないだろ
あとそういう描画にダブルディスパッチはやめたほうがいい
拡張性が下がる
0881デフォルトの名無しさん2012/07/23(月) 01:03:41.02
要素と描画は完全に分離したほうがいいな。

数値はintとかdouble出あつかうとして、点のクラスが必要。

点の集合である基本線のクラス、それらを複数集合した図形クラス。


上記の操作や描画は、それらを利用して処理するようにしたほうがいい。
0882デフォルトの名無しさん2012/07/23(月) 01:05:04.40
直線と円弧を考えると

直線には不要なメンバ(角度、中心点)がありますよね

直線と円弧の親クラスに角度、中心点もメンバとして入れるか否かを聞きたいです。
0883デフォルトの名無しさん2012/07/23(月) 01:07:45.88
直接クラスを相互参照させたダブルディスパッチはやめれ
せめて図形側を抽象化クラスにして単方向の参照にしたほうがいい
あと、ダブルディスパッチするなら"描画する(図形)"は要らんだろ
0884デフォルトの名無しさん2012/07/23(月) 01:09:12.32
>>880
LokiのCyclic Visitorのような物を使えば、拡張性は逆に上がるとおもうけど。
>>879だと描画先だけど、オブジェクトに対する操作をストラテジパターン的に扱えるようになるし。
0885デフォルトの名無しさん2012/07/23(月) 01:11:06.51
>>881
目的をBitmap限定にするならそれでもいいかもしれんが、
バックエンドをOpenGLやSVGみたいなベクターグラフィックにするならアウト。
SSEつかって描画したいってケースでも使えない。
単に描画指示情報と、レンダラーに分離したほうがまだ意味がある。
0886デフォルトの名無しさん2012/07/23(月) 01:13:02.54
>>884
>>874の悩みになんの解決にもなってないって話。
0887デフォルトの名無しさん2012/07/23(月) 01:17:18.70
> クラス 直線 : 図形
横槍だがこの表現自体が気に入らん

クラス ウィンドウ : 図形
とか作るのか?

クラス ウィンドウ : 描画要素
クラス 直線 : 描画要素
でいいだろ。(実際にはPaintableみたいな名前)
図形は図形で境界管理とか位相管理とか別の継承ツリーになるはずだ。
0888デフォルトの名無しさん2012/07/23(月) 01:20:28.23
位相管理?
0889デフォルトの名無しさん2012/07/23(月) 01:24:06.47
>>886

struct line_mover : public visitor
{
 void visit(直線)
 {
  直線.開始点.x = 1;
 }
 void visit(円){} // visitorで何もしないデフォルトの実装を用意してもよし
 void visit(円弧){}
};

図形.accept(line_mover());

じゃ、だめなん?
0890デフォルトの名無しさん2012/07/23(月) 01:27:31.94
+=か、Moveみたいな移動関数にベクターを与えられたら移動するとか
行列に合わせて拡大するとか。尤も厳密な位相調整はレンダラーの方でやるだろうから
相対的な大きさや位置の調整しかやる事ないだろうけど。
0891デフォルトの名無しさん2012/07/23(月) 01:29:13.13
>>889
ダブルディスパッチ使ってるだけでさっきのと意味合いが全然変わってんじゃん
0892デフォルトの名無しさん2012/07/23(月) 01:32:52.47
>>889
そんな手間の掛る事するぐらいなら>>875でいいだろ
0893デフォルトの名無しさん2012/07/23(月) 01:53:43.91
そもそも問題が具体的じゃないから解決策が定まらない。
まず、何と何に出力したいの?それから何と何から入力したいの?
どういう加工をしたいの?そこをはっきりさせないと万能な解決策なんて無い。
だいたいOOをしたくてコードを書くんじゃなく、ある目的のソフトを書く上でOOを取り入れてるだけな筈だ。
0894デフォルトの名無しさん2012/07/23(月) 18:56:43.98
派生クラスに存在する全ての属性を、親クラスに持たせますか?
クラスAには属性aが存在するが、クラスBには不要な属性
0895デフォルトの名無しさん2012/07/23(月) 19:04:02.18
俺の経験上、そういうのってクラス化が丸ごと間違ってた、
という場合が多々ある。

サブクラスのことを知っている親クラスなんて腐ってるし、
サブクラスのことを配慮した親クラスも結局足をひっぱる。

言ってる意味が分からないならそのままつっぱしればいい。
半年後に気付く。
0896デフォルトの名無しさん2012/07/23(月) 19:24:37.02
Ruby ダックタイピング再考ですね
わかります
0897デフォルトの名無しさん2012/07/23(月) 21:04:58.50
Rubyは蛇足だろ
ダックタイプできない言語のほうがむしろ少数派なんだから
0898デフォルトの名無しさん2012/07/24(火) 02:09:24.52
>>885
なんでアウトかしらんが、全部分離しろ。
0899デフォルトの名無しさん2012/07/25(水) 19:39:31.86
>>898
点の集合体はベクターに出来んだろうが
0900デフォルトの名無しさん2012/07/26(木) 01:40:58.86
任意の方向のベクターに変換すれば。


描画に制限があるからって、データ側が描画側の都合にあわせてどうする。

点集合を描画に必要なデータに変換する機能を作ってそっちにまかせて抽象化しろ。
0901デフォルトの名無しさん2012/07/26(木) 06:19:35.38
非現実的。妄想ならブログに書いてろ。
0902uy2012/07/27(金) 02:29:56.69
まだクラスとか使ってるんだ
0903uy2012/08/03(金) 12:55:23.92
ゲームでOO不要だなってやればやるほど実感する

結局ゲーム内オブジェクトって「物」じゃねーもん
もっといえば「オブジェクト(種類付)」じゃないよ

ゲーム内で使うオブジェクトっていうのは、
種類、区別のないオブジェクトだよ

class Block  ← はい、この時点で設計間違ってます

class Node   ← 正解
class Obj   ← 正解


一は全で、全は一 の状態にさせないと、まともなゲームプログラムはかけない
確実にハードコーディングになる
0904デフォルトの名無しさん2012/08/03(金) 22:50:20.26
uyちゃんゲーム語っちゃってるけど何本売れたの?
0905デフォルトの名無しさん2012/08/04(土) 12:21:51.14
気持ち悪いから二度と話かけんな
0906デフォルトの名無しさん2012/08/05(日) 01:08:26.62
ファイル、テクスチャ、フォント


ゲームじゃ使わないのかもしれんが、これらはオブジェクトとして扱えたほうが良い。
0907uy2012/08/05(日) 06:58:45.91
そういう根拠のないゴミ発言いらない
ゲームで使わないものはない
使い方が違う
0908デフォルトの名無しさん2012/08/05(日) 11:51:52.89
だから何本売れたんだよ
0909uy2012/08/05(日) 19:55:37.38
コイツの中では
俺はいつの間にか商品としてのゲームを作っている話になっているらしい

そもそもカテゴリー的にはゲームでも、ゲームとか作ってる気はない
作っているのは世界
俺が何のために、わざわざプログラミングで最強スキルを手にして
ゲーム()ごときを作るには
勿体無いくらいの技術で開発しているかを分かっていない

ああ、そうだな・・・
やっぱお前らはオブジェクト指向でいいよwwww
0910デフォルトの名無しさん2012/08/05(日) 19:56:49.11
ドカタ
0911デフォルトの名無しさん2012/08/05(日) 21:04:46.30
OO必要だろ。

オレはゲーム開発の仕事で15年以上食ってるけど必要。
0912デフォルトの名無しさん2012/08/05(日) 21:58:05.40
ゲームどころかソフト1つ満足に作れない人間に付き合わなくてもいいのに
0913デフォルトの名無しさん2012/08/05(日) 23:27:41.05
OOが必要といわれると引っ掛かる。

部分的には便利というレベルで
必ず必要というものでもない。
0914デフォルトの名無しさん2012/08/06(月) 00:13:53.67
そいつぁ頭痛が痛いな。
0915uy2012/08/06(月) 08:14:07.99
ゲームでOO不要論はそこら中にある
ゲーム内で使うオブジェクトは本当は「物」ではないでFA

チーム開発で足並みそろえる為にOOでやってるとかそんなのは知らない
ただ本質的にはそうというだけ
0916デフォルトの名無しさん2012/08/06(月) 19:01:48.34
まだ完成してねぇんだろ
そろそろ自分の開発に戻れよw

480 : uy : 2012/05/07(月) 11:27:57.63
  いやいい
  俺はそろそろ自分の開発に入る
  最近やけに初心者相手にソース2chにあげまくったりしていたのは少しプログラム離れていたから
  感を取り戻す為にやっていた
0917uy2012/08/07(火) 08:08:31.64
もうプログラムの作業は8割終わってる

いまはプログラムから離れすぎて感覚を失わないようにム板を見ている
0918デフォルトの名無しさん2012/08/07(火) 10:32:14.23
      ノノノ     ` 、    
              \  俺が仕事も勉強も完成させないのは別にできないからじゃない。
ヾ,              ;;)  やりたくないわけでもない。もうプログラムの作業は8割終わってる。
ヾ,.;″            ;,;;)   いまはプログラムから離れすぎて感覚を失わないようにム板を見ている
                )   こんなことって、
  ー――-,,     ,,,,-'" i)    世間のがさつで無神経な奴らには絶対に理解できないだろうし、
  ____ ヾ   / ___ i′    してほしくもない。
  ヽ(;;;;)丿     '.(;;;)ノ i    人
             ̄  i  <  >   ─┼─
       (.,,. .,,.)     i    ∨     ─┼─
               ,i          │
     ,、____,    i              | | /
       .---‐    ,ノ              _/
ヽ ヽ、   _  _  _  ,ノ
0919uy2012/08/07(火) 14:34:53.08
うわキモ


ていうかここ数日、全力でruby情報漁りまくってるが
情報追うのマジで疲れた

こんな言語でも10年くらいの歴史はあるし、
そのログを漁っていくのは大変すぎ
でも古参()に舐められるのウザいから覚えていく
まだ実装側のソースコード解読にはほぼ着手してないし
いくら俺様が1回見た情報は1度で記憶できるとは言っても、流石に厳しいものがある

あ、ちゃんと2004年とか2008年ごろにruby-listを騒がしたカス共の情報もサルベージ出来てます
0920uy2012/08/07(火) 14:40:44.80
つうかrubyって、上辺だけ知って扱うのが一番いいかもな
かなりコアな部分になってくると、
そういうrubyの部分は積極的に使うべきではなく、
コアな部分に触れる事によって有益なものを作れたら
コードを綺麗にまとめてアップするとかでいい気がしてきた

実装がゴミカスっていうんじゃないけれど
誰も戦わない場所で戦ってる感じ
完璧に扱いたい!→でも一生に一度使うか使わないかの機能ばっかりだ→rubyなんてやめてやる!

結局こうやってrubyアンチが増えていくのかもしれない
完璧主義者ほどrubyは扱えない
0921デフォルトの名無しさん2012/08/07(火) 22:37:16.10
ようやく気が付いたか。モジュール化されたライブラリやDLL、クラスなんてのは中身を知らなくても
必要なことが出来るようになっていて、それを知ったり作ったりする手間を省くためのもの。

全部知る必要があるなら、CPUを作るためのシリコンの扱いから覚えろ。
0922uy2012/08/07(火) 23:33:04.65
いってんのはそこじゃなく
ライブラリではなくruby特有のノウハウについてだ
rubyは奥が深いにも関わらず深部を解説してるサイトが個人ブログくらいしかないからルビリストに俺は正直rubyのコードで勝てないと思ってる
結局rubyコミュニティ入るか実装ソース読まないと2、3歩遅れたruby情報しか拾えない
ruby情報ぐぐればぐぐるほど知らないことが未だにでてくる言語だよ
奥が深いってレベルじゃないバージョンアップしても何がどう変わったのかどこにも情報まとまってないからわかんねーしさ
ちょっと各クラスのメソッド一覧を表示して一個一個ぐぐって使い方を調べていく作業は飽きたよ?
完全記憶能力は比喩的な表現であってその能力を維持するためにはそれなりのエネルギーを消費する
0923デフォルトの名無しさん2012/08/07(火) 23:37:40.12
誰も必要としてないものの情報なんか数が少ないのは当然。

なくても困らないものは使わなくてもOK
0924デフォルトの名無しさん2012/08/08(水) 00:06:38.92
uy年収いくら?
0925デフォルトの名無しさん2012/08/08(水) 07:52:14.18
>>923
アスペか?
話通じなすぎて怖いわ

俺がいってんのはruby言語のマイナー構文やコア部分仕組みだよ
で、それを仕組み知っているルビリストと知らない一般ruby使いで
不思議rubyハックコードをかいた時に明らかに差がでる
アルゴリズム的な差というより
こんなクラスあったんだメソッドあったんだ構文あったんだみたいな知識的な差
そういう知識的な差を埋めるためにぐぐりまくってるけど
これからぐぐらなくちゃならない情報は4桁単位だよ?ルビリストはこれ全部覚えてるならマジでやばい
経験がそうさせるんだろうか
0926デフォルトの名無しさん2012/08/08(水) 10:05:40.52
オンラインゲームを作りたいのでMVCに分けた設計をしたいのですがいいサンプルはないでしょうか
0927デフォルトの名無しさん2012/08/08(水) 10:30:19.11
大雑把すぎるだろw
0928デフォルトの名無しさん2012/08/08(水) 15:06:12.58
age
0929uy2012/08/08(水) 19:36:14.12
rubyはよく出来た言語
感心するわ
でもenumrable周りってまだなんかおかしいよね
nextとnext_valuesってあるけど
あれは結局
1種類のnilしかないからああなってんだよね
1種類のnilしかない弊害はハッシュ引数においても発生する
処理内部に外部からはみえないnilとrubyユーザーがみることができて扱えるnilが必要だと俺様はおもう
キーワード引数でなんとかなるならいいんだけどな
いまの仕様だとバグの元になるだけだからハッシュ引数にnilやfalseはやたらと渡せない
0930デフォルトの名無しさん2012/08/08(水) 20:10:36.29
>>926
まずスタンドアロンでMVC試せよ
ネストしてるViewをどうやって操作するとか
考えにゃならんから最初から複雑なもん作ろうとしたら
後々大規模に直したくなって困るぞ
0931デフォルトの名無しさん2012/08/08(水) 20:13:50.79
あまりおっきいモノのたいしてMVC当てはめようとするといびつになるかもな。
描画とイベントをくっつけて原始的にGUIつくろうってときはMVCで十分だけど。
0932デフォルトの名無しさん2012/08/09(木) 08:32:17.14
言語はC#を考えていますが、Javaなどでも構いません。

数種類のエクセルシートを、数種類の帳票に変換して出力するというツールをどう組むか迷っています。
いずれのエクセルシートも、全ての種類の帳票に変換可能です。

仮にエクセルシートがA, B, Cと、帳票がD, E, Fとあるとしたら、

エクセルシート抽象クラス
エクセルシートクラスA
エクセルシートクラスB
エクセルシートクラスC
帳票クラス抽象クラス
帳票クラスD
帳票クラスE
帳票クラスF


という風にクラスをつくった後、
「.xlsファイルから値を読み取り、メンバ変数に格納していくメソッド」を抽象クラスに定義し、
エクセルシートクラスA, B, Cにオーバーライドして実装させる。

そして、帳票クラス抽象クラスに、
「エクセルシートクラスのインスタンスのメンバーを帳票クラスのインスタンスに代入していく」メソッドを定義し、
引数違い(エクセルシートクラスA, B, C)でオーバーロードさせておく。

そして、帳票クラスD, E, Fにその中身を実装させる。


という風なものを考えてみましたが、皆さんならどのように組まれますか?
0933デフォルトの名無しさん2012/08/09(木) 08:54:44.25
ハッシュを使う
0934デフォルトの名無しさん2012/08/09(木) 09:28:09.76
>>932
その考え方でいいと思うけど
0935デフォルトの名無しさん2012/08/09(木) 09:46:03.00
帳票って、Graphics2Dとか使って線引いたり文字列書いたりするのがメインでしょ?
クラス階層不要と思うけどな。シートのほうも良く分からん。

読み込んだシートを数集類に判別した後、
それごとにデータをただ単に読んで、
データのラインナップを共有してんなら、
DataModelクラスでも使ってそいつを、
シート→モデル→帳票としてパラメータに使う。
帳票のほうは独自性がどうせ高くなるだろうから、
先に言ったように、クラス階層は意識させない。

データをチョコっと計算させたり、
独自のフォーマットに従わせたいような場合は、
データモデルの方をいじる。

帳票はそっからデータをもらって、あとは単に頑張って描画。
描画が複雑になるようならヘルパ用クラスを作って、
必要に応じて、各帳票クラスはそれをコンポジションとして使う。
0936デフォルトの名無しさん2012/08/09(木) 09:48:29.50
>>935
Graphicsじゃなくて普通にテキストとして書き込むんじゃないの?
0937デフォルトの名無しさん2012/08/09(木) 09:50:12.34
普通PDFじゃないの
0938デフォルトの名無しさん2012/08/09(木) 10:03:22.38
>>935
GUIにはMVCアーキテクチャという発想があって、
今回のケースは対話(controler)がないからModel-Viewだけになる
で、>>935の話はModelとView(Graphics2Dなど)との関連を考察していて、
ModelとViewとの間にクラス継承関係は存在しないし、その内容も間違っていないと思う

ただし、>>932の相談はModel内部のクラス継承設計に関する事柄じゃないのかな?
で、それについては(>>934の言うように)>>932の考え方でいいと思う

両者は直交する視点からの考察であって、どちらも正しいし矛盾した議論ではない
0939デフォルトの名無しさん2012/08/09(木) 11:26:22.57
>>932
自分ならVB-Reportを勧める。
自作で作るよりは結局安上がりになると思うから。

まっ設計のレスだから自作の話でいいとおもうけど。

OOの設計なら
>エクセルシート抽象クラス
>エクセルシートクラスA
教科書的な設計でいいと思う。
自分もこんな感じの抽象ー具象クラスで作っていた。

でも、最近は具象クラスのみで作っている。
OOらしくないけど、やっぱり処理やIFは一箇所に固めた方が理解しやすい。

その後に改修が入った時点で、継承をして機能変更するスタイルにしている。
09409322012/08/09(木) 19:42:35.02
皆さんありがとうございました。
0941デフォルトの名無しさん2012/08/09(木) 20:59:58.27
俺ならこの3種類の群に分けるな
・Excelクラス群
・変換クラス群
・帳票クラス群

抽象化クラスがExcelに一個、帳票に一個じゃ
インターフェースとしての抽象化クラスが肥大しかねん。
帳票群のそれぞれに適した抽象化クラスを複数と
Excelクラス群の抽象化クラスを複数定義し、
変換クラスによってそれぞれの抽象化クラスを
つなぎ合わせる。
例えば、ある少数の帳票でしか使わないデータ書き込み手順があったとする。
その形式ためだけに、帳票の抽象化クラスにメンバーを追加したり
Excel側に対応求めるってのは極力避けたい。
予め変換クラス群の抽象化クラスを経由してやりとりするようにしていれば
最低限の変換処理を記述した変換クラスを追加するだけで
新しい形式に対応できるようになる。
0942デフォルトの名無しさん2012/08/09(木) 21:01:55.82
へぇー
頭のいい方は考えることが違うね
0943デフォルトの名無しさん2012/08/09(木) 21:23:58.09
韓国で建設会社の90%が倒産!不動産バブル崩壊で銀行、国民、企業みんなオワタ
http://engawa.2ch.net/test/read.cgi/poverty/1344466560/


住宅市場冷え込み悲鳴上げる建設会社

100大建設会社の4分の1は倒産、関連産業も続々とまひ

資産価値の下落が続く場合、生活苦に陥った「ハウスプア」が子どもの塾通いや外食、各種ショッピングの費用などを減らし、
深刻な内需不況の泥沼にはまり込むという懸念も出ている。
資金難に耐えられず、倒産する建設会社も続出している。大韓建設協会によると、施工能力評価額基準で上位100社に挙げられる
建設業者のうち、現在23社が企業改善作業(ワークアウト。経営再建)や企業回生手続き(法的管理。会社更生)を進めている。

建設協会のチェ・ユンホ専務は「このままでは、10大建設会社を除けば生き残る建設会社はほとんどないだろう」と語った。

2012/08/04
http://www.chosunonline.com/site/data/html_dir/2012/08/04/2012080400787.html


0944デフォルトの名無しさん2012/08/09(木) 23:51:08.43
rubyのどうでもいい詳細仕様を知るのとOOPに何の関係があるんだ
0945uy2012/08/10(金) 00:58:31.13
ooとか関係ないがしかしrubyの詳細仕様はどうでもよくない
rubyはあらゆるものをインタプリタ上から拡張できる詳細をどれだけ知っているかで拡張できる範囲が変わる
それによるとんでもないハック
知らない奴は知らない世界
0946デフォルトの名無しさん2012/08/10(金) 01:16:39.30
Rubyって誰が使ってるの?
0947デフォルトの名無しさん2012/08/10(金) 08:15:18.87
使わなくていいんじゃね
おまえ等が効率悪くてもあまり俺に関係ないし
0948デフォルトの名無しさん2012/08/10(金) 11:03:48.01
自分に関係ないものを排除出来るひとが仕事が出来るひと
0949デフォルトの名無しさん2012/08/10(金) 16:19:40.46
ゴミグラマ乙
0950デフォルトの名無しさん2012/08/10(金) 17:05:55.02
オブジェクト指向設計てどうやったらできるようになるんですかね
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のウィンドウのカスタマイズ性を考えると
後者の実装のような気がしなくもないけど、アクティブ非アクティブ関係なく全ウィンドウに常にメッセージ送信してるのってどうなんだろう
レス数が950を超えています。1000を超えると書き込みができなくなります。