[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2chのread.cgiへ]
Update time : 05/09 09:19 / Filesize : 227 KB / Number-of Response : 595
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

PHPでOOP



1 名前:1 ◆SWtzLesEmM mailto:age [2007/02/23(金) 13:35:52 ID:???]
PHPを使ってプログラミングするとき、
プロシージャ指向(手続き型、構造化プログラミング)でもできますが、
オブジェクト指向を使った場合の恩恵を享受するために、
PHPでオブジェクト指向プログラミングの勉強をしてみましょう。

<目的>
PHP5でオブジェクト指向プログラミングを行なうための知識を習得する。
(PHP4のOOPもOK、このスレが1000に行く前にPHP6が出たらPHP6のOOPもOK)

<方向性>
・このスレは、プログラミング初心者、PHP初心者の勉強の場として利用することを前提にします。
・PHPのOOPの話題に限定します。
(Ruby、Python、Javaなど他言語のOOPについては、その言語のスレッドでお願いします。)
・PHPのOOP学習に役立つ本、WEBサイトの紹介をお願いします。

<その他>
・略記は、「OO」=「オブジェクト指向」、「OOP」=「オブジェクト指向プログラミング」でお願いします。
・質問をする人はなるべくトリップを付けましょう。
・荒らし、煽り、叩き、気違いは無視・無干渉でお願いします。

このスレで、今日から貴方もOOP!!!\(^o^)/

327 名前:nobodyさん mailto:sage [2008/02/11(月) 10:50:14 ID:???]
◎「メンテナンスを行う場合」の比較

【構造化指向の場合】
ソースコードに書かれている関数とグローバル変数が、どういう階層で組まれているか
(どの関数でどの関数が使われているか。また、どのグローバル変数を使っているのか)
は、その関数の処理内容と、その関係などを把握してからでないと、手をつけられない。
新しくグローバル変数や、関数を追加する場合。また、ローカル変数を宣言する場合は、
その名前がソースコード内で使われているかを都度チェックしなければならないので、
面倒である。

【オブジェクト指向の場合】
ソースコードそのものがクラス単位で分けられているため、手をつける場所がすぐに
分かる。他のクラスに影響するのは、そのクラスとのインターフェースを変更した場合のみ。
新しくメンバやメソッドを追加する場合は、そのクラスの中で使われているメンバや
メソッドを確認するだけなので、対象となる範囲が狭く、チェックが楽。
また、プログラムそのものがクラスで部品化されるため、チームを組んで、分担作業で
プログラミングがやり易い。

【注意】
構造化プログラミングであっても、関数やグローバル変数の名前の付け方を工夫すれば、
もちろん対応は可能である。そのため、メンテナンスを想定する場合は、
オブジェクト指向でなければならないわけでもない。
オブジェクト指向は、構造化指向に比べて特別に「これが出来る」というものではなく、
構造化指向で不便に感じる部分の便利機能である。

328 名前:nobodyさん mailto:sage [2008/02/11(月) 10:57:47 ID:???]
>>324,325
なかなか参考になりました、ありがとう。
326さんのおっしゃる通り、"設計"は経験なんかも必要になってくるので、
考えるよりも手を動かして、簡単なスクリプトを組んでみるのが最良でしょうか。

329 名前:nobodyさん mailto:sage [2008/02/11(月) 12:43:38 ID:???]
>>326
・リファクタリング―プログラムの体質改善テクニック
マーチン ファウラー著

高いけどOOPに興味のある方には絶対お勧めですよ。
ポリモーフィズム適用の具体例がコードで解説されていますよ。

構造化プログラミングではGOTO構文を使うのはNGだけど
同様にOOPではswitch構文を使用しません。
ここの部分をポリモーフィズムで実装するのです。

あなたのプログラムにswitch構文がありますか?
その部分はポリモーフィズムで置き換えられますよ。

330 名前:nobodyさん mailto:sage [2008/02/11(月) 12:53:28 ID:???]
>同様にOOPではswitch構文を使用しません。
>ここの部分をポリモーフィズムで実装するのです。

これは言いすぎ。
OOの基本はモデリングであって、コーディングのスタイルじゃない。

331 名前:nobodyさん mailto:sage [2008/02/11(月) 13:07:00 ID:???]
>>329
情報ありがとうございます。
> 構造化プログラミングではGOTO構文を使うのはNGだけど
> 同様にOOPではswitch構文を使用しません。
> ここの部分をポリモーフィズムで実装するのです。

> あなたのプログラムにswitch構文がありますか?
> その部分はポリモーフィズムで置き換えられますよ。

この表現はすごく分かりやすかったです。
こういう感じの具体的なノウハウがあると分かりやすいですね。


>>330
「言いすぎ」というご指摘もごもっともだと思います。
しかし、OOPは、構造化指向に比べてダントツで良い所があるわけでも
ないので、(このため、すべてがOOPに移項してはいない。)
良いところを説明する際は、多少は強調した感じで言わざるを
得ないところがあると思っています。

332 名前:nobodyさん mailto:sage [2008/02/11(月) 13:39:48 ID:???]
>>330
そうですね、確かに言い過ぎました・・

GOTO構文は習いませんでしたが、switch構文は習得しちゃいました。
あえてそれを使用しないで組んでみるのも勉強になるのではないでしょうか?

構造化的スタイルとOOP的スタイルを手っ取り早く理解しようとするなら
それぐらいのパラダイムシフトが必要だと思うんです。

