PHPでOOP (894レス)
1-

216
(1): 2008/02/02(土)07:42 ID:??? AAS
PHPでね、イベントドリブンなWEBフレームワークとか自作してみるといいかも。

例えば、サブミットボタンの処理ハンドラがオーバーライドで記述可能で
そこでフォーム値をモデルに渡して処理させるみたいなやつ・・

「POST」や「GET」とかローレベルの概念は全て隠蔽されてて
フレームワークにイベント発生時のロジックだけ記述して終わりみたいなの・・・

そしてPHPであれこれ試行錯誤したあと、ASP.NETとか参考にするとね
PHPでOOPするバカらしさに気付くかもしれない・・・OTL
217
(1): に ◆lKs5QMUHoA 2008/02/02(土)08:25 ID:??? AAS
ASP.NET は、ちょっとだけやってみたことあるけど、概念的に違和感が
あって、やらなくなったな。
ある程度Webアプリを学んだ事のある人には便利なんだろうけれど、
初めて学ぶ人には、ドキュメントが少なすぎだし、いきなりイベントドリブンで
やるのはどうかと思った。

で、まずは、Webアプリの基礎をやるという意味合いでPerlをやってみた。
で、今はPHPをやっている。PHPそのものがOOPに完全な対応をしていない
ので、これで大規模なアプリを組むことも無いかなと思っている。
対応したとしても、それからノウハウが出てくるので、さらに数年先になる。

でも、学ぶ時は、既存のモジュールを使って早くやるのよりも、モジュール
省2
218
(1): 2008/02/02(土)09:56 ID:??? AAS
>>217
多分、その違和感のある概念がOOPの本質だと思うよ。
そしてその概念は、洗礼された実装に触れることでしか
身につかないとも思うんだ。

初心者こそイベントドリブンを真っ先に学習したほうがいいよ。
最終的に、理解し易く安全な実装方法に結びつくと思うからね。

PHPでOOPで実装ってケースはありだとは思うけど、
概念は別で学習した方が効率的だと思うんだ。
219: 2008/02/02(土)13:32 ID:??? AAS
OOPに取り付かれているとか良くわからんw

普通にプログラミングしていると使うだろ?

switchに取り付かれているとかそういうレベルに聞こえるんだが。
220
(1): [age] 2008/02/02(土)15:21 ID:??? AAS
MVCモデルでプログラミングする場合、Model から View へ処理を渡す経緯は、
どっちが正しいのかな?
・Control クラスのメソッド内で、Model クラスと View クラスのインスタンスを生成する。
 Control クラスが、Model からデータを受け取り、View クラスへデータを渡し、
 描画指示を出す。
・Model クラスのメソッド内で、View クラスのインスタンスを生成する。
 Model クラスが、Viewクラスへデータを渡し、描画指示を出す。
 Control クラスは、View クラスを一切操作しない。

それとも、こういうところまでは理論的には定めていないので、
ケースバイケースであり、どちらがよいというものは無いということかな?
221: 2008/02/02(土)15:36 ID:??? AAS
お前は何を言ってるんだ
222: 1 ◆SWtzLesEmM 2008/02/02(土)16:44 ID:??? AAS
PHPでイベントドリブンですか?(・∀・)

…こんなのありました。^^
PHP イベントドリブン に一致する日本語のページ 約 10,600 件

●PRADO
外部リンク:www.pradoframework.com
>PRADO はコンポーネントベースかつイベントドリブンなウェブアプリケーションを開発するためのPHP5フレームワークです。

●S2Prado.PHP5
外部リンク[php5]:labs.s2php5.jp
外部リンク[php]:blog.xole.net
>S2Baseの方は待望のPRADO対応。
省10
223: 1 ◆SWtzLesEmM 2008/02/02(土)17:00 ID:??? AAS
インターネット越しにイベント処理をさせるのが、WEBプログラミングの特徴ですね。
イベントドリブンは、PHPよりもむしろFlash/Flexとかで使われる仕組みなのでしょうか?

レガシーの中心でのOOP
外部リンク:kaede.to
>Webプログラミングにおいて、ブラウザとのやり取りがレガシー(古典的)なデータ交換に過ぎず、これがWebプログラミングを難しくしている
>Webは1ページごとに毎回セッションが起動し、ドキュメントを表示するとすぐ終了する。
>オブジェクト指向プログラミングにおける利点の1つであるイベントドリブンなプログラミングは不可能だ。
>何しろ1セッションに1イベントしか発生しないのだから。
>と同時にセッション状態を保存する必要も出てくる。

外部リンク[html]:www.adobe.com
省8
224
(1): 1 ◆SWtzLesEmM 2008/02/02(土)17:05 ID:??? AAS
>>220
>・Control クラスのメソッド内で、Model クラスと View クラスのインスタンスを生成する。
こっちの方が、Controlにまとまっている分だけスッキリしており、分かりやすいコードになるんじゃないでしょうか?
225: 2008/02/02(土)17:24 ID:??? AAS
>>224
レスありがとうございます。
1番目の方にすると、Modelクラスから取得したデータを
Viewクラスに渡すことになるので、その分余計にメモリや
CPUを消費してしまうのでは、と心配になって聞いてみましたが、
考えてみると、コードの見易さなどを優先するのがOOPですので、
そちらの方がいいですね。

