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^)/
PHPでOOP
11 ◆SWtzLesEmM
2007/02/23(金) 13:35:52ID:???552nobodyさん
2008/02/25(月) 13:58:28ID:??? 記念パピコ
553nobodyさん
2008/02/25(月) 14:52:48ID:??? コマツも軍需だよね
554nobodyさん
2008/02/25(月) 17:26:59ID:??? さ あ 、 も り あ が っ
て
ま
い
り
ま
し
た
て
ま
い
り
ま
し
た
555nobodyさん
2008/02/26(火) 10:28:32ID:??? 1が書き込みしないと
恐ろしいほどさびれてんねw
1だけがPHPでOOPに興味があって
その興味を無理矢理に広めようとしてる
このスレの落胆ぶり見ればよくわかるwww
恐ろしいほどさびれてんねw
1だけがPHPでOOPに興味があって
その興味を無理矢理に広めようとしてる
このスレの落胆ぶり見ればよくわかるwww
556nobodyさん
2008/02/26(火) 12:06:28ID:??? PHPにかぎらず、「オブジェクト指向」が一般化したと言っても、実際にはライブラリ(フレームワークを含む)が
クラス化されて、プログラマはそれを使ってるという程度の話でしかないから、OOPそのものの話が盛り
上がらないのは、当然といえば当然。
クラス化されて、プログラマはそれを使ってるという程度の話でしかないから、OOPそのものの話が盛り
上がらないのは、当然といえば当然。
557nobodyさん
2008/02/26(火) 14:01:10ID:??? WebProgで勢いあるのなんてくだすれぐらいだろ
558nobodyさん
2008/02/27(水) 22:15:02ID:??? 何度も1のこと前向きにとらえようとしたけど
やはり1が何をしたいのかよくわからん
やはり1が何をしたいのかよくわからん
559nobodyさん
2008/02/28(木) 00:08:29ID:??? OOPの勉強じゃないの?
560nobodyさん
2008/03/01(土) 01:04:42ID:??? 自称非営利団体の運営を本業に転換する難しさのバーチャル体験学習。
乗せられたボランティアからの不満が噴出。
ありがち。そして解散。ありがち。
乗せられたボランティアからの不満が噴出。
ありがち。そして解散。ありがち。
561nobodyさん
2008/03/02(日) 15:48:10ID:??? 私も1が必死にスレ継続させてる意味が???
営利団体なら意味はわかりますが
営利団体なら意味はわかりますが
562nobodyさん
2008/03/02(日) 16:50:51ID:??? このスレ1年以上在るのに、 1 ◆SWtzLesEmM が書き込んだことがある日数って 16日だよ。
必死どころか、やる気があるのかと言いたい。
2007
02/23 02/24 02/27 02/28 05/12
06/12 07/06 07/11 07/26
2008
01/29 02/02 02/06 02/10 02/17
02/24 02/25
必死どころか、やる気があるのかと言いたい。
2007
02/23 02/24 02/27 02/28 05/12
06/12 07/06 07/11 07/26
2008
01/29 02/02 02/06 02/10 02/17
02/24 02/25
563nobodyさん
2008/03/02(日) 20:21:37ID:??? 暇人乙
564nobodyさん
2008/03/02(日) 23:43:21ID:??? まー、ここで勉強するな、とは言わないけど、本気でやろうと思ってる人は、まず自分で本買うなりして勉強すると思うよ。
別に興味ないやつはスルーでも何でもしときゃいいと思う。
別に興味ないやつはスルーでも何でもしときゃいいと思う。
566nobodyさん
2008/03/10(月) 14:48:07ID:??? 自演度は THE END
567nobodyさん
2008/03/17(月) 07:13:22ID:??? 保守
569nobodyさん
2008/04/20(日) 09:34:37ID:??? 保守
570nobodyさん
2008/05/24(土) 06:41:54ID:??? 保守
571nobodyさん
2008/06/16(月) 13:47:07ID:??? 難解も、難解も、オブジェクト指向
572nobodyさん
2008/06/17(火) 12:52:46ID:??? スレタイの主旨からずれるけど、
やはりC言語は、一度は学んでいた方が良いな。
Javaからプログラムに入ったから、PHPのOOPでアロー演算子使うのにとても違和感あったのだけど、
Cの構造体を知って、ドットシンタックスよりアロー演算子の方が正統派と思えるようになった。
やはりC言語は、一度は学んでいた方が良いな。
Javaからプログラムに入ったから、PHPのOOPでアロー演算子使うのにとても違和感あったのだけど、
Cの構造体を知って、ドットシンタックスよりアロー演算子の方が正統派と思えるようになった。
573nobodyさん
2008/06/17(火) 13:01:04ID:??? どっと疲れる
574nobodyさん
2008/06/17(火) 16:56:31ID:??? どっと込む
576nobodyさん
2008/07/27(日) 23:15:55ID:??? 諸事情により、Web系のプログラミングから離れていたけれど、
また時間がとれたら舞い戻ってきます。よろしくw
また時間がとれたら舞い戻ってきます。よろしくw
577nobodyさん
2008/08/09(土) 20:52:22ID:??? PHPに触る機会が・・・なんで、VBばっかりなんだ・・・
578nobodyさん
2008/08/19(火) 00:44:43ID:??? 保守
579nobodyさん
2008/08/28(木) 21:10:25ID:??? 保守
5801 ◆SWtzLesEmM
2008/09/02(火) 15:51:27ID:w90kCMMO クラスの作り方(設計)について、考え方が参考になる本がありました。
http://www.amazon.co.jp/dp/4798110558/
モデルとプロセスをめぐる冒険
「モデリング」ということについて調べてみると、いろいろノウハウがあるようです。
http://www.amazon.co.jp/dp/4798110558/
モデルとプロセスをめぐる冒険
「モデリング」ということについて調べてみると、いろいろノウハウがあるようです。
581nobodyさん
2008/09/27(土) 22:23:48ID:??? 保守
582nobodyさん
2008/10/06(月) 00:30:42ID:??? 保守
583nobodyさん
2008/10/24(金) 23:26:54ID:??? 保守
584yodobashi
2008/10/26(日) 01:15:24ID:??? 大手ECサイトのヨドバシドットコムが、サイトリニューアルから大規模な障害を3日間...
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail.php?qid=1220150877
506 :目のつけ所が名無しさん:2008/10/26(日) 00:47:20
大手ECサイトで、ここまで派手なリリース失敗は初めて見た。
エンジニア向けIT情報誌や関連サイトは、ぜひ取材して原因を明かして欲し
いは。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail.php?qid=1220150877
506 :目のつけ所が名無しさん:2008/10/26(日) 00:47:20
大手ECサイトで、ここまで派手なリリース失敗は初めて見た。
エンジニア向けIT情報誌や関連サイトは、ぜひ取材して原因を明かして欲し
いは。
585nobodyさん
2008/11/05(水) 20:43:48ID:??? 保守
586nobodyさん
2008/11/13(木) 23:12:08ID:??? 保守
587nobodyさん
2008/11/15(土) 09:19:30ID:??? 定期的に保守してるの誰?
糞スレに対してその執念が怖いんだが。。。
糞スレに対してその執念が怖いんだが。。。
588nobodyさん
2008/11/23(日) 22:46:31ID:??? お前の粘着質の方が怖い
589nobodyさん
2008/11/29(土) 11:22:40ID:??? PHP でオブジェクト指向の設計をするための 7 つの良い習慣を身につける
http://www.ibm.com/developerworks/jp/opensource/library/os-php-7oohabits/
PHP での適切な OO の習慣を身につけることによって、より安定していて、保守が容易で、拡張も容易にできるアプリケーションを作成することができます。そのためには、次のことを忘れないでください。
* 控え目である
* 良き隣人である
* メドゥーサを見ないようにする
* 結びつきを極力弱くする
* 結束性を高める
* 家族の一員として扱う
* パターンで考える
こうした習慣を身につけ、使いこなせるようになると、皆さんはきっとアプリケーションの品質が変わったことに驚くはずです。
http://www.ibm.com/developerworks/jp/opensource/library/os-php-7oohabits/
PHP での適切な OO の習慣を身につけることによって、より安定していて、保守が容易で、拡張も容易にできるアプリケーションを作成することができます。そのためには、次のことを忘れないでください。
* 控え目である
* 良き隣人である
* メドゥーサを見ないようにする
* 結びつきを極力弱くする
* 結束性を高める
* 家族の一員として扱う
* パターンで考える
こうした習慣を身につけ、使いこなせるようになると、皆さんはきっとアプリケーションの品質が変わったことに驚くはずです。
590nobodyさん
2008/11/30(日) 22:51:36ID:??? 内容は否定しないが、その書き方はどうかなと思うな。
英語の翻訳だからなのかな。
「メドゥーサを見ないようにする」なんて飛躍した比喩表現では
イメージつかないだろw
英語の翻訳だからなのかな。
「メドゥーサを見ないようにする」なんて飛躍した比喩表現では
イメージつかないだろw
591nobodyさん
2008/11/30(日) 23:12:38ID:???592nobodyさん
2008/12/01(月) 12:13:27ID:YUzphIUV594nobodyさん
2008/12/04(木) 18:30:24ID:??? DIコンテナとかどうなのか
595nobodyさん
2008/12/14(日) 06:43:35ID:??? オブジェクト指向のカンタンな例
<?php
class A
{
function foo()
{
echo 'hello <br>';
}
}
$a = new A();
$a->foo();
$b=new A();
$b->foo();
?>
<?php
class A
{
function foo()
{
echo 'hello <br>';
}
}
$a = new A();
$a->foo();
$b=new A();
$b->foo();
?>
596nobodyさん
2008/12/15(月) 02:03:44ID:??? 簡易なMVCモデルのサンプルってないのかなぁ。
フレームワークを作るとか、フレームワークを使うとかじゃなくてさ。
考え方を学ぶためにみてみたいんだけど。
過去ログにあるように、つい、MVモデルになってしまうもんで。
フレームワークを作るとか、フレームワークを使うとかじゃなくてさ。
考え方を学ぶためにみてみたいんだけど。
過去ログにあるように、つい、MVモデルになってしまうもんで。
597nobodyさん
2008/12/15(月) 03:35:20ID:??? 巷に星の数ほどあるだろ
598nobodyさん
2008/12/15(月) 12:27:44ID:??? Googleで、
簡易なMVCモデル
と検索させる
ttp://www.google.com/search?client=safari&rls=ja-jp&q=簡易なMVCモデル&ie=UTF-8&oe=UTF-8
ドゾ...
簡易なMVCモデル
と検索させる
ttp://www.google.com/search?client=safari&rls=ja-jp&q=簡易なMVCモデル&ie=UTF-8&oe=UTF-8
ドゾ...
599nobodyさん
2008/12/16(火) 10:49:27ID:???600nobodyさん
2008/12/16(火) 10:56:49ID:??? http://www.zend.co.jp/tech/index.php?cmd=read&page=%A5%B3%A1%BC%A5%C7%A5%A3%A5%F3%A5%B0%BB%D8%BF%CB%2F%A3%B4%A1%A5MVC
ひょっとして、「Viewではhtml出力をしてはいけない」という考えを示している
ということなのか?
html出力は別のクラスに任せるべきで、Viewはそのクラスのインスタンスの生成
と実行までを行うべきだという視点で批判してるとか。
ひょっとして、「Viewではhtml出力をしてはいけない」という考えを示している
ということなのか?
html出力は別のクラスに任せるべきで、Viewはそのクラスのインスタンスの生成
と実行までを行うべきだという視点で批判してるとか。
601nobodyさん
2008/12/16(火) 11:17:25ID:??? はい?批判ってどれ?
602nobodyさん
2008/12/16(火) 12:52:53ID:???604nobodyさん
2008/12/16(火) 19:38:24ID:??? よくわかんないんだけど、OOPとMVCって両立できるの?
605nobodyさん
2008/12/16(火) 19:50:24ID:??? MVCをOOPで実現するんだろw
606nobodyさん
2008/12/17(水) 01:23:14ID:??? これどうなの?
ttp://www13.plala.or.jp/naka_jima/php/chapter12.html
ttp://www13.plala.or.jp/naka_jima/php/chapter12.html
607nobodyさん
2008/12/17(水) 01:36:07ID:??? どうって何が?
608nobodyさん
2008/12/17(水) 03:42:22ID:??? MVCだと必ずフレームワークを使わなければならないわけでもないよね。ちがうの?
それとも、非常に単純なクラス構成でMVCを実現しようという考えが間違いとか?
それとも、非常に単純なクラス構成でMVCを実現しようという考えが間違いとか?
609nobodyさん
2008/12/17(水) 04:51:02ID:??? 別にいいんじゃ?
610nobodyさん
2008/12/17(水) 10:09:45ID:??? >>606見たんだけど、MVCってこんななの?
View や Model 1つに対して1ファイルみたいだけど、ファイル量半端ないことになりそう。
View や Model 1つに対して1ファイルみたいだけど、ファイル量半端ないことになりそう。
611nobodyさん
2008/12/17(水) 14:15:45ID:??? DBの形式や最終的な見せ方によって、ファイル数は変わるんじゃないの?
でも、MVCってわりとファイル多めだよな!
1ファイルのコード量、大して多くないけど
でも、MVCってわりとファイル多めだよな!
1ファイルのコード量、大して多くないけど
612nobodyさん
2008/12/17(水) 15:06:27ID:??? ファイルが多めなのが嫌なら1ファイル内に複数書けばいいじゃない
613nobodyさん
2008/12/17(水) 17:53:39ID:??? OOPそのものをやろうとするとクラスやファイル量が多くなるからね。
汎用性を考えて作ろうとするとなおさらだ。それはしかたがないのかも。
そこをあえて、フレームワークや外部のモジュールなどを使わずに
非常にクラス数を少なくしてやってみたいなと思うんだけどね。
MVCの理解の一環として。
汎用性を考えて作ろうとするとなおさらだ。それはしかたがないのかも。
そこをあえて、フレームワークや外部のモジュールなどを使わずに
非常にクラス数を少なくしてやってみたいなと思うんだけどね。
MVCの理解の一環として。
614nobodyさん
2008/12/17(水) 20:20:24ID:??? やってみればいいのでは?
615nobodyさん
2008/12/18(木) 01:34:16ID:??? <?php
class Framework{
// コントローラー
public function controller(array $inp){
$model = $this->model($this->di('Action', $this->di('Action_Mapper',$inp));
$this->view($model);
}
// モデル
protected function model(Action $actions){
return $action->do();
}
// ビュー
protected function view($model){
print ($this->di('View_Helper', array($model));
}
// DIコンテナ
protected function di($class, $options){
return new $class($options);
}
}
class HelloWorld extends Frameworkd{}
App::controller($_GET);
class Framework{
// コントローラー
public function controller(array $inp){
$model = $this->model($this->di('Action', $this->di('Action_Mapper',$inp));
$this->view($model);
}
// モデル
protected function model(Action $actions){
return $action->do();
}
// ビュー
protected function view($model){
print ($this->di('View_Helper', array($model));
}
// DIコンテナ
protected function di($class, $options){
return new $class($options);
}
}
class HelloWorld extends Frameworkd{}
App::controller($_GET);
616nobodyさん
2008/12/18(木) 01:36:48ID:??? なんじゃそりゃ
617nobodyさん
2008/12/18(木) 01:37:24ID:??? 最後の一行間違い
618nobodyさん
2008/12/18(木) 08:21:41ID:??? せめてクラスは3つ以上にするべきだろ。
最低限といっても、ファイルを読み込んで表示とか、書き込みとかの処理まで
出来る機能を持ったほうがコントローラとビューの違いが明確に分かりやすく
なると思うんだけど。
最低限といっても、ファイルを読み込んで表示とか、書き込みとかの処理まで
出来る機能を持ったほうがコントローラとビューの違いが明確に分かりやすく
なると思うんだけど。
619nobodyさん
2008/12/18(木) 10:48:40ID:??? これはMVCどこがやるのが妥当か?
ってところで迷う。
時々、曖昧なのが出てきちゃう。
ってところで迷う。
時々、曖昧なのが出てきちゃう。
620nobodyさん
2008/12/18(木) 11:48:41ID:??? >>619
ここで事例を通じて具体的な意見を交わしていけばどうかな?」
例えば・・・
掲示板
■コントローラ:処理の内容を判断するクラス
・プログラムが実行された時、一番最初に実行される
・POSTの値をみて、以下の処理にてどれに該当するかを判断する
・データを表示する
・データを書込む
・編集用のフォームを表示する
■ビュー:htmlのレイアウト表示を担当するクラス
・以下のメソッドを持つ
・データをhtmlで表示する
・データ編集用htmlを表記する
■モデル:データファイルを管理するクラス
・ファイルの読み込み、書込みをする
・外部とは1件分のデータはBBSLineクラスでやりとりする
ここで事例を通じて具体的な意見を交わしていけばどうかな?」
例えば・・・
掲示板
■コントローラ:処理の内容を判断するクラス
・プログラムが実行された時、一番最初に実行される
・POSTの値をみて、以下の処理にてどれに該当するかを判断する
・データを表示する
・データを書込む
・編集用のフォームを表示する
■ビュー:htmlのレイアウト表示を担当するクラス
・以下のメソッドを持つ
・データをhtmlで表示する
・データ編集用htmlを表記する
■モデル:データファイルを管理するクラス
・ファイルの読み込み、書込みをする
・外部とは1件分のデータはBBSLineクラスでやりとりする
621nobodyさん
2008/12/18(木) 12:24:15ID:??? >>620
『■コントローラ:処理の内容を判断するクラス 』の
> ・データを表示する
> ・データを書込む
『 ■モデル:データファイルを管理するクラス 』の
> ・ファイルの読み込み、書込みをする
って、意味が重複しているような感じがするのですが...
ならば、
■コントローラ:処理の内容を判断するクラス
・モデルからデータを受け取る
・モデルにデータを渡す
とかでは、おかしいですか?
『■コントローラ:処理の内容を判断するクラス 』の
> ・データを表示する
> ・データを書込む
『 ■モデル:データファイルを管理するクラス 』の
> ・ファイルの読み込み、書込みをする
って、意味が重複しているような感じがするのですが...
ならば、
■コントローラ:処理の内容を判断するクラス
・モデルからデータを受け取る
・モデルにデータを渡す
とかでは、おかしいですか?
622nobodyさん
2008/12/18(木) 12:52:00ID:???624nobodyさん
2008/12/18(木) 20:10:31ID:??? MVCモデルでM同士で連携することってあり?
それとも必ずC経由?
C経由の場合、Mをなるべく疎結合になるように細分化してると、
Cの各Actionに書くロジック量が半端なく多くなってくるんだよね。
(Aデータを取ってきてBデータを取ってきてBをCバリデータに通してAとBを基にDを作成して・・・みたいな)
一つのAction内にロジックが増えるのもどうかと思うし、それって新しいモデルじゃんという気もしてこないでもない。
それとも必ずC経由?
C経由の場合、Mをなるべく疎結合になるように細分化してると、
Cの各Actionに書くロジック量が半端なく多くなってくるんだよね。
(Aデータを取ってきてBデータを取ってきてBをCバリデータに通してAとBを基にDを作成して・・・みたいな)
一つのAction内にロジックが増えるのもどうかと思うし、それって新しいモデルじゃんという気もしてこないでもない。
625nobodyさん
2008/12/18(木) 20:23:33ID:??? >>624
俺はM同士で連携するかたちでも良いと思うけどね。
CからMを見た場合、あるまとまった処理単位でメソッドを呼び出す形であることが
重要だと思うから。
CがMを使うときは必ずメソッドA呼び出してメソッドB、メソッドCを実行しなければならない。
さらに、そういう3連呼び出しがCの中に何箇所か書かれているなんていうのは再利用性などが
悪くなると思うから。
俺はM同士で連携するかたちでも良いと思うけどね。
CからMを見た場合、あるまとまった処理単位でメソッドを呼び出す形であることが
重要だと思うから。
CがMを使うときは必ずメソッドA呼び出してメソッドB、メソッドCを実行しなければならない。
さらに、そういう3連呼び出しがCの中に何箇所か書かれているなんていうのは再利用性などが
悪くなると思うから。
626nobodyさん
2008/12/19(金) 16:35:55ID:??? 試しに掲示板をMVCでやったら、なんかやっとそれっぽくなった。
628nobodyさん
2008/12/20(土) 14:28:47ID:??? >624
変化する内部状態を持つモデル同士で連携させると見通しが悪くなる。
生成してから、(観察される)内部状態が変化しないようなモデルはどこから呼んでもそれほど大きな問題はない。
オブジェクトの生成期間中に(観察される)内部状態が変化するようなモデルは、C直轄にしといた方がいい。
変化する内部状態を持つモデル同士で連携させると見通しが悪くなる。
生成してから、(観察される)内部状態が変化しないようなモデルはどこから呼んでもそれほど大きな問題はない。
オブジェクトの生成期間中に(観察される)内部状態が変化するようなモデルは、C直轄にしといた方がいい。
629nobodyさん
2008/12/20(土) 14:34:18ID:??? 生成期間→生存期間
なんか寝ぼけてた。
要は変化する「状態」を持っているもの全てはCの管理下に置いておいた方がいいってこった。
「状態」が無いもの(生成時にファイルからデータをロードしてそれっきり、とか)はどこにあったって構わない。
インスタンスの生成を行なうクラスは自分ルールでもいいからある程度絞っておかないと混乱すると思うけどな。
なんか寝ぼけてた。
要は変化する「状態」を持っているもの全てはCの管理下に置いておいた方がいいってこった。
「状態」が無いもの(生成時にファイルからデータをロードしてそれっきり、とか)はどこにあったって構わない。
インスタンスの生成を行なうクラスは自分ルールでもいいからある程度絞っておかないと混乱すると思うけどな。
630nobodyさん
2008/12/20(土) 15:34:43ID:??? 変な質問だけど、OOP での Validator ってのがよくわかんねえ。
is_numeric(); とかをModel内にべた書きしないで、Validatorオブジェクトを通じて、変数の内容を確認すればいいの?
$str = 'string';
$valid =& new Validator();
$valid->isStr($string);
みたいな感じで。
BaseValidator みたいな基本的なチェックをするクラスを作って、継承した先で複雑なチェック用のメソッドを実装させればいいのかな。
is_numeric(); とかをModel内にべた書きしないで、Validatorオブジェクトを通じて、変数の内容を確認すればいいの?
$str = 'string';
$valid =& new Validator();
$valid->isStr($string);
みたいな感じで。
BaseValidator みたいな基本的なチェックをするクラスを作って、継承した先で複雑なチェック用のメソッドを実装させればいいのかな。
631630
2008/12/20(土) 15:37:54ID:??? 引数間違えてる。最後の行。
$valid->isStr($str);
ね。まぁ、別に問題ないが。
$valid->isStr($str);
ね。まぁ、別に問題ないが。
632nobodyさん
2008/12/20(土) 15:54:47ID:??? 問題はありまくりだろ
633nobodyさん
2008/12/20(土) 16:42:14ID:??? >630
ttp://gist.github.com/38261
俺はValidatorクラスはコントローラ単位で実装してる。「入力値の検証」なのだから、コントローラの責任。
Validatorだけ独立させるのはコードの見通しを良くするためであり、責任はあくまでコントローラにある。
ただ、実際にそっからコールするのはModelのメソッド。何が許可されるかを知ってるのはだいたいModelだからな。
たとえば受け付ける値が日付なら、そっから日付クラスのvalidateメソッドを呼び出す(MyDate::validate($string))。
POSTされる中に列挙型(<select>から送られるような、選択肢が限られているもの)とかがあった場合にこの構成は滅茶苦茶強い。
<select>のためのデータ生成とか、送られたvalueから画面表示用の文字列(「〜モード」とか)への変換を一箇所に集められる。
あと、文字列が決まったフォーマットになっているか調べる場合とかな。
is_strとかctype_stringとかstrlenだけで検証が終わるものはvalidatorクラス内に直書きする。
validateNumericとかvalidateStrとか書くよりその方が分かりやすい。
ttp://gist.github.com/38261
俺はValidatorクラスはコントローラ単位で実装してる。「入力値の検証」なのだから、コントローラの責任。
Validatorだけ独立させるのはコードの見通しを良くするためであり、責任はあくまでコントローラにある。
ただ、実際にそっからコールするのはModelのメソッド。何が許可されるかを知ってるのはだいたいModelだからな。
たとえば受け付ける値が日付なら、そっから日付クラスのvalidateメソッドを呼び出す(MyDate::validate($string))。
POSTされる中に列挙型(<select>から送られるような、選択肢が限られているもの)とかがあった場合にこの構成は滅茶苦茶強い。
<select>のためのデータ生成とか、送られたvalueから画面表示用の文字列(「〜モード」とか)への変換を一箇所に集められる。
あと、文字列が決まったフォーマットになっているか調べる場合とかな。
is_strとかctype_stringとかstrlenだけで検証が終わるものはvalidatorクラス内に直書きする。
validateNumericとかvalidateStrとか書くよりその方が分かりやすい。
634nobodyさん
2008/12/20(土) 17:07:58ID:???635nobodyさん
2008/12/20(土) 17:13:17ID:??? >>633
>「入力値の検証」なのだから、コントローラの責任。
「検証する」んじゃなく「検証させる」のが仕事じゃないの?
ここでいう入力値の検証って例えばどんなこと言ってる?
3行目で
>何が許可されるかを知ってるのはだいたいModelだからな。
って書いてるってことは、なにか、Modelに関係ないものを想定してると思うんだけど。
>「入力値の検証」なのだから、コントローラの責任。
「検証する」んじゃなく「検証させる」のが仕事じゃないの?
ここでいう入力値の検証って例えばどんなこと言ってる?
3行目で
>何が許可されるかを知ってるのはだいたいModelだからな。
って書いてるってことは、なにか、Modelに関係ないものを想定してると思うんだけど。
636nobodyさん
2008/12/20(土) 18:07:36ID:??? >635
大雑把に言うと、処理を始める前に可能なパラメータの検証全般。
純粋に入力値だけを見て判定できるものだな。システムや環境の状態を見なくとも判定できるエラーを出す役割。
処理を始めないと分からないもの(DBに指定されたエントリーがあるかとか)は、バリデーションでは扱わない。
DBにこの値があった場合はクッキーにこれが無いといけない…みたいなのも対象外。
日付として「'9999-12-31'」が指定されてもバリデーションでは引っ掛けない。これは有効な入力。
「'2008-13-45'」はバリデーションでエラーとして引っ掛ける。この日付が有効になる事はあり得ないから。
メールアドレスが正しいフォーマットかをチェックするのはバリデーションで、それが有効なメールアドレスかをチェックするのはモデル。
ユーザーIDとして正しいフォーマットならばバリデーションは通るが、当該ユーザーがいない場合モデルがエラーを出す。
大雑把に言うと、処理を始める前に可能なパラメータの検証全般。
純粋に入力値だけを見て判定できるものだな。システムや環境の状態を見なくとも判定できるエラーを出す役割。
処理を始めないと分からないもの(DBに指定されたエントリーがあるかとか)は、バリデーションでは扱わない。
DBにこの値があった場合はクッキーにこれが無いといけない…みたいなのも対象外。
日付として「'9999-12-31'」が指定されてもバリデーションでは引っ掛けない。これは有効な入力。
「'2008-13-45'」はバリデーションでエラーとして引っ掛ける。この日付が有効になる事はあり得ないから。
メールアドレスが正しいフォーマットかをチェックするのはバリデーションで、それが有効なメールアドレスかをチェックするのはモデル。
ユーザーIDとして正しいフォーマットならばバリデーションは通るが、当該ユーザーがいない場合モデルがエラーを出す。
637nobodyさん
2008/12/21(日) 00:53:43ID:??? >>636
なんとなく分かるけど、
例えばそれだと「2008-13-45は日付(のつもり)」ってことを
コントローラが知っとかないといけないってことだよね?
あと、日付が必要なくなった、とかいうときは
コントローラーを変更しないといけないってことにならない?
なんか拘ってるようでアレだけどお勉強スレってことで許してw
なんとなく分かるけど、
例えばそれだと「2008-13-45は日付(のつもり)」ってことを
コントローラが知っとかないといけないってことだよね?
あと、日付が必要なくなった、とかいうときは
コントローラーを変更しないといけないってことにならない?
なんか拘ってるようでアレだけどお勉強スレってことで許してw
638nobodyさん
2008/12/21(日) 00:57:41ID:??? って、もしかして、リクエストとして渡ってくるものを想定してるのかな。
hoge.php?date=20081231
とか。
hoge.php?date=20081231
とか。
639nobodyさん
2008/12/21(日) 12:32:43ID:??? >637
「コントローラ」の指している範囲が俺と違う気がする。
俺はディスパッチャ(処理の振り分け)部分じゃなくて、そこから振り分けられる先のコントローラを指している。
ぐぐったが、「アクション」としてクラスにして丸ごとコントローラから切り離す文化圏もあるようだな。
「日付のつもりで送られてくる文字列がある」という事実は、ディスパッチャは(たいていの場合)知らない。
が、コントローラ(アクション)は知っている。だって知らないと日付具象モデルに処理を引き渡しようがないからな。
Cにはどの道変更が入る。リクエストをモデルに引き渡すのが仕事だからな。
「日付がどこからどう渡ってくるか」はCの管轄であってMじゃない。Mはそれを知っていてはいけない。
Mは「日付を渡されたらどうする」だけ知っていればよく、実際問題どこに日付があるかはCが隠蔽すべき。
たとえば、日付指定でDBからレコードを取っていたのを、「無指定時は今日と見なす」と変更したとする。
この場合は、Cを「日付省略時は現在の日付でMを呼び出す」ように変更し、Mには触れないのが正しい。
「省略時は日付を無視して過去のレコードを全取得する」という場合は、データ取得ロジックが変更なのでまずMは変わる。
制御の構造、呼び出しインターフェイスも変わるのでCも変わる。
「コントローラ」の指している範囲が俺と違う気がする。
俺はディスパッチャ(処理の振り分け)部分じゃなくて、そこから振り分けられる先のコントローラを指している。
ぐぐったが、「アクション」としてクラスにして丸ごとコントローラから切り離す文化圏もあるようだな。
「日付のつもりで送られてくる文字列がある」という事実は、ディスパッチャは(たいていの場合)知らない。
が、コントローラ(アクション)は知っている。だって知らないと日付具象モデルに処理を引き渡しようがないからな。
Cにはどの道変更が入る。リクエストをモデルに引き渡すのが仕事だからな。
「日付がどこからどう渡ってくるか」はCの管轄であってMじゃない。Mはそれを知っていてはいけない。
Mは「日付を渡されたらどうする」だけ知っていればよく、実際問題どこに日付があるかはCが隠蔽すべき。
たとえば、日付指定でDBからレコードを取っていたのを、「無指定時は今日と見なす」と変更したとする。
この場合は、Cを「日付省略時は現在の日付でMを呼び出す」ように変更し、Mには触れないのが正しい。
「省略時は日付を無視して過去のレコードを全取得する」という場合は、データ取得ロジックが変更なのでまずMは変わる。
制御の構造、呼び出しインターフェイスも変わるのでCも変わる。
640nobodyさん
2008/12/21(日) 12:37:44ID:??? まあ実際は、日付省略時のMの挙動を変えるだろうけどな。
>638
入力値以外のもの(DB内の値とか処理結果)の検証は当然モデル。
というか、そういうのは一般にはバリデーションとは言わずアサーションと呼ぶ。
>638
入力値以外のもの(DB内の値とか処理結果)の検証は当然モデル。
というか、そういうのは一般にはバリデーションとは言わずアサーションと呼ぶ。
641nobodyさん
2008/12/21(日) 13:45:12ID:???642nobodyさん
2008/12/21(日) 14:51:26ID:??? >641
やっぱ、そこか。
例えばブログの場合、エントリー群を司るモデルや、タグクラウドを司るモデルができる。これは自明だな。
で、データを受け取って画面を表示するだけの、ごく単純なビューがいる。これも自明。
で、それら呼び出してページのデータを作る、という「データの統合」を司るクラスが必要になる。
これをMVCのうち、MとCのどっちに置くかの問題。
MVC、MVCって言ってるけど、本質的には4層なんだよ。
処理の振り分けに1層を割くならば、4層なくてはならない。
処理の振り分け=呼び出すCの決定(ディスパッチャ)→どのMを呼び出すかを制御する(コントロール)
→データを実際に扱う(モデル)→表示(ビュー)、となる。
実際のフレームワークだと、RailsやZendはDispatcherが振り分けを担当し、制御はコントローラが執っている。
(だから、おまいの目から見れば、コントローラは仕事をやりすぎに見えるはず)
SymfonyやCakeだとControllerがディスパッチを担当し、制御はActionが執っている。
CodeIgniterだとディスパッチは単一のエントリポイント(リクエストを受けるphpファイル)であるindex.phpが行なって、制御はCが行なっている。
やっぱ、そこか。
例えばブログの場合、エントリー群を司るモデルや、タグクラウドを司るモデルができる。これは自明だな。
で、データを受け取って画面を表示するだけの、ごく単純なビューがいる。これも自明。
で、それら呼び出してページのデータを作る、という「データの統合」を司るクラスが必要になる。
これをMVCのうち、MとCのどっちに置くかの問題。
MVC、MVCって言ってるけど、本質的には4層なんだよ。
処理の振り分けに1層を割くならば、4層なくてはならない。
処理の振り分け=呼び出すCの決定(ディスパッチャ)→どのMを呼び出すかを制御する(コントロール)
→データを実際に扱う(モデル)→表示(ビュー)、となる。
実際のフレームワークだと、RailsやZendはDispatcherが振り分けを担当し、制御はコントローラが執っている。
(だから、おまいの目から見れば、コントローラは仕事をやりすぎに見えるはず)
SymfonyやCakeだとControllerがディスパッチを担当し、制御はActionが執っている。
CodeIgniterだとディスパッチは単一のエントリポイント(リクエストを受けるphpファイル)であるindex.phpが行なって、制御はCが行なっている。
643nobodyさん
2008/12/21(日) 15:35:51ID:??? >>642
>たとえば、日付指定でDBからレコードを取っていたのを、「無指定時は今日と見なす」と変更したとする。
>この場合は、Cを「日付省略時は現在の日付でMを呼び出す」ように変更し、Mには触れないのが正しい。
これって制御じゃなくてロジックだからモデル的仕事じゃねぇの?
>たとえば、日付指定でDBからレコードを取っていたのを、「無指定時は今日と見なす」と変更したとする。
>この場合は、Cを「日付省略時は現在の日付でMを呼び出す」ように変更し、Mには触れないのが正しい。
これって制御じゃなくてロジックだからモデル的仕事じゃねぇの?
645nobodyさん
2008/12/21(日) 16:03:24ID:??? 4層www
647nobodyさん
2008/12/24(水) 12:54:19ID:??? 考え方としてディスパッチとコントロールは分けるべきだが、
実装するときは、コントロールで括るよな?
実装するときは、コントロールで括るよな?
648642
2008/12/24(水) 22:47:37ID:??? >647
M・V・Cで分けるならCってのは同意。いちおう
> 処理の振り分けに1層を割くならば
と予防線は張ってあるわけだが。
俺はControllerの親クラスとかControllerFactoryでディスパッチする事が多い。
M・V・Cで分けるならCってのは同意。いちおう
> 処理の振り分けに1層を割くならば
と予防線は張ってあるわけだが。
俺はControllerの親クラスとかControllerFactoryでディスパッチする事が多い。
649nobodyさん
2008/12/25(木) 12:55:55ID:??? >>648
> Controllerの親クラスとかControllerFactoryでディスパッチする事が多い
ディスパッチャーのインターフェースを作って、コントローラクラスでインプリメンツするってのは駄目なの?
> Controllerの親クラスとかControllerFactoryでディスパッチする事が多い
ディスパッチャーのインターフェースを作って、コントローラクラスでインプリメンツするってのは駄目なの?
650nobodyさん
2009/01/04(日) 21:25:44ID:??? 保守
651nobodyさん
2009/01/10(土) 18:38:23ID:??? 保守
652nobodyさん
2009/01/18(日) 01:35:36ID:??? 手始めに、サイトのリニューアルついでにSmarty入れてCMS'っぽく'してみる。
レスを投稿する
ニュース
- 女優・松本まりか「壊されたくない物があるなら、罰で強制でなく…大切に思ってもらえるように行動すべき」作家の国旗に関する投稿に私見 [少考さん★]
- 【日本代表】ブラジル撃破へ…板倉滉「全員が倒す気でいる」 長友佑都「過去イチくらいチームが団結。 勝ちます!見ていてください」 [王子★]
- 【五輪】IOC「私たちは再び日本で冬季五輪を行いたいと考えている」 [ニーニーφ★]
- ”アジアの惨状”「世界でダントツの弱い地域…」9チーム中7チームが敗退、SNS嘆き節「弱すぎる」「イタリア出したほうがいい」 [ゴアマガラ★]
- 長友が本気のブラジル撃破を約束「忘れられない一日にさせます」報道陣には「(帰りの)飛行機とっているんだったら全部キャンセルで」 [ゴアマガラ★]
- 【日経世論調査】高市内閣支持2ポイント上昇68% 食品消費税1%案に賛成49% [蚤の市★]
- 【実況】博衣こよりのえちえち電脳少女シロ清楚の日9 🧪🐬
- 高市支持率上昇。最多理由「人柄が信頼できる」 [237216734]
- 日本人「コスパ!タイパ!スペパ!」<ー日本人ってなんでこんなパフォーマンスしか見なくなっちゃったの? [153736977]
- メモリ会社「メモリは今の価格から更に倍になる。二度と下がらないよ😅」 [589647274]
- 【高市悲報】日本政府、官民ファンドによるゲームアニメの経済波及効果を300兆円と閣議決定 [709039863]
- 高市早苗、動く「南鳥島沖レアアースは来年実証実験よ!2028年以降に商業利用を目指すわよ!」 大陸よ、震えて待て🤥 [117552482]