もちろんGOTO構文もswitch構文もコーディングには必要です。

333 名前:nobodyさん mailto:sage [2008/02/11(月) 15:01:11 ID:???]
switchがいらないということは、
if文もいらないな。

それともswitchを使わずに、
if文で書けばいいのかw

334 名前:◆lKs5QMUHoA mailto:sage [2008/02/11(月) 18:07:43 ID:???]
>>328
(なんか、自分語りみたいなレスになっているけれど、
OOPの勉強方法についての意見交換にもなるかと思ったので書いておきます。)

私は、プログラミングをこれから勉強しようという時、「無駄・ムラ・無理なく
勉強する」という予備校の受験勉強の風潮を受けていましたので、先生に
「プログラミングを勉強する場合は、どんな風なやり方をしたら良いですか?」
とか「どんな順番で勉強をしていったら良いですか?」と聞いたことがあるのですが、
その先生は、「そんなことを考えている時間があるなら、その分コーディングを
した方が良い」とアドバイスをしました。

実際に手を動かしてやってみると、文章や口頭の説明では言えない、何か体感的な
ものが習得でき、その後の勉強方針もどうやったら良いのかが見えてきました。
「ああ、あの言葉は、こういう意味なんだな」と思いました。
プログラミングは、実技の世界なのだから、実際に手を動かしてみて見えてくるものだと
思っています。

過去に表計算をするプログラムを構造化指向で組むと、処理を関数に分けていく方法が
身についたなと思いました。なので、今度は、構造化指向で苦労をするプログラミングを
してみると、OOPの良さが見えてくるのでは、と思っています。

335 名前:◆lKs5QMUHoA mailto:sage [2008/02/11(月) 18:16:42 ID:???]
BBSの構造化バージョンをうpしました。

ttp://www.geocities.jp/narutobakijp2/index.html
OOPの勉強として、簡易なBBSを作ってみました。
BBS Version2(2008.2.11)入力したデータで改行に対応してなかったので、その部分を修正。
BBS Version2の構造化Ver(2008.2.11)上記プログラムの構造化バージョンです。



336 名前:nobodyさん [2008/02/12(火) 04:15:37 ID:E8FcAvF5]
そもそも起動したら即終了するようなPHPプログラミングにOOを使う必要性が感じられない。


337 名前:nobodyさん mailto:sage [2008/02/12(火) 09:16:19 ID:???]
ここは必要性を語るスレじゃないですよ

338 名前:nobodyさん mailto:sage [2008/02/12(火) 10:36:27 ID:???]
>>336
なんで実行時間とOOの必要性に関連があるの?

>>337
それは了見が狭すぎでしょ。

339 名前:nobodyさん mailto:sage [2008/02/12(火) 11:35:52 ID:???]
>>336じゃないけど、オブジェクトは状態を保存しておくものだから。
複雑なデータを持つオブジェクトを作っても、mod_phpはリクエストの度にプロセス生成・終了するわけで、そのオブジェクトも消える。
そもそもウェブアプリはユーザからのリクエストを受けて処理が発生しする構造だから、オブジェクトを永続化しておくことにあまり意味はない。
オブジェクト指向に興味があるなら、GUIのあるアプリケーションとか、ゲームとかを作ってみるとよいよ。


340 名前:nobodyさん mailto:sage [2008/02/12(火) 12:57:39 ID:???]
永続化されていないオブジェクトには意味がほとんどないという主張ならば、どうだろうね。

Booch先生も、「永続性」に対して、「有用ではあるがオブジェクトモデルにとって
なくてはならない要素というわけではない」 って言ってるし。
(もう絶版だけど、Booch法第2版 2.2節より)


341 名前:nobodyさん mailto:sage [2008/02/12(火) 13:17:09 ID:???]
>>336だけどphpはプロセスを生成してから破棄するまでに処理を1度しか行わない関数?が多いし、
イベントが非同期で発生したりするわけでもないからOOを使うのはどうかなー?って気がする。
だいたいフローチャートで処理書けちゃうしね。

あとデータベースなりファイルなりからデータを読み込んでそれをオブジェクトの形に整形して・・・・
って処理が無駄な気がする。
実際に行う処理よりもその整形処理が長かったりするとなんか本末転倒なような。

342 名前:nobodyさん mailto:sage [2008/02/12(火) 13:23:42 ID:???]
>>341
>あとデータベースなりファイルなりからデータを読み込んでそれをオブジェクトの形に整形して・・・・
>って処理が無駄な気がする。

なるほど、それはそうだね。
いわゆるロジック的なものがほとんどない Webアプリってのは存在するし。(っていうか大半かも)

フレームワークでもなんでも、整理してるつもりで回りくどいだけってのは多い気がする。
話に付き合ってくれて、どうもありがと。

343 名前:nobodyさん mailto:sage [2008/02/12(火) 14:28:33 ID:???]
> いわゆるロジック的なものがほとんどない Webアプリってのは存在するし。(っていうか大半かも)
どう考えても少数だろw

ロジック無しで何が作れるというんだ?w

344 名前:nobodyさん mailto:sage [2008/02/12(火) 14:34:01 ID:???]
> そもそもウェブアプリはユーザからのリクエストを受けて処理が発生しする構造だから、オブジェクトを永続化しておくことにあまり意味はない。
その理屈だと、PHPに限らず、JavaでもRubyでもオブジェクト指向は要らないということになるな。
それにアプリでも終了すると消えるわけで、結局はウェブアプリと同じ。