でも、フレームワークのソースなどを見ていると、
各クラスが、メンバに、別のクラスへのリファレンスを持ってたり
するので、もっと理論に従った組み方があるのかも、と思っています。
226
(1): 2008/02/02(土)17:36 ID:??? AAS
>>184
ファイル:全部で8つ。index.phpを実行する。
抽象クラスと具象クラスに実装を分けてみました。
csv.txt(※前回と同じ)
index.php
cfcontrol.php

アブストラクトとして実装
cfview.php
cfmodel.php

コンクリートとして実装
省3
227: 2008/02/02(土)17:38 ID:??? AAS
[config.php]
<?php

// 実際の処理を行うスクリプトをインクルード
include("./index_view.php");
include("./output_view.php");
include("./data_model.php");
// 最初に呼ばれるビューのプレフィックス設定
define ('INDEX_VIEW_PREFIX', "Index");
// モデルクラスのプレフィックス設定
define ('MODEL_PREFIX', "Data");
省9
228
(1): 2008/02/02(土)17:39 ID:??? AAS
[cfmodel.php]
<?php
class CFModel
{
var $file_name; // 読み込むファイル名
function CFModel() {}// コンストラクタ
function Execute($param) // パブリックメソッド
{
return $this->_OnExecute($param);
}
省22
229: 2008/02/02(土)17:39 ID:??? AAS
[cfcontrol.php]
<?php
include("./cfview.php");
include("./cfmodel.php");
include("./config.php");
class CFControl
{
var $_view_key; // 呼び出すビューのプレフィックス
var $_data; // モデルに渡すデータ
function CFControl($view_key, $data) // コンストラクタ
省19
230: 2008/02/02(土)17:40 ID:??? AAS
[data_model.php]
<?php
class DataModel extends CFModel
{
function DataModel() // コンストラクタで取得先のファイル設定
{
$this->file_name = 'csv.txt';
}
function _OnExecute($param) // オーバーライドメソッド
{
省8
231: 2008/02/02(土)17:41 ID:??? AAS
[index_view.php]
<?php
class IndexView extends CFView
{
function IndexView() // コンストラクタでPOST先のファイル設定
{
$this->file_name = 'index.php';
}
function _OnExecute($param) // オーバーライドメソッド
{
省8
232: 2008/02/02(土)17:42 ID:??? AAS
[output_view.php]
<?php
class OutputView extends CFView
{
function OutputView() // コンストラクタでPOST先のファイル設定
{
$this->file_name = 'index.php';
}
function _OnExecute($param) // オーバーライドメソッド
{
省8
233
(1): に ◆lKs5QMUHoA 2008/02/02(土)19:04 ID:??? AAS
>>226-232
サンプルソースありがとうございます。
抽象クラスの書き方に慣れてますね。私はこのあたりを
しっかりとやってなかったのでちょっと苦手です。
ま、しっかりと勉強していきたいと思います。(^^;

ソースを読んでいて、1点気になったので質問をしたいのですが、
class CFView と class CFModel において、以下のように
パブリックメソッドと仮想メソッドを作り、パブリックメソッドから
仮想メソッドを実行する形式にソースを書いた理由は何でしょうか?
出来ましたら、この設計にした意図を教えていただきたいと思います。
省8
234: に ◆lKs5QMUHoA 2008/02/02(土)19:24 ID:??? AAS
>>218
レスありがとうございます。
イベントドリブンそのものは、VBでWindowsアプリを組んでやったことがあるので
すぐに入れたのですが、Webアプリを作る際、イベントドリブンでしかやった事が
無いというのは致命的だと思ったので、PerlやPHPでやってみています。
(ASP.NETは、便利ではあるが、IISを使えとか、.NET Frameworkを使えとか
非常に限定される。)

構造化プログラミングで、あまり命名規則を考えずにプログラムをしていると、
グローバル変数や関数が多くなった時、その把握が出来なくなったりする
わけなのですが、そういう苦労する体験をした後、OOPを習うと、その便利な部分が
省4
235
(1): 2008/02/02(土)19:59 ID:??? AAS
人間て暖かいにゃぁ
ポカ・ポカ テンキュー
236
(1): 2008/02/02(土)21:30 ID:??? AAS
>>233
PHP4では全てパブリックだけど例えばC#では以下の実装になるんだ
public object Execute(object parpam)
protected virtual object _OnExecute(object parpam)

CFControlから_OnExecuteメソッドを隠蔽する意図なんだよ。
_OnExecuteはCFViewやCFModelのサブクラスにだけ見えれば十分なんだ。
237: に ◆lKs5QMUHoA 2008/02/03(日)11:17 ID:??? AAS
>>235
暖かいですねぇ。

>>236
なるほど。ありがとう。
238: に ◆lKs5QMUHoA 2008/02/03(日)14:47 ID:??? AAS
ソースを読んでいて気になった点がありますので、質問させていただきます。
includeの構成についてです。まず、各ファイルに書かれているincludeの部分をまとめます。

[index.php]
include("./cfcontrol.php");
[cfcontrol.php]
include("./cfview.php");
include("./cfmodel.php");
include("./config.php");
[config.php]
// 実際の処理を行うスクリプトをインクルード
省7
239: に ◆lKs5QMUHoA 2008/02/03(日)14:50 ID:??? AAS
includeをばらばらとさせるよりも、以下のように整理したほうが
となんとなく思ったりもしたのです。

[index.php]
include("./config.php");

[config.php]
include("./cfcontrol.php");
include("./cfview.php");
include("./cfmodel.php");
include("./index_view.php");
include("./output_view.php");
省1
240: 2008/02/03(日)15:27 ID:??? AAS
MVC?な俺にはここが一番わかりやすかった
実例コードが載ってるのがいい

PHPでMVC第1回:前編
外部リンク[jsp]:www.stackasterisk.jp
241: 2008/02/03(日)15:52 ID:??? AAS
javaのサイト見ろよ
242: 2008/02/03(日)16:56 ID:??? AAS
やけに伸びるな
243
(2): に ◆lKs5QMUHoA 2008/02/03(日)19:47 ID:??? AAS
ソースコードをちょっとだけ改変したものを作ってみた。
メモとかを残していく都合もあると思ったから、HP解説してみた。
外部リンク:www.geocities.jp
本当は、>>1さんがソースの管理とかもしてくれたりしたら、うれしいw
244
(1): 2008/02/04(月)01:44 ID:??? AAS
いちいちzipを解凍する気にならない
245: 2008/02/04(月)09:02 ID:??? AAS
>>243
CFViewクラスに具体的な実装をしちゃダメなんだよ。
そもそもHTMLのフォーム処理とかは、あとでPEARとか使えばいい。

サブクラスをうまく呼び出す仕組みだけを実装していくんだ。
246
(1): 2008/02/04(月)14:12 ID:??? AAS
>>244
> サブクラスをうまく呼び出す仕組みだけを実装していくんだ。
kwsk
247
(1): 2008/02/04(月)23:36 ID:??? AAS
>>246
構造化プログラミングはルーチンを呼ぶ方向で実装すると思うけど
OOPではルーチンに呼ばれる方向で実装して行く感じだよ。

大枠の骨組みだけを抽象クラスで作成して、処理は具象クラスで行うんだ。
インターフェイスさえ同じならあとで個別にパーツを交換出来たりするからね。

だったら基底クラスのメソッドなんて数個で十分じゃないかと思うんだ。
やたら複雑でよくばりな機能のクラスなんて、再利用の価値がないからね。
248
(1): に ◆lKs5QMUHoA 2008/02/05(火)01:28 ID:??? AAS
>>247
レスありがとうございます。
> 構造化プログラミングはルーチンを呼ぶ方向で実装すると思うけど
> OOPではルーチンに呼ばれる方向で実装して行く感じだよ。
私は、継承を活かした設計をした事が無かったので、ちょっと方向性を
誤ってしまったようですね。

Viewは、表示をつかさどるのだから、html表示を請け負うのでは、と
思っていたのですが、それよりも抽象的な枠組みを定義するという
ことですね。

となると、html表示は(PEARを使わないのであれば、)htmlタグの
省2
249: 2008/02/05(火)08:55 ID:??? AAS
>>248
HTML処理のヘルパクラス作成はあまりOOPの勉強にならないとも思うんだ。
もう既に頭の中で実装出来ているだろうし、引数を関数で処理するだけでしょ?

それよりも例えばPEARのHTML_QuickFormやテンプレートレンダラのSmartyを
Viewと連携させる仕組みとかを考えたりした方がよっぽど面白いよ。

すべてをフルスクラッチするプログラミングの方向性は必ずしも得策じゃないよ
既存のライブラリやコンポーネントを上手く利用するのもOOPの要素なんだよ。
250
(2): 2008/02/05(火)11:06 ID:??? AAS
OOPで継承を用いた設計について調べてみた。(OOP理論の入門ではなく、
継承を用いた設計などが入った解説)
この連載は良いかもしれない。

オブジェクト指向プログラミング超入門
.NETでオブジェクト指向プログラミングを始めよう
外部リンク[html]:www.atmarkit.co.jp

特に第6回は、今まで出てきていた話題だと思う。
Objectクラスで仮想メソッドToStringをもち、それから派生したクラスは、
オーバーロードをする仕組みを図説していて分かりやすい。

第6回 階層の頂点に立つクラス
省1
251: 2008/02/05(火)11:52 ID:??? AAS
>>250
PHPのプログラマにも非常に参考になると思いますよ。

.NETの世界はクラスベースなので初めからOOPの思考で実装します。
関数が作れないので構造化思考のVB6プログラマとか、クラスをnewせずに
引数を大量に渡すスタティックメソッドを呼んだりしてしまいます・・・

PHPはC言語での関数モジュールを呼び出す実装スタイルに近いので
やはりクラスを使って構造化プログラミングをしちゃいがちですね。

普及しているPHP4がOOP対応不十分なのと、開発環境が貧弱であることも
PHPでOOPがなかなか利用されない原因になってたりしますよね。

プロテクテッドメソッドの概念とかIDEがないと、なんでそうするのか
省1
252
(2): 2008/02/05(火)11:56 ID:??? AAS
AA省
253: 2008/02/05(火)12:16 ID:??? AAS
AA省
254: 2008/02/05(火)13:28 ID:??? AAS
Debug用出力のメソッドをView(基底クラス)に追加するといいだろうね。
各画面([LoginView] [InsertView] [MenuView] ・・・)で
エラー確認用のメソッドをオーバーロードする形で。
開発中はPOSTで受け取ったデータとかを画面上部に表示しながら動作確認する
っていうのは、よくやるからね。

Objectクラスを継承する形にするのは、このスレでは共通したメソッドの
実装という理由だ。という話だったけど、リファレンス関係の処理で
便利だという話がサイトに載っているようだね。
このあたりの考え方も活かすと良いかもしれない。
ただ、PHPのOOPだとうまく実装出来ないかもしれないが。
省1
255
(3): 2008/02/05(火)13:44 ID:??? AAS
Modelクラスも以下のメソッドを追加するという感じで設計すると良いのかな。

Select // データ取り出し
Delete // 削除
Insert // 新規追加
Update // 既存データの更新

>>228に載ってる既存のクラスには Execute があるけれど、
これも残しておくべきかな?
256
(1): に ◆lKs5QMUHoA 2008/02/05(火)19:03 ID:??? AAS
案がいくつか出てきたので、前回の駄目なソースを破棄して
またソースコードをリニューアルしようかと思ったが、
いざやり始めてみると、データベースを管理する基底クラスの
設計を具体的にどうするかをきめないといけなくなり、それを
どうするかで迷っている。。。

概ね以下のような感じにしたいと思ってるんだけどね。
DB格納の基底クラス:CFDB
テキストファイルに保存するクラス:Text_DB extend CFDB
PostgreSQLに保存するクラス:PostgreSQL_DB extend CFDB
MySQLに保存するクラス:MySQL_DB extend CFDB
省5
257
(1): 2008/02/05(火)20:33 ID:??? AAS
>>255
普通は機能をメソッドに振り分けると思うけど
コントローラのメソッド内で以下の様に
操作出来たら面白くない?

// モデルにフォーム値を渡してデータ書き込み
$insert = $this->models['InsertModel'];
$insert->setItem('name',  $_POST['name']);
$insert->setItem('title', $_POST['title']);
$insert->setItem('body',  $_POST['body']);
$insert->execute();
省6
258
(1): に ◆lKs5QMUHoA 2008/02/05(火)23:02 ID:??? AAS
>>257
要求仕様案

私は眼鏡屋(○○支店の店長)をやっている。
顧客の情報(名前、住所、性別、生年月日、・・・)を管理したい。

・眼鏡を購入した顧客の情報を登録しておき、ある一定期間経つと
新しい眼鏡を購入する案内のDMを発送したい。
→条件検索をしたい。
・登録した情報を検索し、どんなお客様かをすぐに確認出来るようにする。
→例えば、苗字を聞いて、詳細が分かるようにする。
・眼鏡の定期的なメンテナンスで、訪問してきたら、その対応履歴を
省11
259: に ◆lKs5QMUHoA 2008/02/05(火)23:21 ID:??? AAS
[データの入力例]
氏名:茂名
フリガナ:モナー
性別:男性
生年月日:H1/3/3
住所:東京都・・・
コメント:ふちなしタイプを希望している。

眼鏡購入日:2007/1/5
眼鏡の型番:2ch

[2007/1/5に購入した2ch]のメンテナンス履歴
省7
260
(1): に ◆lKs5QMUHoA 2008/02/06(水)01:36 ID:??? AAS
View の Debug メソッドの仕様もどうするかで迷っている。
Execute($param)したあと、Debugとか、もしくは、
Debugの中でExecute($param)を呼び出す処理だと、
<html>タグのそとに確認データが出力されてしまう。

Debug モードを on にすれば、<body>タグの上部に
テーブルで区切ってデータが表示されるとかかな。
だったら、メンバにDebugモードを追加かな。
という感じに考えてる。

みんなどう思う?
261
(1): 2008/02/06(水)09:30 ID:??? AAS
>>258
ちょっとしたシステムじゃん・・ (´・ω・)
それこそ既存のフレームワーク使用する案件だよ。

>>260
ディレクティブ付けたechoやvar_dump埋め込みで十分だと思うよ。
むしろその機能を実装するより、デバッガ環境構築した方がいい・・・

OOPに対する基本的概念への理解があまりにも無さ過ぎると思うんだ。
>>255にしても、Executeメソッドに呼ばれる仕組み作ってんのに、
なんで新しいメソッド実装して直接呼びたがるんだろう?

あれほどインタフェイスだけで実装するんだと(ry
省1
262
(2): 1 ◆SWtzLesEmM 2008/02/06(水)10:44 ID:??? AAS
>>243
>外部リンク:www.geocities.jp

↓動作サンプルを設置しました。
外部リンク:ssurl.net

↓コードに関するコメントのまとめ(>>184-226辺り)
外部リンク:ssurl.net
263
(2): 2008/02/06(水)11:45 ID:??? AAS
>>262
非常に乙です。m(_ _)m

>>226だけど >>1さんにここまでやって貰っちゃって申し訳ないし
これぞOOPってサンプルを必死に実装してアップするんでしばしお待ちを・・
264: 2008/02/06(水)13:18 ID:??? AAS
>>263
はやくアップしろよなw

俺がそれ見て勉強して、いつかエロイ人になったら
お前を雇ってやるよ! 感謝しろ
265: に ◆lKs5QMUHoA 2008/02/06(水)16:04 ID:??? AAS
>>262
動作サンプルまでつけていただいて、ありがとうございます。
過去ログも、そのままコピペするんじゃなくて、色をつけたり
分類したりすると非常に分かり易いですね。

ShiftJISだったりとか、スペース2個というのは標準じゃないとかは
気づいてたのですが、そこまで治していただいて申し訳ないです。
266
(1): 2008/02/06(水)16:34 ID:??? AAS
MVCって難しいね。
267: 2008/02/06(水)17:31 ID:??? AAS
>>266
別にわかんなくったって、やってけるから大丈夫。
無理に背伸びする必要は無い。
268: に ◆lKs5QMUHoA 2008/02/06(水)20:19 ID:??? AAS
フレームワークの解説に関するサイトを見つけました。
ここで概要をつかんだ後、実際に触れてみるといいかもしれない。

ASP.NET vs. Struts
フレームワーク徹底比較[前編]
外部リンク[html]:www.atmarkit.co.jp

この文章書いてる人、ネットワーク関連の書籍でよく見かけるよね。
269
(1): 2008/02/07(木)10:03 ID:??? AAS
>>261
> OOPに対する基本的概念への理解があまりにも無さ過ぎると思うんだ。
> >>255にしても、Executeメソッドに呼ばれる仕組み作ってんのに、
> なんで新しいメソッド実装して直接呼びたがるんだろう?

> あれほどインタフェイスだけで実装するんだと(ry

ちいたんのフレームワークは、Modelにinsertやdelを持ってるからそれを
参考に設計してみたんだけど。
外部リンク[php]:php.cheetan.net

俺はこれから勉強していくところなので理解がないのは認めるが、
このあたりはどういう見解なのかを教えて欲しい。
省3
270
(1): 2008/02/07(木)10:24 ID:??? AAS
>>269
フレームワーク実装に正解も不正解も無いと思うけどね・・

例えば
・クラスを使った構造化的メソッド呼び出し
$model->insert();
$model->del();
よりも
・ポリモーフィズム
$insert->execute();
$del->execute();
省6
271
(1): 2008/02/07(木)10:55 ID:??? AAS
>>270
レスサンクス。となると、
class CInsert extend CView、class CDel extend CView、・・・
みたいな設計にするということ?

ちょっと大雑把になってるけど、CInsertはこんな感じに実装するとか。
(テーブルのフィールドは、a,b,cという場合。)
class CInsert extend CView{
var $field_a;
var $field_b;
var $field_c;
省18
272
(1): 2008/02/07(木)11:32 ID:??? AAS
じゃ、用件仕様はこんな感じで良いのか?

[認証]
→・ID、パスワードにて認証
 ・認証成功で[メニュー]へ移動

[メニュー]
→・(新規)[個人情報入力]、[検索指定]画面へ移動するボタンがある

[個人情報入力]
→・名前、性別 を登録

[検索指定]
→・氏名のキーワードを含む検索、性別指定が出来る。
省4
273
(1): 2008/02/07(木)12:35 ID:??? AAS
>>271今こんな感じ。
[DataModel.php]
<?php
/**
 * データModel抽象クラスです。
 */
class DataModel extends Model
{
# @access private
var $_items;
省14
274
(1): 2008/02/07(木)12:36 ID:??? AAS
[InsertModel.php]
<?php
/**
 * データ追加Model抽象クラスです。
 */
class InsertModel extends DataModel
{
# @access sealed
function & _onExecute(&$param)
{
省8
275
(1): 2008/02/07(木)12:37 ID:??? AAS
[SampleInsertModel.php]
<?php
/**
 * データ追加 サンプルクラスです。
 */
class SampleInsertModel extends InsertModel
{
# @access protected
function & _onInsert(&$param)
{
省19
276: 2008/02/07(木)13:59 ID:??? AAS
細かい指摘になるけれど、継承関係の勉強中なので質問で書き込みします。

[InsertModel.php]
class InsertModel extends DataModel
function & _onExecute(&$param)  のところは、
return $this->_OnInsert(&$param);  となっているけれど、
return $this->_onInsert(&$param);  が正しいという解釈で良いのですよね?
277: 2008/02/07(木)14:16 ID:??? AAS
>>273-275
ソースのサンプルサンクス。
イメージしてたよりも継承が多いですね。

全体ソースコードの可読性よりも、クラス単位での
再利用性を考えた場合は、このような構成になる
のでしょうね。早く慣れないといけません。
278: 2008/02/07(木)15:36 ID:??? AAS
まだ中身が出来ていない状況なので、修正の必要はあるだろうけど、
こんな感じでドキュメントもまとめていくと、分かりやすくなるだろうね。

■SampleInsertModelクラス[SampleInsertModel.php]
Model - DataModel - InsertModel - SampleInsertModel

◎概要
DBへのデータの記録、読み取りを行うクラス。

◎メンバ一覧
[publicコンストラクタ]
SampleInsertModel()

[publicメソッド]
省8
279
(2): 2008/02/07(木)23:22 ID:??? AAS
>>263 ひとまず出来ました・・疲れました・説明は後でアップしようと思います・・
外部リンク[zip]:proxy.f3.ymdb.yahoofs.jp
280: に ◆lKs5QMUHoA 2008/02/07(木)23:27 ID:??? AAS
>>279
乙です。じっくりソースを読んでみます。
281
(2): に ◆lKs5QMUHoA 2008/02/08(金)08:04 ID:??? AAS
せっかくプログラムを作っていただいたのだから、みんなでその説明文章をまとめるといいかもね。
例えば、こんな感じでhtmlで書いておいて、ファイル名をクリックすると、その詳細の説明のページに飛ぶとか。

[abstract]
  [controls]
    空
  [models]
    DataModel.php、DeleteModel.php、InsertModel.php、SelectModel.php、UpdateModel.php
  [views]
    HtmlQuickFormSmartyView.php、RenderView.php
[controls]
省20
282: 2008/02/08(金)08:10 ID:??? AAS
>>281
>>279ですがphpDocumentorで今作っているのでちょっと待っててね。
283: 2008/02/08(金)08:52 ID:??? AAS
phpDocumentorにソース読み込ませて吐かせただけです。
外部リンク[zip]:proxy.f3.ymdb.yahoofs.jp
フォルダ内のindex.htmlです、荒いですがご容赦を。

とりあえずトライアルなんでまだリファクタ出来そうだけど・・

[コントローラの処理]
_form_onLoad
_buttonHoge_onClick

[モデルの処理]
_onSelect
_onInsert
省9
284: 2008/02/08(金)09:26 ID:??? AAS
ファイルが見れん・・・
285
(1): 2008/02/08(金)11:03 ID:??? AAS
OOP FW ソース
外部リンク[zip]:proxy.f3.ymdb.yahoofs.jp
OOP FW ドキュメント
外部リンク[zip]:proxy.f3.ymdb.yahoofs.jp

すいません再アップしました、ドキュメントにControlが反映されてませんでした。
286: 2008/02/08(金)11:20 ID:??? AAS
サンクス
287
(1): 2008/02/08(金)11:51 ID:??? AAS
全体構成の把握はまだ出来てないけれど、只今、ソース解析中・・・
いちゃもんつけるつもりじゃないけれど、気になった点を2つ。

Control.phpのPOSTされたSubmitボタン名取得のところは
クラス化されてないのはどうしてなのでしょうか?
さらに非常にクラスが多くなって面倒になるから?

class Control extends Base
var \$_view_calss;
このメンバはあえてclassにしてない理由はあるのでしょうか。
288: 2008/02/08(金)12:39 ID:??? AAS
>>287
POSTされたサブミットボタン名取得部分は説明の通りです・・
今その部分をC#でのデリゲートで実装しようと思ってます。

Viewクラスexecuteのところもこのままでは$eパラメータが
コントローラから任意に渡せないので検討中です。

オブジェクトにexecute以外のパブリックメソッドを
実装しないのが目標です・・(※アクセサ以外)
289: 2008/02/08(金)13:12 ID:??? AAS
クラスの継承関係が結構複雑になってますね。
Documentsいただいても、追いかけていって、全体構造を把握するのが結構大変。
例えば、SampleInsertModelからその元を追っていくと、以下のような継承構造。
Base - Model - DataModel - InsertModel - SampleInsertModel

俺のメモとして、SampleInsertModelを追いかけていった様子をまとめておく。

■Base(抽象)クラス[fw/framework/Base.php]
●パブリックメソッド
& execute(&$param, $e) →アプリのログを記録する。_onExecute(&$param, $e)を実行
●プロテクテッドメソッド
_onExecute(&$param, $e) →サブクラスでオーバーライドして使用。
省4
290: 2008/02/08(金)13:15 ID:??? AAS
■DataModel(抽象)クラス[fw/abstract/models/DataModel.php]
●フィールド
$_items; // コントロール値のハッシュを保存
●パブリックメソッド
setItem($key, $value) // コントロール値を受け取り、$_itemsに代入
getItem($key) // $_itemsの値を返す。

■InsertModel(抽象)クラス[fw/abstract/models/InsertDataModel.php]
●シールドメソッド
& _onExecute(&$sender, $e) →onInsert(&$sender, $e)
●プロテクテッドメソッド
省6
291
(1): 2008/02/08(金)13:32 ID:??? AAS
こうやってみてみると、クラスを継承する際の設計思想が見えてくるな。
どの段階で実装を替えるかを考えた場合、どのクラスを置き換えれば良いかも分かる。

しかし、俺はこれまでフレームワークの構成などをじっくり読んだりしたことが無いので、
つい、ここまでクラスを継承させるメリットがあるのかなとか思ってしまう。
なんか、1つのメソッドを実装するのに、1回継承してるって感じだよね。

例えば、Model(抽象)クラスの $src_file_name を別のものにする場合、
それ以降のクラスが全部影響するかの確認が必要なわけだから、
Model(抽象)クラス以降のものをすべて一つのクラスにまとめて書いても
同じなんじゃないかと思えてしまう。
こういうのとは別な場面で、継承しているメリットがあるってことかな?
292: 2008/02/08(金)13:51 ID:??? AAS
ちょっと紹介しておきますね。

フレームワークを使った開発のメリット、デメリットを教えてください
外部リンク:q.hatena.ne.jp

特集:第1回 フレームワーク「Struts」の基礎を知る (3/8)
フレームワークのメリットとデメリット
外部リンク[html]:www.itmedia.co.jp
293
(1): 2008/02/08(金)15:31 ID:??? AAS
Control の & _onExecute(&\$param, \$e) で
\$this->_view_calss = \$view_calss;
というコードがあるけれど、右辺の \$view_calss って、
何処でも定義されてないですよね?
このまま動かすと、nullが入るだけのように思えるんだけど。
294: 2008/02/08(金)16:04 ID:??? AAS
Viewクラスの継承関係で、かいつまんだ一覧を書いておきます。
個別にはDocに書いてはあるけれど、こういう書き方みると分かりやすくない?

Base - View - RenderView - IndexView

■Base(抽象)クラス[fw/framework/Base.php]
(省略)

■View(抽象)クラス[fw/framework/View.php]
●プロパティ
$post_file; // POSTするファイル名

■RenderView(抽象)クラス[fw/abstract/views/RenderView.php]
●プロテクテッドメソッド
省8
295: 2008/02/08(金)16:20 ID:??? AAS
>>293
1行上のフックハンドラ実行の結果を渡している。
296: 2008/02/08(金)16:41 ID:??? AAS
ロードメソッド[MainControl::_form_onLoad(&$sender, $e)]が(POSTパラメータが
無い場合に呼ばれるメソッド)呼ばれるまでの経緯をたどってみたが、非常に複雑だ。。。

[fw/index.php]が実行される。
Mainクラスのインスタンスが生成され、execute(&$app, $e)が実行される。
Base:: & execute(&$param, $e) にて、 Base:: & _onExecute(&$param, $e)が実行される。
これは、Main::execute(&$app, $e)にてオーバーライドされている。
Controlクラスのインスタンスが生成され、execute(&$app, $e)が実行される。
Base:: & execute(&$param, $e) にて、 Base:: & _onExecute(&$param, $e)が実行される。
これはControl:: & _ onExecute(&$param, $e)にてオーバーライドされている。
Control:: & _onExecute(&$param, \$e) にて、Control::_hookedUpControler(&\$sender, \$e)を呼び出す。
省6
297: 2008/02/08(金)17:33 ID:??? AAS
リンク

symfony入門(1):symfonyで始めるPHPフレームワーク
外部リンク[aspx]:codezine.jp

Zend Framework入門(1):フレームワークの全体像とインストール
外部リンク[aspx]:codezine.jp
298
(2): に ◆lKs5QMUHoA 2008/02/08(金)18:46 ID:??? AAS
>>285のファイルが落とせない・・・
299: 2008/02/08(金)19:33 ID:??? AAS
>>298 見れるはずですが・・以下はどうですか?
Eclipceでのデバッグ画面です
画像リンク[jpg]:proxy.f3.ymdb.yahoofs.jp
300
(2): 2008/02/08(金)22:21 ID:??? AAS
>>298どうでしょうか?
外部リンク:briefcase.yahoo.co.jp
301: 2008/02/08(金)22:24 ID:??? AAS
なんでPHP4文法でやってんの?
302: に ◆lKs5QMUHoA 2008/02/08(金)23:53 ID:??? AAS
>>300でいけました。サンクスです。
303
(1): に ◆lKs5QMUHoA 2008/02/09(土)01:49 ID:??? AAS
これは、>>1さんのサイトでは、「入力フォームを作ってみる」とは
別で、「フレームワークを作ってみる」の演習という位置づけにした
方がいいかもしれないね。

これからの流れとしては、上のほうにあるように、このソースを
解読・改変していくための補助ドキュメント作成の方向と、
このフレームワークを使ってみる人のためのドキュメント作成
(チュートリアルみたいなもの)になるだろうね。
出来る範囲でみんなで手伝っていってみましょう。

このフレームワークは、MFCみたく、あらかじめ準備された
クラスのメソッド中に書き加えていくスタイルなのかな?
省2
304: に ◆lKs5QMUHoA 2008/02/09(土)02:12 ID:??? AAS
こうやってソースを読んでみると、これまで抽象的に聞いていた
フレームワークを使ったプログラミングのメリットとデメリットが実感できるね。

今まで、システムを組む際はOOPやフレームワークを使う方向にするべきだと
思ってたけれど、そうでもなく、状況や目的に合わせて選択する
というのが良い事が分かってきたような気がする。

小規模で全体概要を把握したいとか、移植性を考える場合は、フレームワークよりも、
クラスライブラリを使うスタイルの方が良い場合もありそうだ。
305
(1): に ◆lKs5QMUHoA 2008/02/09(土)08:12 ID:??? AAS
MVCでフレームワークを自作する方向と、クラスライブラリを自作する方向の
2つの方向をやってみて、それぞれのメリットとデメリットを確認していけば、
システムを作る場合の検討材料に出来ると思う。

何でもフルスクラッチしていき、なるべく依存性は無いようにし、(言語の
バージョンくらいに収めるとか)その組み合わせでアプリを作る、みたいな。
306
(1): 2008/02/09(土)09:45 ID:??? AAS
再度リファクタしてみました。
外部リンク:briefcase.yahoo.co.jp

[Controlクラス]
・リクエストオブジェクトの参照の重複の削除
・サブクラスでのフックハンドラ処理修正
・Viewオブジェクトの実行方法修正
※これはViewオブジェクトハンドリングの自由度をました反面、
ユーザからの取り回しが煩雑になったかもしれませんね・・

[Modelクラス]
・継承関係の見直し、ItemBaseクラスの導入などです・・
省10
307: 2008/02/09(土)10:20 ID:??? AAS
フレームワークのメリットとデメリットにおいて、なるべく具体例を書いた形でまとめてみた。

【メリット】
1.ビューとロジックの切り分けが出来る。(共同作業時に便利)
 外部リンク[html]:www.atmarkit.co.jp
2.定型的なコードを何度も書かなくてよくなる。
 例えば、ASP.NETでは、POSTの値を取得して・・・などの事を考えなくて良い。
 テキストボックスやボタンも、画面にドラッグするだけ。
3.ソースコードが自動的にフレームワークの規約に従った記述方法となり、
全体的な処理構成が把握しやすく、メンテナンスが楽になる。
 例えば、構造化プログラミングならば、まず全体構成(どの関数がどんな役割を
省16
308
(1): 2008/02/09(土)11:01 ID:??? AAS
QA方式で書いてみた。

Q:どんな時にフレームワークを使った方がいいの?
・短期間で仕上げなければならない時(この場合はフレームワークの使い方を把握しているのが前提)
・チームで分担してシステムを組む時
・バージョンアップを行うなど、長期的な運用が想定される時

Q:フレームワークがあまり向かない場合は?
・個人で小規模アプリを組む時。(一度組んで終わりの場合など)
・そのアプリの全体構成をすみずみまで把握しておきたい場合
・サーバの移植を想定しなければならないなど、環境があまり固定出来ない場合
このような状況の場合は、クラスライブラリの使用を検討すると良い。
309
(1): 2008/02/09(土)11:18 ID:??? AAS
何かフレームワークを使ったとして、そのフレームワークがいつまでメンテされるか
判らないことを考えると、バージョンアップをするようなアプリの開発に向いていると
いえるかどうかは、かなり怪しいと思う。
310: 2008/02/09(土)11:25 ID:??? AAS
>>309
そういうケースもあるから入れるか迷ったんだよね・・・
だけど、現在の比較的規模の大きなアプリは何らかのフレームワークで
組まれている事実があるということで、書いてみた。
フレームワークのメンテが突然打ち切られるケースは無いと見ても
良いと思うけどね。事前に何らかのアナウンスがあるはず。

で、フレームワークそのものを入替える必要が生じた時は、もちろん
全部作り直しになるが、この労力は、フレームワークを使わない場合に
比べて楽だよね。という意見です。
311: 2008/02/09(土)12:20 ID:??? AAS
書いてみた、とかって適当かつ無責任な
312: 2008/02/09(土)12:23 ID:??? AAS
完璧な文章がいきなりかけるわけないんだから修正しながらでいいと思う。
適当だの無責任だのいうのなら、このスレに来なくて良いと思う。
313: 2008/02/09(土)12:32 ID:??? AAS
ひょっとして、つられた?
314: 2008/02/09(土)15:20 ID:??? AAS
つんでれた
315
(1): 2008/02/09(土)15:25 ID:??? AAS
>>308
> Q:フレームワークがあまり向かない場合は?
> ・そのアプリの全体構成をすみずみまで把握しておきたい場合
全体構成を隅々まで把握してなんの意味があるのだろうか?
どうせ数日たったら忘れるんだし。

> ・サーバの移植を想定しなければならないなど、環境があまり固定出来ない場合
> このような状況の場合は、クラスライブラリの使用を検討すると良い。

PHP4、PHP5両対応のフレームワークもあるし、
いろんなデータベースに対応している場合もある。

フレームワークの開発というのは、そもそもが環境が固定されていないので
省1
1-
あと 579 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.029s