そもそもデータベースやファイルにデータを保存するのも
オブジェクトの保存・永続化なわけだが?

> あとデータベースなりファイルなりからデータを読み込んでそれをオブジェクトの形に整形して・・・・
> って処理が無駄な気がする。
> 実際に行う処理よりもその整形処理が長かったりするとなんか本末転倒なような。
だからフレームワーク使うんじゃん。

345 名前:nobodyさん mailto:sage [2008/02/12(火) 14:42:23 ID:???]
>>343
単純に、SQLにパラメータ設定して、実行して、検索結果をエスケープしてHTML/XMLのタグつけて
返してるだけで出来てるWebアプリって多そうだけどな。ロジックというほどのもんでもないでしょ。

>>344
ムダなのは実装時間じゃなくて、CPU時間でしょ。
フレームワークで解決する問題じゃないと思うが。



346 名前:nobodyさん mailto:sage [2008/02/12(火) 14:50:23 ID:???]
>>345 訂正
「本末転倒」って言葉からすると、実装量なのかな。
取り消します。

347 名前:◆lKs5QMUHoA mailto:sage [2008/02/12(火) 18:36:45 ID:???]
>>341
> あとデータベースなりファイルなりからデータを読み込んでそれをオブジェクトの形に整形して・・・・
> って処理が無駄な気がする。
> 実際に行う処理よりもその整形処理が長かったりするとなんか本末転倒なような。
これはもともとOOPの特性じゃない?
再利用性や保守性を高めるために、他の処理とを完全に切り分ける代わりに、
構造化指向よりも、コード量が多く、動作が重くなるというのは。
これは、個人で組む小規模プログラムでは無駄でしかないが、チームで組んだり、
改変がある場合には威力を発揮する、という類のことでしょ。

348 名前:◆lKs5QMUHoA mailto:sage [2008/02/12(火) 18:50:13 ID:???]
確かに私もWebアプリの世界ではOOPの意味は少ないと思う。
指摘にあるように、フローチャートがかけるような処理しかしていないので、
主にPerlやPHPで構造化指向でコーディングするスタイルが流行っているのだと思う。
(PerlやPHPのOOP対応は未だに不十分なところがある)
また、ネットにあるサンプルアプリは構造化指向のものが非常に多い事からも、
構造化指向で十分に組めることを意味しているのだと感じる。

通常だと、「だったら、WebアプリをOOPで組む必要ないよね。」となるわけだが、
私がそれでもあえてOOPをやっているのは、その有用性などを自分で体感する形で
確認したいからだ。
大規模なアプリとなると、WebアプリでもOOPを活用して組むことが多いと聞くが、
それは具体的にどのような場面で、どのような有用性があるからなのか。それらを確認したい。

最近は、どうも(Webアプリの世界では)OOPの有用性を見るよりも、
各種フレームワークの有用性を確認した方が良いのでは、と感じている。

349 名前:nobodyさん mailto:sage [2008/02/12(火) 19:23:14 ID:???]
> 確かに私もWebアプリの世界ではOOPの意味は少ないと思う。
> 指摘にあるように、フローチャートがかけるような処理しかしていないので、

OOPの意味が少ないの理由がおかしい。
フローチャートがかけるような処理しか”貴方が”していないから
必要ないといっているだけであって、そうではないものはOOPの意味がある。

「Webアプリはフローチャートがかけるような処理」という前提がそもそもおかしい。

> 大規模なアプリとなると、WebアプリでもOOPを活用して組むことが多いと聞くが、
> それは具体的にどのような場面で、どのような有用性があるからなのか。それらを確認したい。

OOPの有効性、そのものがわかってないだけじゃないか?

> 最近は、どうも(Webアプリの世界では)OOPの有用性を見るよりも、
> 各種フレームワークの有用性を確認した方が良いのでは、と感じている。

各種フレームワークは、すべて(といって問題ないレベルで)OOPで
作られていることを知らないの?

350 名前:nobodyさん mailto:sage [2008/02/12(火) 19:40:22 ID:???]
>>349
別にOO的なモデリングをしなくても複雑さが増大しないのであれば、OOを選択するのは技術的な理由ではないでしょ。
前提がおかしいと主張するなら、どうおかしいのか言わないと、それこそ意味がない。

351 名前:nobodyさん mailto:sage [2008/02/12(火) 19:58:37 ID:???]
>>349
じゃあ貴方がOOPを教えてあげたら?

352 名前:nobodyさん mailto:sage [2008/02/12(火) 20:39:12 ID:???]
>>349
どういう利点があんの?

353 名前:nobodyさん mailto:sage [2008/02/12(火) 22:43:18 ID:???]
クラスを使ってるだけで、オブジェクト指向でも何でもないよ。ウェブフレームワークは。
オブジェクト指向を謳うなら、オブジェクトをシリアライズしてDBやセッションに保存するくらいはしないと。
そんなフレームワークがどれだけある?

354 名前:nobodyさん mailto:sage [2008/02/12(火) 22:58:38 ID:???]
なんで永続性に拘るんだろ。

355 名前:nobodyさん mailto:sage [2008/02/12(火) 23:01:04 ID:???]
なんでオブジェクトに拘るのかってこと。



356 名前:nobodyさん mailto:sage [2008/02/12(火) 23:08:25 ID:???]
ウェブアプリで扱うデータのほとんどはRDBMSだけど、RDBMS自体はフラットなデータ構造でまったくオブジェクト指向ではない。
だから、RDBMSからオブジェクトにいったん変換するんだけど、最終的にはHTMLというやはりフラットな構造に戻さないと行けない。
例えばgmailみたいに非常に複雑な処理が要求されるサイトなら、いったんオブジェクトにするのは有効と思うけど、gmailみたいなサイトは例外的。
ほとんどのウェブサイトは、ただDBに入った値を表示するだけでいい。

357 名前:nobodyさん mailto:sage [2008/02/12(火) 23:14:02 ID:???]
>>356 あっそ、じゃおまえがオブジェクト使わずに書けばいいだけじゃね?

358 名前:nobodyさん mailto:sage [2008/02/12(火) 23:19:02 ID:???]
OOプログラミングってのは、OO的にモデリングしたものをプログラミングすることであって、
オブジェクトを使ってプログラミングすることではないでしょ。

これを区別しないのは 「VC++で作ったからオブジェクト指向だ」って言うのと同じ。

359 名前:nobodyさん mailto:sage [2008/02/12(火) 23:28:46 ID:???]
>>358
概念じゃなく具体的なコードで説明して下さいお願いします。

360 名前:nobodyさん mailto:sage [2008/02/12(火) 23:37:53 ID:???]
そんなんムリ( ゚Д゚) 本でも読んで勉強して。

今まで読んだ本でOOに関して一番良かったのは Booch法:オブジェクト指向分析と設計 なんだけど、
いくら Booch法自体が古いとは言え、こうした本が絶版になってしまっているというのは、なんとも悲しい。

361 名前:nobodyさん mailto:sage [2008/02/12(火) 23:59:12 ID:???]
勉強したい人が集まってるんだから、必要・不必要で論争しなくても……。

362 名前:nobodyさん mailto:sage [2008/02/13(水) 00:22:08 ID:???]
>>336だけど話が広がり過ぎて正直びっくりしてる。
別にOOPしてもいいと思うよ。
俺もクラス使うし。
ただWebプログラミングだとクラス使っただけの手続き型プログラムになりがちだから
OOPの恩恵に与りにくいんじゃないかなーって思っただけ。

たとえば俺はいまPHPでゲーム組んでるんだけど
普通のゲームプログラムとかだと

$char_list[] = new Player();

for($i=0; $i<N; $i++)
{
 $char_list[] = new Enemy();
}

while($game_loop)
{
 foreach($char_list as $char)
 {
  $char->Move();
  $char->CheckHit();
  $char->Draw();
 }
}

exit(0);

みたいな感じになるけど

363 名前:nobodyさん mailto:sage [2008/02/13(水) 00:22:41 ID:???]

Webプログラミングだと

$buf = DataRead();

$player = new Player();

$player->SetData($buf);

$player->Move();
$player->CheckHit();
$player->Draw();

$buf = $player->GetData();

DataWrite($buf);

exit(0);

みたいなのになりがちじゃん。

364 名前:nobodyさん mailto:sage [2008/02/13(水) 00:23:37 ID:???]
それなら

DataRead();

PlayerMove();
PlayerCheckHit();
PlayerDraw();

DataWrite();

exit(0);

でもいいじゃん的な気がするってだけ。

まぁひとえに俺のプログラミング力不足だと思うけど。

365 名前:nobodyさん mailto:sage [2008/02/13(水) 00:42:03 ID:???]
また Booch法から引用すると 「ハンマーを手にする者には世界中の全てのものが釘に
見えるように、オブジェクト指向の考えに染まった開発者は世界中の全てのものがオブジェクトで
あると考え出す。この観点は少々無邪気すぎる。」だそうで、若干感情的な議論を呼びやすい
テーマではあると思う。

そういえば、同じ様なことが フラクタルとか 1/fゆらぎの本にも書いてあったな。
人間なんてそんなもんだ。



366 名前:nobodyさん mailto:sage [2008/02/13(水) 09:32:28 ID:???]
>>360
・構造化プログラミング三要素
STEP01 順次進行
STEP02 条件分岐
STEP03 繰り返し

・OOプログラミング三要素
STEP04 カプセル化
STEP05 継承
STEP06 ポリモーフィズム

WEBデザイナがPHP使ったところでSTEP01止まり、
MS OFFICEのマクロ/VBAもそんな感じだね。
ifやforを使わず延々と処理を記述してるのあるよね。

STEP04で思考を止めちゃ駄目なんだ。
勉強の為に「継承」「ポリモーフィズム」を使った
プログラムをあえて書いてみるんだ。

モデリング云々とかそんなの関係ないんだよ。
そもそもここは>>1でしょ?

367 名前:nobodyさん mailto:sage [2008/02/13(水) 11:21:35 ID:???]
>モデリング云々とかそんなの関係ないんだよ。

思考を止めてるのは誰だよ。

368 名前:nobodyさん mailto:sage [2008/02/13(水) 11:29:38 ID:???]
モデリング無しにOOPで書けるんですか?

369 名前:nobodyさん mailto:sage [2008/02/13(水) 11:42:59 ID:???]
>>367>>368
じゃあモデリング房が設計について判りやすく教えたら?

OOPの概念すら理解出来ない初心者に上流から教えるんですか?
ぐだぐだ言ってないで初心者に判りやすく為になる発言したらどう?

370 名前:nobodyさん mailto:sage [2008/02/13(水) 11:50:58 ID:???]
モデリングが重要かもしれないっていう情報を教えてもらったんだから、それで満足しろよ。
あとは自分で本でも読め。

371 名前:nobodyさん mailto:sage [2008/02/13(水) 11:52:02 ID:???]
この基地外まだいるのか

372 名前:nobodyさん mailto:sage [2008/02/13(水) 12:09:17 ID:???]
>>370
あれれ?モデリングを判りやすく教えてくれるんじゃないんだ?
さては本当は自分も理解して(ry

373 名前:nobodyさん mailto:sage [2008/02/13(水) 12:27:30 ID:???]
OOP有用性の議論にDBの実装の話がこびり付いている。
純粋な議論ではないと思う。

374 名前:nobodyさん mailto:sage [2008/02/13(水) 13:28:08 ID:???]
熱意ある奴がケーススタディとして『やってみて』いるんだからさ
酸いも甘いも知ってる方はOOPで作るべきっていう良いお題を
出してあげたら盛り上がるんじゃないか

375 名前:nobodyさん mailto:sage [2008/02/13(水) 15:14:37 ID:???]
PHPでOOPの議論すること自体おかしい
オブジェクト指向が有用だからこそ
java,c++.c#,ruby最近の言語は全てOOPになってる
大規模なものをつくるのにOOPじゃないと非効率すぎる



376 名前:nobodyさん mailto:sage [2008/02/13(水) 15:17:14 ID:???]
簡単にいうと
規模が小さいほどOOPの必要性が無くなり
規模が大きいほどOOPの必要性がでる

377 名前:nobodyさん mailto:sage [2008/02/13(水) 15:18:55 ID:???]
規模が小さいならスパゲッティコードが最強てこと
大きいならOOPじゃないとはなしにならない

378 名前:nobodyさん mailto:sage [2008/02/13(水) 15:21:38 ID:???]
OOを議論するのにPHPをベースにするのはどうかと思うが、PHPにおけるOOを議論することは良いんじゃないの。
あと、規模というよりは複雑さだろうな。

379 名前:nobodyさん mailto:sage [2008/02/13(水) 15:35:17 ID:???]
OOPの話は荒れる元だな・・・よし、



〜〜〜〜〜〜〜〜〜ここからOOPネタ禁止〜〜〜〜〜〜〜〜〜〜〜〜〜〜

380 名前:nobodyさん mailto:sage [2008/02/13(水) 16:30:31 ID:???]
(OO)P

マスコット(笑)

名前はオッピー君。
育ち盛りのオスです。
パスタは嫌いだよ!

最近、俺俺オブジェクト指向にはまって
同僚達から嫌われる羽目にw

そんな落ち目のオッピー君と一緒にオブジェクト指向の真髄を極めよう!

381 名前:(OO)P 名前はオッピー君。 mailto:sage [2008/02/13(水) 16:32:38 ID:???]
おいらに力を・・・・

382 名前:nobodyさん mailto:sage [2008/02/13(水) 20:00:42 ID:???]
どうして荒らしが粘着し始めたのだろう。

383 名前:nobodyさん [2008/02/13(水) 23:26:03 ID:yj0olWG5]
思い切って質問してみる。

テーブルAの操作をするクラスA、テーブルBの操作をするクラスBを作った。
両方のクラスで個別に接続するより、1番最初に接続して、その接続IDを使って処理させたほうがいいのかな?

384 名前:◆lKs5QMUHoA mailto:sage [2008/02/13(水) 23:56:35 ID:???]
>>383
取得するテーブルの数ごとに別々に接続はしない方がいいよ。
DBの処理負荷が大きくなるから。

私だったら、テーブルごとにクラスを分けたりはしないかな。
テーブルの構成そのものを隠蔽するために。
検索と更新は同じフォーム上では行わない前提にして、こんな感じにするかな。

// 接続に関するクラス
// PostgreSQLに接続する為のメンバとメソッドを持つ。
class CDB_PostgreSQL

// MySQLに接続するためのメンバとメソッドを持つ。
class CDB_MySQL

// 個人情報の検索をするクラス。
// 以下の検索メソッドを持つ
// ・電話番号を指定し、候補の個人情報一覧を得る。
// ・苗字を指定し、候補の個人情報一覧を得る。
// このクラスのメンバに上記2つのどちらかのDBクラスを持たせる。
class CSearch_Personal

// 個人情報の更新をするクラス。
// 以下の更新メソッドを持つ
// ・主キーを指定し、個人情報を更新する。
// ・新しい主キーを設定し、個人情報を新規追加する。
// このクラスのメンバに上記2つのどちらかのDBクラスを持たせる。
class CUpdate_Personal

385 名前:383 [2008/02/14(木) 00:16:52 ID:nkc61sHT]
コードまで丁寧にありがとう。

クラス設計は、慣れがないと難しいね……。

> このクラスのメンバに上記2つのどちらかのDBクラスを持たせる。
申し訳ないんだけど、「メンバにクラスを持たせる」の意味が理解できない。
少し補足してもらえるとありがたいんだけど、ダメかな?



386 名前:nobodyさん mailto:sage [2008/02/14(木) 03:29:07 ID:???]
規模と言うか、どれだけ複雑なロジックがあるかだよね。2ちゃんねるは物凄く規模が大きいけど、ロジックはごく単純。ただの掲示板だもん。

387 名前:nobodyさん mailto:sage [2008/02/14(木) 03:30:36 ID:???]
テーブルAを操作するモデルクラスAとは行かない場合もあるよ。リレーションがある場合。

388 名前:nobodyさん mailto:sage [2008/02/14(木) 05:53:07 ID:???]
テーブルクラスはDBクラスと分けて
テーブルの中からgetConnection()するのが普通だよ
コネクション管理とテーブルを切り離す

389 名前:◆lKs5QMUHoA mailto:sage [2008/02/14(木) 08:04:05 ID:???]
>>385
設計の仕方は、その人が作ろうとするアプリ次第なので、その人が
やりやすいスタイルでやっていいと思うよ。
OOPの設計理論は、あくまで一般論なので、必要性を感じないのであれば、
必ずしも守らなくていいだろう。
私は、DBをPostgreSQLからMySQLへ変換する必要性も生じることを
想定した設計をしただけだよ。
こうやっておけば、書き換えるコードも少なくて済む。

class CSearch_Personal{
// DBを格納する
var $m_db;

// コンストラクタ
function CSearch_Personal(){
$db_info = ""; // ここでDB接続に必要な情報を入れる。
$this->m_db = new CDB_PostgreSQL($db_info);
}

// 電話番号で検索
function Search_by_TEL($tel){
$sql_str = "SELECT * FROM TableA WHERE TEL = '" . $tel . "'";
$this->m_db->Execute($sql_str);
// ここで、データをうけとり、返す。
}
}

390 名前:◆lKs5QMUHoA mailto:sage [2008/02/14(木) 08:07:28 ID:???]
どうしてもテーブル単位でクラスを作る場合は、こんな感じになるのかな。

// PostgreSQLへ接続処理などを管理する基底クラス(抽象)
class CDB_PostgreSQL_Connection

// TableAの操作を管理するクラス。
class CDB_TableA extend CDB_PostgreSQL_Connection

// TableBの操作を管理するクラス。
class CDB_TableB extend CDB_PostgreSQL_Connection

391 名前:◆lKs5QMUHoA mailto:sage [2008/02/14(木) 08:26:42 ID:???]
OOPの設計をする場合は、処理を文章で書き表して、
その中から名詞や役割を抽出していけばいいと聞いたことがある。
その単位を1つのオブジェクトとして設計する。
1つのオブジェクトを、1つのクラスとしてコーディングする。

392 名前:nobodyさん mailto:sage [2008/02/14(木) 08:57:14 ID:???]
>>390
CDB_PostgreSQL_Connectionを拡張してCDB_TableAにするのはまずい
子クラスと親クラスはis_a関係にしないといけない
言い換えると子クラスは親クラスの範疇に含まれていないといけない
テーブルがコネクションの一部でないことは明らか

393 名前:nobodyさん mailto:sage [2008/02/14(木) 10:58:27 ID:???]
異論はあるだろうけど、SQLに関しては、パフォーマンスの都合上実装の仕方が限定されるから、
モデルに合わせて考えるのではなくて、SQLを考えてから、それに会うモデル(クラス構造)を考えた
方が良いと思う。

394 名前:nobodyさん mailto:sage [2008/02/14(木) 11:05:10 ID:???]
>>393
kwsk

395 名前:nobodyさん mailto:sage [2008/02/14(木) 11:09:12 ID:???]
具体的に聞かれないと、答えようがない。



396 名前:nobodyさん mailto:sage [2008/02/14(木) 11:30:06 ID:???]
>>393
テーブル構造が複雑な場合、そういうのもアリだと思うけど
それはオブジェクト指向じゃないよね

397 名前:nobodyさん mailto:sage [2008/02/14(木) 12:00:13 ID:???]
微妙だけど、抽象化のレベルが低い(計算機寄りな)だけで、OOではあると思ってる。

ただDBアクセスについて、パフォーマンスを保ったまま、高い抽象化ができない・やりにくい
というのは、OOが本質的にDB向きではないということだと考えてる。

398 名前:nobodyさん mailto:sage [2008/02/14(木) 12:33:45 ID:???]
とりあえずDBアクセスはPDOでいい。
各操作系に保持させるならプリペアドステートメントを。

個人的には各テーブルってよりも各テーブルのレコードクラスを作るかなー。
テーブルに対する操作は静的メソッドで実装する。

どうでもいいがクラスってのは抽象データ型なので関数と比べるなんてしてるとハマる。

399 名前:nobodyさん mailto:sage [2008/02/14(木) 12:59:49 ID:???]
UMLモデリングツールでPHP書いている人いる?
具体的には「Umbrello」を業務で使っている人

400 名前:nobodyさん mailto:sage [2008/02/14(木) 13:18:17 ID:???]
C#の記事だけど、継承に関するものをみつけた。
Column - 継承を使うべき場合、使うべきではない場合 -
www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_004/cs2_004_03.html#cs0406

401 名前:nobodyさん mailto:sage [2008/02/14(木) 14:54:28 ID:???]
>>397
> というのは、OOが本質的にDB向きではないということだと考えてる。
逆逆、リレーショナルデータベースが、OO向きじゃない。

402 名前:nobodyさん mailto:sage [2008/02/14(木) 15:00:26 ID:???]
>>398
> 各操作系に保持させるならプリペアドステートメントを。
プリペアドステートメントは条件の数を変えにくいという
大きな欠点があるからなぁ。

> 個人的には各テーブルってよりも各テーブルのレコードクラスを作るかなー。
一般に言われている、ActiveRecordパターンですね。
Ruby on RailsやCakePHPで採用されている奴です。


403 名前:nobodyさん mailto:sage [2008/02/14(木) 15:08:57 ID:???]
>>383
> テーブルAの操作をするクラスA、テーブルBの操作をするクラスBを作った。
> 両方のクラスで個別に接続するより、1番最初に接続して、その接続IDを使って処理させたほうがいいのかな?

処理の負荷というより、決定的な問題がある。

それは主にトランザクションを使ったときに起こる。

複数のテーブルを操作することで、一つの処理を完成させる場合
中途半端な状態を他に見せないようにしなければいけないし、
また一つのテーブルで処理が失敗した場合すべてを元に戻さなければならない。

これを実現する為に同じ接続から見える状態と、違う接続からみえる状態で
違うことがある。

404 名前:nobodyさん mailto:sage [2008/02/14(木) 15:18:21 ID:???]
PHPやWebアプリに限らないけど、OOPってのはフレームワークを作るためにある。
ここで言うフレームワークには、汎用の名前があるフレームワークだけじゃなく
たとえばあるゲームの独自の基本システムなんていったものも含む。

このフレームワークを使って作るもの・・・すなわち、
フレームワークから呼び出されるコードは、単純な処理になるので
(というか単純な処理ですむ為のフレームワーク)
OOPにならないことが多い。

だからといって、システム全体がOOPになっていないとは思わないけどね。
システム全体の一部。つまりクラスの中のメソッドだけを見て
非OOPというのはおかしいでしょ?

405 名前:nobodyさん mailto:sage [2008/02/14(木) 15:30:26 ID:???]
>>404
誰に言ってるの??



406 名前:nobodyさん mailto:sage [2008/02/14(木) 15:35:44 ID:???]
誰に言ってるのかも気になるが、そんなこと誰が言ってるのかも気になる。
OOPがフレームワークのためにあるという主張は初めて聞いた。

407 名前:nobodyさん mailto:sage [2008/02/14(木) 15:36:31 ID:???]
>>384>>389>>390 も気持ち悪すぎだ
普通に考えるとこういう感じだろう?

// 接続に関する抽象クラス。汎用で使える関数があれば定義しても良い。
class CDB_Connection {}

// PostgreSQL接続用クラスの実装
class CDB_PostgreSQL extends CDB_Connection {}

// MySQL接続用クラスの実装
class CDB_MySQL extends CDB_Connection {}

// テーブルに関する抽象クラス。汎用で使える関数があれば定義しても良い。
class CTable {}

// 個人情報クラス。
class CPersonal extends CTable{
 function CSearch($connection) {} //コンストラクタかメソッドでコネクションと接続
 function search() {}
 function update() {}
}

408 名前:nobodyさん mailto:sage [2008/02/14(木) 15:41:23 ID:???]
>>407
概ね同じ意見だけど、Cpersonalを実体化する必要ってあんまりなさそうだから、
自分はメソッドを staticにすることが多い。

あと、connection をオブジェクト内部にもってしまうと、そのオブジェクトはいつでも
SQLを実行できてしまうので、引数で渡すようにしてる。
(まぁ、staticにしたら引数で渡すしかないけど)

409 名前:nobodyさん mailto:sage [2008/02/14(木) 15:45:33 ID:???]
>>408 に補足
必要性がないというより、CTable (のサブクラス)のインスタンスをnewするということは、
意味論的には、そのテーブル自体を新規に生成するということだから、ちょっと気持ち悪い。

410 名前:nobodyさん mailto:sage [2008/02/14(木) 15:48:44 ID:???]
>>389
> 私は、DBをPostgreSQLからMySQLへ変換する必要性も生じることを
> 想定した設計をしただけだよ。
> こうやっておけば、書き換えるコードも少なくて済む。

とか言っておきながら、

> // コンストラクタ
> function CSearch_Personal(){
> $db_info = ""; // ここでDB接続に必要な情報を入れる。
> $this->m_db = new CDB_PostgreSQL($db_info);
> }

CSearch_Personalのコンストラクタで
CDB_PostgreSQL決め打ちなのはナンセンス。


DBをPostgreSQLからMySQLへ変換する必要性も生じることを想定した設計というのなら
設計としては、Personalデータを扱う(Search専用?)クラスは
接続するデータベースに依存すべきではない。
(限られた環境だけで動くものを作ればいいだけならどうでもいいが)

接続オブジェクト(CDB_PostgreSQL)はCSearch_Personalクラス外部から
与える。そのときの引数は(PHPに厳密な型は無いが)抽象クラスのCDB_Connection型で与える。
こうすることで、DBをPostgreSQLからMySQLへ変換する必要が生じたとき、
CSearch_Personalを一切修正しないですむ。

411 名前:nobodyさん mailto:sage [2008/02/14(木) 15:49:17 ID:???]
>>404は、「バージョン6までのVBって構文は構造化だけど、
内部的にはクラスが動いているんだよ」といってるのと
同じ意味のように思える。
誰に何を伝えたいのかは良く分からないが。

412 名前:nobodyさん mailto:sage [2008/02/14(木) 15:51:40 ID:???]
>>408-409

まあ、そこは設計しだいでいくつかやり方があるけど、
ActiveRecordパターンの場合、インスタンスはテーブルを作るという意味ではなく、
クラスがテーブル全体で、そのインスタンスはテーブルのレコードという扱いになる。
そしてフィールドがプロパティ。



413 名前:nobodyさん mailto:sage [2008/02/14(木) 15:53:27 ID:???]
>>411
一応突っ込み。VBにはクラスがある。(少なくとも5以上)
もちろんnewでインスタンスも生成できる。

414 名前:nobodyさん mailto:sage [2008/02/14(木) 16:01:23 ID:???]
>>412
これですかね。
www.martinfowler.com/eaaCatalog/activeRecord.html

細かいけど、
>そのインスタンスはテーブルのレコードという扱いになる。
なら、searchメソッドは、staticなり外部に置くのではないかと思う。
確かに updateはこの場合 staticにすべきものではないですね。失礼。


415 名前:412 mailto:sage [2008/02/14(木) 16:03:01 ID:???]
>>408
> あと、connection をオブジェクト内部にもってしまうと、そのオブジェクトはいつでも
> SQLを実行できてしまうので、引数で渡すようにしてる。
なんで「そのオブジェクトはいつでも SQLを実行できてしまう」のが悪いのかわからないけど、

> (まぁ、staticにしたら引数で渡すしかないけど)
これが理由なら、そのクラスをシングルトンパターンで
実装するという方法もある。

CPersonal::search() などという書き方で呼べるぞ。

ただし、PHP4に対応した書き方だとすごく気持ち悪いんだが(笑)
CakePHPでgetInstance()というメソッドをキーワードにして探せば
実装例が見つかると思う。

getInstance()関数内のstatic変数に配列[0]にで確保(なぜ?)した後
各メソッドの初めで$_this = getInstance() して$_thisで参照するという・・・
まあ見たほうが早い(?)



416 名前:nobodyさん mailto:sage [2008/02/14(木) 16:13:08 ID:???]
>>415
>なんで「そのオブジェクトはいつでも SQLを実行できてしまう」のが悪いのかわからないけど、

DBなんて巨大なグローバル変数の固まりみたいなものだし、アクセスもメモリと比べて遅いし、
トランザクションの都合からもある範囲でDBアクセスしている可能性がないかが
簡単に見分けられないのは怖いと思うけど。


417 名前:412 mailto:sage [2008/02/14(木) 16:13:24 ID:???]
>>414
> なら、searchメソッドは、staticなり外部に置くのではないかと思う。
あー。staticでいいです。単に個人的な環境の理由から
PHP4を使っていて忘れていただけです。

418 名前:412 mailto:sage [2008/02/14(木) 16:17:15 ID:???]
>>416
でもどっちみちデータベースに操作を出来るところなら、
コネクション知っているわけで、結局同じことでしょ?

それにクラスの変数はグローバル変数じゃないからw

419 名前:nobodyさん mailto:sage [2008/02/14(木) 16:33:55 ID:???]
>>418
必要なメソッドにしか connection を渡さず、オブジェクト内に保存しないことで、
「データベースに操作できるところ」を限定するという話。

connection をDBアクセスする権限と見るならば、その権限は処理に対して与えるべきで、
オブジェクトに対して与えるべきではないだろうということ。


420 名前:nobodyさん mailto:sage [2008/02/14(木) 17:56:06 ID:???]
DB周りはZendFrameworkの実装でなんら不満ないなあ。



421 名前:412 mailto:sage [2008/02/14(木) 18:14:31 ID:???]
>>419
しかし、テーブルに関するクラスでデータベースを操作しないメソッドって
あまりないからなぁ。まあ別にいいけどね。

422 名前:nobodyさん mailto:sage [2008/02/14(木) 18:51:49 ID:???]
>>421
例えば Personテーブルに depart_codeがあるとして、$person->getDepartName() としたときに、
暗黙のうちにdepart_codeをキーとしてDepartテーブルから検索する SQLが実行されたら嫌だし、
setPersonNameされたときに、そのタイミングでupdateが実行されていないか疑わなきゃいけないのも嫌。


423 名前:nobodyさん mailto:sage [2008/02/14(木) 19:13:43 ID:???]
>>422
メソッドの実装がどうなってようが呼んだ方の知ったこっちゃないだろ。
そのどっちの例もそのクラスの仕様なんだから。
それを外側から知ろうとか制御しようだなんておかしな話だ。


424 名前:nobodyさん mailto:sage [2008/02/14(木) 19:41:54 ID:???]
そもそもstaticも存在しないPHP4で機能をまとめたようなクラス(CDB_PostgreSQLクラスみたいなの)
を作ろうとしてるのが気持ち悪い。

しかもOOPなんてデータベースの各要素に関数をくっつけたようなもんなんだから既存のデータを単体でしか扱わない
データベースと相性が悪いのは分かりきったことだろう。

425 名前:nobodyさん mailto:sage [2008/02/14(木) 19:54:36 ID:???]
OOPはデータベースの各要素に関数をくっつけたようなもの?
既存のデータベースはデータを単体でしか扱わない?
だからOOPとデータベースと相性が悪い?

( ゚Д゚) ワカラナイ



426 名前:412 mailto:sage [2008/02/14(木) 20:04:12 ID:???]
>>424
staticはあくまでstaticだよと明示しているだけで
本質的には必要なものとは思えないけど。便利だけどね。

それと、CDB_PostgreSQLは「機能をまとめたクラス」ではないよ。
たとえば一つのアプリでサーバー負荷分散などで、
複数の接続を使用するときとか、複数のインスタンスが出来る。

427 名前:nobodyさん mailto:sage [2008/02/15(金) 07:09:54 ID:???]
PHPでもメンバポインタとかつかえれば
インスタンスに縛られない柔軟なOOPができるのにな






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<227KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef