[表示 : 全て 最新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^)/

2 名前:nobodyさん mailto:sage [2007/02/23(金) 13:38:15 ID:???]
初心者にもわかるようにメリットぐらいかいてよ・・。

3 名前:nobodyさん mailto:sage [2007/02/23(金) 13:41:55 ID:???]
インスタンスとインヘリタンスがまぎわらしい(なぜか変換・・・

4 名前:1 ◆SWtzLesEmM mailto:age [2007/02/23(金) 13:42:26 ID:???]
オブジェクトと関数の本質的な違いと使い分け
ttp://d.hatena.ne.jp/toku-hiro/20060826

var とか this って何だ?
ttp://d.hatena.ne.jp/toku-hiro/20060902

アクセサメソッド
ttp://d.hatena.ne.jp/toku-hiro/20061022

継承、 オブジェクトコンポジション
ttp://d.hatena.ne.jp/toku-hiro/20061129
ttp://d.hatena.ne.jp/toku-hiro/20061203


5 名前:1 ◆SWtzLesEmM mailto:age [2007/02/23(金) 13:51:33 ID:???]
>>2
ttp://d.hatena.ne.jp/toku-hiro/20060826
この説明見てなるほどな〜〜〜!と思いました^^

>(1) オブジェクトと関数の本質的な違いと使い分け
>コーディング上の本質的な違いは「変数を保持できるか否か」に尽きます!
>関数を定義するときには、(グローバル変数を除き)引数として関数の外部から渡し、return で返すことしかできませんが、クラスは内部で変数を定義でき、クラスの実体のオブジェクトはどこからでも内部変数を引き出すことができます。
>定義関数の return であれもこれも返したいのにうまく返せず、煩雑な配列に格納して返す…といったことが減ると思います。
>あれもこれも引数として渡したいとき、または、あれもこれもreturnしたいときは、関数よりクラスの方が遥かに簡単です。

「クラス」という仕組は便利そうですね。クラスを考えた奴、偉い!


6 名前:1 ◆SWtzLesEmM mailto:age [2007/02/23(金) 13:54:53 ID:???]
>>3
なんかプログラミングって、カタカナ用語がたくさん登場しますよね><
クラスって聞いたら学校の「教室」を連想しちゃう><


7 名前:nobodyさん mailto:sage [2007/02/23(金) 15:12:49 ID:???]
Webでオブジェクト指向
pc10.2ch.net/test/read.cgi/php/1133489897/

こっちじゃ何故駄目なんだ?

8 名前:nobodyさん mailto:sage [2007/02/23(金) 16:25:04 ID:???]
>>1
>>5
自作自演乙w


9 名前:nobodyさん mailto:sage [2007/02/23(金) 16:52:36 ID:???]
トリップ出してるのに自作自演もくそもあるのかw

10 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/23(金) 19:44:43 ID:???]
>>7
>Webでオブジェクト指向
>pc10.2ch.net/test/read.cgi/php/1133489897/
>こっちじゃ何故駄目なんだ?

そっちも参考に眺めています。
あと、プログラマー板にもあるオブジェクト指向関係のスレもちょっと眺めています。

PHPに的を絞った情報が欲しいので、専用のスレを立ててみました。
もちろん、JavaやRuby、Pythonとかも使えればいいけど、そこまで手を広げる時間がないので、とりあえず今の段階ではPHPで勉強。
PHPを使っていて、オブジェクト指向プログラミングのやり方を勉強したい人がいたら一緒に勉強していきましょう。
よろしく(・∀・)



11 名前:nobodyさん mailto:sage [2007/02/23(金) 21:14:52 ID:???]
>>9
ちげーよ
自分のサイトの宣伝して
「この説明見てなるほどな〜〜〜!と思いました^^」
と書いてるところがだよ

12 名前:nobodyさん mailto:sage [2007/02/23(金) 21:34:47 ID:???]
>>11
OOPのメリット聞かれたから自分で見つけた参考サイト出して自分の所感言っただけだろ。
聞くだけで何もしない厨より、アクティブな>>1に好感が持てたが。

って擁護すると自演って言うのかな?

13 名前:nobodyさん mailto:sage [2007/02/23(金) 22:38:47 ID:???]
まあ、PHPでOOPなんてのは、今までて来たtoku-hiroさん以外にも
書いている人は多そうだから(俺は知らないけど)
他のも出せば、>>1の疑いは晴れるんじゃないかな。

14 名前:1 ◆SWtzLesEmM mailto:age [2007/02/23(金) 23:18:48 ID:???]
Googleで「PHP オブジェクト指向」を検索
www.google.co.jp/search?q=PHP+%83I%83u%83W%83F%83N%83g%8Ew%8C%FC

よさげなサイトをピックアップしてみよう!

15 名前:1 ◆SWtzLesEmM mailto:age [2007/02/23(金) 23:23:43 ID:???]
PHPのオンラインマニュアルがよくまとまってますねw(当たり前?)

jp2.php.net/zend-engine-2.php
第19章 クラスとオブジェクト (PHP 5)

16 名前:1 ◆SWtzLesEmM mailto:age [2007/02/23(金) 23:49:00 ID:???]
www.mogurin.net/index/php.obj.inc.html
PHP4のOOPについて、簡単な説明がありました。

PHP5のOOPは、PHP4のOOPに変更が加えられているので、ちょっと違う部分があります。

17 名前:1 ◆SWtzLesEmM mailto:age [2007/02/24(土) 00:03:56 ID:???]
PHP4のオブジェクト指向、デザインパターンについての説明がありました。
www.aglabo.com/agl/proevo/PHP/objectbrain/4-composite2.html

PHP5のオブジェクト指向について説明がありました。
www.doyouphp.jp/php5/

オブ脳 in PHP
www.aglabo.com/agl/proevo/PHP/objectbrain/
「委譲」などの説明がありました。

今の段階では、ちょっとよく理解できませんでしたがこんな話もあるんですね。

18 名前:nobodyさん mailto:sage [2007/02/24(土) 00:47:36 ID:???]
初心者のおれも学習するから講義すすめてくれ

19 名前:nobodyさん mailto:sage [2007/02/24(土) 01:05:02 ID:???]
>>18
わかった。

オブジェクトの
オブとはすなわち飯富。飯富厩舎所属だということ。

オブジェクトの
ジェクトトはすなわちジェクト。FF10のジェクトだということ。



20 名前:nobodyさん mailto:sage [2007/02/24(土) 13:35:58 ID:???]
オブジェクトを利用すると何がいいのか一言でまとめて



21 名前:nobodyさん mailto:sage [2007/02/24(土) 13:43:25 ID:???]
プロとしての自信が持てるようになります

22 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/24(土) 16:26:54 ID:???]
とりあえず簡単なWEBアプリケーションを作りながらOOPの勉強をしてみたいです。
OOPで掲示板を作ってみたいです。

(1)最初はOOPを使わないで掲示板を作ってみる
(2)次にOOPで同じ掲示板を作ってみる
という流れにすると、対比によってOOPが理解しやすくなるでしょうか?
=始めに完成形ありきと。

23 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/24(土) 16:34:22 ID:???]
掲示板の機能としては、

(1)名前とタイトルと本文を入力&投稿できる。
(2)投稿の一覧(タイトル+投稿日時)が表示できる。
(3)投稿の詳細内容(1つ1つの投稿を個別に閲覧)が表示できる。

という最低限の機能で作ってみて、
後から徐々に機能を追加して拡張してみましょう。

24 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/24(土) 16:45:34 ID:???]
データベースは普段MySQLを使ってます。
文字化け対策が面倒くさいので、文字コードはUTF-8(UTF-8N)にしときます。

テーブル名は、message
カラムは、
message_id (int not null auto_increment) ←主キーにする
name (text)
title (text)
message (text)
create_date (datetime または年月日時分秒の14桁でvarchar(14))
の5個にしてみましょう。

テーブル名やカラム名の付け方は、
複数形(messages)と単数形(message)のセットで命名したりとか、
主キーは単に「id」としておく方が分かりやすいでしょうか?

ラーメンの具でメンマが9切れのっているか10切れのっているかという違い…些細なことはどうでもいいか。


25 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/24(土) 16:53:26 ID:???]
MySQL5.0で、phpMyAdminを使って、oop_testというデータベースを1個新設しました。
その中にテーブルを1個作りました。

CREATE TABLE `message` (
`message_id` int(11) NOT NULL,
`name` text,
`title` text,
`message` text,
`create_date` datetime default NULL,
PRIMARY KEY (`message_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

日付はとりあえずdatetime型にしておきました。
MySQL4.0を使っている人は、上記のSQL文から「DEFAULT CHARSET=utf8」という句を削らないとエラーになると思います。

26 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/24(土) 17:00:26 ID:???]
画面は、>>23の(1)〜(3)の3画面を用意すればOKかな?
画面(ハリボテ)を先に作ってみて、それにプログラムを付けて動くようにしてみます。

(1)入力ページ input.php
(2)一覧ページ list.php
(3)詳細ページ message.php

itpro.nikkeibp.co.jp/article/COLUMN/20070214/261859/
「HTML画面をそのまま仕様書に」,5カ月で1000画面を構築した就職サイトPuffの高速開発手法


27 名前:nobodyさん mailto:sage [2007/02/24(土) 18:52:22 ID:???]
wktk

28 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/24(土) 20:07:40 ID:???]
>>25
主キーをオートインクリメント(連番の)の設定にしておくのを忘れてました。orz

CREATE TABLE `message` (
`message_id` int(11) NOT NULL auto_increment,
`name` text,
`title` text,
`message` text,
`create_date` datetime default NULL,
PRIMARY KEY (`message_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


29 名前:nobodyさん mailto:sage [2007/02/25(日) 02:57:19 ID:???]
サンプルページ公開して

30 名前:2 mailto:sage [2007/02/25(日) 16:11:09 ID:???]
定番のhelloを表示w
class hello {
var $aisatu = "こんにちは";
}

$re = new hello();
$aisatu = $re->aisatu;
echo $aisatu;

読み図ら買ったら適当に改行して



31 名前:2 mailto:sage [2007/02/25(日) 16:19:08 ID:???]
#オブジェクト学校のhelloクラスを作る
class hello {


#このクラスに生徒である$aisatu君がいる
#彼に「こんにちは」という言葉を覚えさせる
var $aisatu = "こんにちは";


#放課後なので括弧で閉じる
}




#クラスの風景を覗くための魔法
$re = new hello();


#生徒$aisatu君に「こんにちは」を言わせるための魔法を矢で飛ばす。
#魔法で生徒$aisatu君の$は壊れてしまい、以下のような記述になる。。
$aisatu = $re->aisatu;


#魔法にかかった生徒挨拶君をおまえらのディスプレイに召還する。
echo $aisatu;

32 名前:nobodyさん mailto:sage [2007/02/26(月) 16:35:48 ID:???]
コードの解説なんてしなくても見ればわかる。
「なぜOOP」か、だとか、
こういう場合にOOPが役立つ、というのを具体的なコードで示してくれ

33 名前:nobodyさん mailto:sage [2007/02/26(月) 18:41:14 ID:???]
namespace は結局 PHP5 では実装されなかったんだね・・・・
悲しい。悲しすぎる。

34 名前:nobodyさん mailto:sage [2007/02/26(月) 23:07:07 ID:???]
MVCのMをOOPでCは手続きVはテンプレート

35 名前:1 ◆SWtzLesEmM mailto:age [2007/02/27(火) 15:21:07 ID:???]
>>22 (1)最初はOOPを使わないで掲示板を作ってみる
OOPを使わないで作った簡単な掲示板をアップしてみます。

>>26
ファイルは、他に掲示板のトップページと、DB接続関係のデータを入れたファイルを用意しました。
WEBサーバのルート直下にデプロイした場合を想定しています。

/index.html 掲示板のトップページ
/db.php データベースの接続関係のデータのファイル
/input.php メッセージ入力ページ
/list.php メッセージ一覧ページ
/message.php メッセージ詳細ページ

36 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:22:07 ID:???]
index.htmlの内容は以下の通りです。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>掲示板メニュー</title>
</head>
<body>
<h1>掲示板メニュー</h1>
<div id="menu">
<ul>
<li><a href="input.php">メッセージ入力</a></li>
<li><a href="list.php">メッセージ一覧</a></li>
</ul>
</div>
</body>
</html>


37 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:24:34 ID:???]
db.phpの内容は以下の通りです。

<?php
/**
* データベース
*/

//本番環境ドメイン名
define("DOMAIN", "xrea.com");//ドメイン名に含まれる文字列を指定

//MySQL設定(本番環境とテスト環境で切替え)
if (ereg(DOMAIN, $_SERVER['SERVER_NAME'])) {
//本番環境
define("DBSERVER", "localhost");
define("DBUSER" , "username");
define("DBPASSWORD", "password");
define("DBNAME", "oop_test");
} else {
//テスト環境
define("DBSERVER", "localhost");
define("DBUSER" , "test_username");
define("DBPASSWORD", "test_password");
define("DBNAME", "oop_test");
}

(以下、続く)

38 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:25:32 ID:???]
db.phpの続きです。

//MySQL接続関数
function db_connect() {
// MySQL 接続
$link = mysql_connect(DBSERVER, DBUSER, DBPASSWORD);
if (!$link) {
die('mysql_connect ERROR: ' . mysql_error());
}

// MySQL DB 選択
$db_selected = mysql_select_db(DBNAME, $link);
if (!$db_selected) {
die ('mysql_select_db ERROR: ' . mysql_error());
}

// MySQL 4.1以上 文字コードセット
mysql_query('SET CHARACTER SET utf8');

return $db_selected;
}

39 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:26:17 ID:???]
db.phpの続き(その2)です。

//MySQLプリペアードステートメント関数(SQLインジェクション対策)
//(参考)www.php.net/manual/ja/function.mysql-query.php#70686
function mysql_prepare($query, $phs = array()) {
$phs = array_map(create_function('$ph', 'return "\'".mysql_real_escape_string($ph)."\'";'), $phs);

$curpos = 0;
$curph = count($phs)-1;

for ($i = strlen($query) - 1; $i > 0; $i--) {
if ($query[$i] !== '?') {
continue;
}
if ($curph < 0 || !isset($phs[$curph])) {
$query = substr_replace($query, 'NULL', $i, 1);
} else {
$query = substr_replace($query, $phs[$curph], $i, 1);
}
$curph--;
}
unset($curpos, $curph, $phs);
return $query;
}
?>

40 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:30:07 ID:???]
input.phpの内容は以下の通りです。

<?php
/**
* メッセージ入力画面
*/

require_once("db.php");
db_connect();

//
$name = $_POST['name'];
$title = $_POST['title'];
$message = $_POST['message'];
$error_msg = "";

(以下、続く)



41 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:30:59 ID:???]
db.phpの続きです。

//入力値バリデート
if (0 < strlen($name) && 0 < strlen($title) && 0 < strlen($message)) {
//DB保存処理
$create_date = date("Y/m/d H:i:s");
$sql = "INSERT message SET
name = ? ,
title = ? ,
message = ? ,
create_date = ? ";
$phs = array($name, $title, $message, $create_date);//プレースホルダーにバインドする変数
$sql_prepare = mysql_prepare($sql, $phs);
$result = mysql_query($sql_prepare) or die('SQL Error: ' . mysql_error());
//ページ移動
if ($result == TRUE) {
$url = "".$_SERVER['HTTP_HOST']."/test2/list.php";//メッセージ一覧
header("Location: ".$url);
exit;
}
} else {
$error_msg = "名前、タイトル、メッセージをすべて入力してください。";
}
?>

42 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:34:29 ID:???]
>>41
間違えました。

>db.phpの続きです。
ではなくて、
「input.phpの続きです。」
でした。(・∀・)

あと、
>$url = "".$_SERVER['HTTP_HOST']."/test2/list.php";//メッセージ一覧
ではなくて、
$url = "".$_SERVER['HTTP_HOST']."/list.php";//メッセージ一覧
になります。

=ローカルでは、/test2というフォルダを作ってその中にいれていたので。
=本番環境では、ドキュメントルート直下を想定しているので、/test2/は不要

もう一回訂正してアップします。

43 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:40:30 ID:???]
>>41の訂正です。

input.phpの続きです。

//入力値バリデート
if (0 < strlen($name) && 0 < strlen($title) && 0 < strlen($message)) {
//DB保存処理
$create_date = date("Y/m/d H:i:s");
$sql = "INSERT message SET
name = ? ,
title = ? ,
message = ? ,
create_date = ? ";
$phs = array($name, $title, $message, $create_date);//プレースホルダーにバインドする変数
$sql_prepare = mysql_prepare($sql, $phs);
$result = mysql_query($sql_prepare) or die('SQL Error: ' . mysql_error());
//ページ移動
if ($result == TRUE) {
$url = "".$_SERVER['HTTP_HOST']."/list.php";//メッセージ一覧
header("Location: ".$url);
exit;
}
} else {
$error_msg = "名前、タイトル、メッセージをすべて入力してください。";
}
?>

(以下、続く)

44 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:42:00 ID:???]
input.phpの続き(その2)です。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>メッセージ入力</title>
</head>
<body>
<h1>メッセージ入力</h1>
<div id="menu">
<ul>
<li><a href="input.php">メッセージ入力</a></li>
<li><a href="list.php">メッセージ一覧</a></li>
</ul>
</div>
<?php echo $error_msg; ?>
<div id="input">
<form name="form_input" method="post" action="input.php">
<div id="name">名前<br>
<input type="text" name="name" value="<?php echo htmlspecialchars($name); ?>">
</div>
<div id="title">タイトル<br>
<input type="text" name="title" value="<?php echo htmlspecialchars($title); ?>">
</div>
<div id="message">メッセージ<br>
<textarea name="message"><?php echo htmlspecialchars($message); ?></textarea>
</div>
<input type="submit" name="submit" value="送信">
</form>
</div>
</body>
</html>

45 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:44:03 ID:???]
list.phpの内容は以下の通りです。

<?php
/**
* メッセージ一覧画面
*/
require_once("db.php");
db_connect();

//
$page = intval($_GET['page']);
$max = 10;//1ページ当たりの最大表示件数

//ページング(ページ数は1から数える)
$sql = "SELECT count(*) AS total FROM message";
$result = mysql_query($sql) or die('SQL Error: ' . mysql_error());
if ($result) $row = mysql_fetch_array($result);
$total = $row['total'];//全メッセージ数
$page_total = ceil($total / $max);//全ページ数
if ($page < 1) $page = 1;
if ($page_total < $page) $page = $page_total;

//メッセージ取得
$sql = "SELECT * FROM message ORDER BY create_date DESC LIMIT ".(($page - 1) * $max) .",".$max;
$result = mysql_query($sql) or die('SQL Error: ' . mysql_error());
?>

46 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:45:25 ID:???]
list.phpの続きです。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>メッセージ一覧</title>
</head>
<body>
<h1>メッセージ一覧</h1>
<div id="menu">
<ul>
<li><a href="input.php">メッセージ入力</a></li>
<li><a href="list.php">メッセージ一覧</a></li>
</ul>
</div>
<div id="paging">
<?php
//ページング処理
echo "全".$total."件";
echo "(ページ".$page."目)";
for ($i = 1; $i <= $page_total; $i++) {
echo "<a href='list.php?page=".$i."'>".$i."</a> ";
}
?>
</div>

47 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:46:10 ID:???]
list.phpの続き(その2)です。

<table border="1" cellpadding="5">
<tr bgcolor="#FFFF99">
<td>タイトル</td>
<td>投稿者名</td>
<td>投稿日</td>
</tr>
<?php
//メッセージ一覧
while ($rows = mysql_fetch_array($result)) {
echo "<tr>";
echo "<td><a href='message.php?message_id=".htmlspecialchars($rows['message_id'])."'>".htmlspecialchars($rows['title'])."</a></td>";
echo "<td>".htmlspecialchars($rows['name'])."</td>";
echo "<td>".htmlspecialchars($rows['create_date'])."</td>";
echo "</tr>";
}
?>
</table>
</body>
</html>

48 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:47:39 ID:???]
message.phpの内容は以下の通りです。

<?php
/**
* メッセージ詳細画面
*/
require_once("db.php");
db_connect();

//
$message_id = intval($_GET['message_id']);

//メッセージ取得
$sql = "SELECT * FROM message WHERE message_id = ?";
$phs = array($message_id);//プレースホルダーにバインドする変数
$sql_prepare = mysql_prepare($sql, $phs);
$result = mysql_query($sql_prepare) or die('SQL Error: ' . mysql_error());
if ($result) {
$row = mysql_fetch_array($result);
}
?>

49 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:49:23 ID:???]
message.phpの続きです。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>メッセージ詳細</title>
</head>
<body>
<h1>メッセージ詳細</h1>
<div id="menu">
<ul>
<li><a href="input.php">メッセージ入力</a></li>
<li><a href="list.php">メッセージ一覧</a></li>
</ul>
</div>
<table border="1" cellpadding="5">
<tr>
<td bgcolor="#FFFF99">投稿者名</td>
<td><?php echo htmlspecialchars($row['name']); ?></td>
</tr>

50 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:50:12 ID:???]
message.phpの続き(その2)です。

<tr>
<td bgcolor="#FFFF99">投稿日</td>
<td><?php echo htmlspecialchars($row['create_date']); ?></td>
</tr>
<tr>
<td bgcolor="#FFFF99">タイトル</td>
<td><?php echo htmlspecialchars($row['title']); ?></td>
</tr>
<tr>
<td bgcolor="#FFFF99">メッセージ</td>
<td><?php echo nl2br(htmlspecialchars($row['message'])); ?></td>
</tr>
</table>
</body>
</html>



51 名前:1 ◆SWtzLesEmM mailto:sage [2007/02/27(火) 15:59:41 ID:???]
それでは、次行ってみよう!
>>22 (2)次にOOPで同じ掲示板を作ってみる

>>34
PHPコードとHTML表示を一緒にしてありますが、OOPではテンプレートシステムを使って、PHPコードとHTML表示部分を分離して、MVCにしてみたいです。

どういうクラスを作ればいいのか良く分かりません><

(1)コントローラー(+アクション)→input、list、message
(2)モデル→データベース接続処理も1つのクラスにするのでしょうか?
(4)ビュー→テンプレートシステムへの出力
というかんじで3個のクラスが必要でしょうか?
それぞれのクラスに必要なプロパティとメソッドを何にするか?
クラスを考えて、UMLでクラス図を作ってみたいです。

52 名前:nobodyさん mailto:sage [2007/02/27(火) 22:54:58 ID:???]
がんばってるなあ。
おれもがんばろう。

53 名前:nobodyさん mailto:sage [2007/02/28(水) 03:12:15 ID:???]
わかりにくいからWebサイトにまとめてくれ。PHP使いなんだし

54 名前:1 ◆SWtzLesEmM mailto:age [2007/02/28(水) 20:49:38 ID:???]
>>53
まとめサイトを設置しました。
ttp://kameleon.s241.xrea.com/dokuwiki/doku.php


55 名前:nobodyさん mailto:sage [2007/02/28(水) 22:48:34 ID:???]
最終的にMVCな構成を目標に
少しずつリファクタリングしていけばよいと思う

とりあえずDBアクセスを一箇所にまとめるモデルを作ってみるといいんじゃない
・全件取得
・1件取得
・1件追加
できるMessageクラスとかを作ってそこにDBアクセス(SQL)をまとめれ

56 名前:nobodyさん [2007/03/03(土) 13:53:29 ID:Ej/v+KpC]
期待上げ

57 名前:nobodyさん [2007/03/04(日) 04:17:32 ID:xhaosu8B]
期待

58 名前:nobodyさん mailto:sage [2007/03/11(日) 11:30:29 ID:???]
OOP勉強したいなら、実力不足のやつが書いたガラクタ掲示板スクリプトを
読むより、有名なオープンソースのスクリプトを読めばいいじゃん。
そもそも>>1の意味不明な独善なんかに付き合わなくてもOOPに関する情報
はいくらでも手にはいるし。

59 名前:nobodyさん mailto:sage [2007/03/11(日) 23:56:02 ID:???]
ど素人に肥大したコードを読ませて理解できると思ってる思考回路がカコイイ!

60 名前:nobodyさん [2007/03/12(月) 08:27:35 ID:cm9vlrfS]
>>59
ど素人はみんな、自分みたいな学習意欲も向上心もない人間だと思ってる
思考回路がカコイイ!



61 名前:nobodyさん mailto:sage [2007/03/12(月) 09:16:45 ID:???]
>>60 思考回路がカコイイ!

62 名前:nobodyさん mailto:sage [2007/03/12(月) 09:57:59 ID:???]
>>59-61
全員カコワルイ!! 俺はカコイイ!!

63 名前:nobodyさん mailto:sage [2007/03/12(月) 13:37:56 ID:???]
>>1-62
全員カコイイ!!
俺はカコワルイ!!

64 名前:nobodyさん mailto:sage [2007/03/12(月) 14:07:03 ID:???]
で、結局荒れ放題になり>>1の独善は無事終了したのだった。
ちゃんちゃん。

65 名前:1 ◆SWtzLesEmM mailto:age [2007/05/12(土) 03:12:14 ID:???]
>>55
DBにアクセスするためのクラスを作ろうと思って、とりあえずdb.phpをクラスの形に変えてみようと試みました。
だけど、コンストラクタでエラーが出てストップ!
Fatal error: Cannot access empty property in /…/test.php on line 18

なんでエラーになるのか?よく分からなくて、PHP5のコンストラクタについて調査していたら、サンプルになりそうなDBクラスの解説記事がありました。
www.bnote.net/php/php/09_db_class.shtml
↑これをソックリ真似すれば、DBクラスは何とかなるかな?

ところで、このbnoteというサイトのPHP解説記事には、掲示板を作ってみるサンプルがあり、参考になりそうです。
www.bnote.net/php/php_idx.shtml
>PHPでフォーラムを作ろう!


66 名前:nobodyさん mailto:age [2007/05/12(土) 16:09:18 ID:???]
中傷されている>>1だが、
普通に>>1のおかげでだいぶいい情報が手に入った。
曖昧だったクラスがなんとか分かりそうだよ。
ありがとー
PHPでわからない人は情報が足りないのかもな。
似てるJAVAで本格的なものを見てみると分かるのかも。

昔、歴史で年表同士のつながりが薄くて分かりづらかったように、
もっと詳しく高校の歴史くらいのをみれば分かりやすい。

67 名前:nobodyさん [2007/05/12(土) 23:32:04 ID:s118dfiw]
なんていうか「こういうときにはこういう設計をします」っていう
具体的な情報がほしいよな
俺は車なんかプログラミングしないっての

68 名前:nobodyさん [2007/05/14(月) 00:46:15 ID:4QCW9ZwU]
最近ちょっとだけ解ってきた。

なぜOOPなのかと言えば
再利用とメンテナンス、拡張がやりやすい(やりやすく作ることが出来る)ということがすごくて、
そのためにカプセル化とポリモーフィズムがあって
ポリモーフィズムを実現(保証)するために継承や、インターフェイスや抽象クラスがあるって感じなのかな?

PHPによるデザインパターンは読んでみても良いと思う。
あと、ゼンドフレームワーク勉強用にZFで動くブログソフトみたいのあるから、それの仕組みと、ZFのソース(全部はきついけど関係あるところだけ)
を見てみると、結構勉強になると思う。
ttp://www.itmedia.co.jp/enterprise/articles/0702/28/news028.html
ttp://www.itmedia.co.jp/enterprise/articles/0703/05/news013.html
ttp://www.itmedia.co.jp/enterprise/articles/0703/08/news018.html
記事がちょっと古いから最新バージョンと微妙に違うけど。

まあ、このフレームワークが良いか悪いかは別にして(まだベータだし)
OOPバリバリなので、勉強になること間違いなし!

69 名前:nobodyさん mailto:sage [2007/05/15(火) 15:55:34 ID:???]
しかし PHP関連の本でOOPをわかりやすく書いてあるのが



「ない!」 お勧め教えて

70 名前:nobodyさん mailto:sage [2007/05/15(火) 16:01:33 ID:???]
本なんか読むよりPEARやフレームワークのソース読んで
勉強しながら自分なりに書いていけ、金かからないしだしそれが一番の近道
気が付いたらOOPなんて空気のように有って当たり前になるもんだから



71 名前:nobodyさん mailto:sage [2007/05/15(火) 16:06:06 ID:???]
わかりにくいの例として

スコープ演算子(static ::)は2冊読んでもチンプンカンプン
そこでぐぐる先生に聞くと

homepage3.nifty.com/gomi_doji/scopen.htm
PHPではないが、ナルホドナルホドと理解できる

オブジェクト指向の概要も
phpspot.net/php/pg%83I%83u%83W%83F%83N%83g%8Ew%8C%FCPHP.html
を読むとナルホドナルホドだが、本は意味不明になる

糞った本しか読んでいないかもしれないが一応書いておく
「PHP5プログラミング エキスパート編」 //最強の意味不明
「MySQL4/PHP5によるWebデータベース構築」 //わかりやすいがODPの章になると意味不明

72 名前:nobodyさん mailto:sage [2007/05/15(火) 16:08:18 ID:???]
書きながら次第にむかつき度が増加して誤字だらけになった(怒

>>70
それ疲れる

73 名前:nobodyさん mailto:sage [2007/05/15(火) 17:01:49 ID:???]
>>69
独習PHPのクラスらへんの説明は中々分かりやすいよ。
作者があまりいいとはいえんが、ファーストステップにはいい感じ。


74 名前:nobodyさん mailto:sage [2007/05/22(火) 15:14:54 ID:???]
同じ事を色々な言葉で表現するから迷うずら
PHPの本読むよりJAVAの本読んだほうが理解できる罠。

75 名前:nobodyさん mailto:sage [2007/05/28(月) 14:46:00 ID:???]
自分が作るだけなら手続き型でいいけど
人の作ったライブラリ使いたいから
最低限、何が書いてあって何をしているのか読めるようになりたい

76 名前:nobodyさん mailto:sage [2007/05/29(火) 05:34:16 ID:???]
答えが出てるじゃないか。その使いたいライブラリのコードを読め

77 名前:nobodyさん [2007/06/05(火) 12:23:56 ID:/w569Zaf]
OOPS

78 名前:nobodyさん mailto:age [2007/06/05(火) 19:15:58 ID:???]
XOOPS

79 名前:nobodyさん [2007/06/11(月) 22:06:39 ID:2dWIuVC4]
>>65に誰もつっこまないのかよ!!

DBアクセスの為のクラス書くのかw
おそらくPHPインストール時に君のHDDの中にすでに入ってる訳だが…
しかもあらゆるDBに同じ書式でアクセス出来るやつが…


80 名前:nobodyさん mailto:sage [2007/06/11(月) 23:45:37 ID:???]
>>79
なんてやつ?



81 名前:nobodyさん mailto:sage [2007/06/12(火) 00:15:06 ID:???]
PEARのソースは読まない方が身のため

82 名前:nobodyさん [2007/06/12(火) 06:55:41 ID:e4tfCBN5]
79は勘違いしてるが、彼がいいたいのはPearのDBクラスのことだろう

83 名前:nobodyさん mailto:sage [2007/06/12(火) 09:31:07 ID:???]
82が勘違いだろ。
単にPDOだろ

84 名前:1 ◆SWtzLesEmM mailto:age [2007/06/12(火) 10:24:12 ID:???]
>>73
情報提供どうもありがとうございます。
独習PHPは、図書館でかりて読んでみました。
オブジェクト構文の説明は分かりやすいと思いました。

>>79
DBにアクセスするクラスも勉強のため練習で作ってみようと思いました。
その次に、O/Rマッパーの使い方を練習してみることになるでしょうか?

>>82
PHP5に標準で用意されているPDOのことですね。
jp2.php.net/pdo
PHP Data Objects (PDO) 拡張モジュールは、 PHP の中からデータベースにアクセスするための軽量で高性能な インターフェイスを定義します。
PDO は PHP 5.1 以降にバンドルされており、PHP 5.0 では PECL 拡張モジュールとして使用可能です。
PDO は PHP 5 の新機能である オブジェクト指向機能を使用しており、それより前のバージョンの PHP では動作しません。


85 名前:nobodyさん mailto:sage [2007/06/12(火) 10:56:05 ID:???]
mysqliとどっちがいい?

86 名前:nobodyさん mailto:sage [2007/06/12(火) 17:53:32 ID:???]
ふとおもったんだが、>>1はできるんじゃないのか。

87 名前:nobodyさん mailto:sage [2007/06/17(日) 01:20:06 ID:???]
被害者増やさないように書いておく。
「PHPデザインパターン入門」は買うな。

最近買った中で最低レベルの悪書。

どっかの英語ページを機械翻訳したようなトンチンカンな用語説明にまじって
何故かApacheとPHPのインストール方法だけが丁寧な日本語で書かれている。
あとはデザインパターン図が羅列してあるだけ。解説ほぼ無し。
3流大学生のコピペ論文を彷彿とさせる。
こんなの真剣に呼んでも絶対わかるようにはならない。

OOP用語の説明は何故かちゃんとしてないのに
php.iniにページさかれてるけど
網羅して無くて中途半端でページ稼ぎとしか思えない。

中身薄くて有名なヤマダヨウカン本の方がマシに感じるレベル。

88 名前:nobodyさん mailto:sage [2007/06/17(日) 01:28:20 ID:???]
なんか良く読むと、この本は解説の日本語が
オブジェクト指向で書かれてる気がした。

多分最初にパターン名を記載した時点で、作者の頭の中では
記載されてるページを呼び出してるんだろうと思えてきた。

解説するための日本語はプロシージャ指向で書いてくれと
小一時間問い詰めたい。

この本理解するには色んな本を買って、全部理解した後じゃないと
読めない。意味ねえじゃん。

89 名前:nobodyさん mailto:sage [2007/06/17(日) 01:54:28 ID:???]
軽いフレームワークいじって使うのが一番いいオブジェクト指向の勉強だよ

90 名前:nobodyさん mailto:sage [2007/06/17(日) 14:22:50 ID:???]
ウェブアプリにオブジェクト指向なんていらないよ。どうせ文字列を加工してデータベースのテーブルのカラムに並べるだけなんだから。



91 名前:nobodyさん mailto:sage [2007/06/17(日) 18:51:52 ID:???]
じゃどういうときに必須なんよ

92 名前:nobodyさん mailto:sage [2007/06/24(日) 17:09:42 ID:???]
オブジェクト指向と言う言葉にまどわされず、
クラスの勉強をすればいいんだよ。 

単に、呼び出してるだけだから。 

93 名前:nobodyさん mailto:sage [2007/06/24(日) 19:32:38 ID:???]
PEARをサンプルみながら見よう見まねでインスタンス作って
なんだかんだで実際動いてるんだけど何してるかイマイチ理解出来てないんだよね
functionの中でインスタンス作るとその外側ではやっぱアクセスできないのかな
PEARDBのインスタンスがあっちゃこっちゃに散らばっちゃって困る

94 名前:nobodyさん mailto:sage [2007/06/25(月) 12:32:57 ID:???]
>>93
プロパティに入れれ

95 名前:1 ◆SWtzLesEmM mailto:age [2007/07/06(金) 14:33:24 ID:???]
>>68
>拡張がやりやすい(やりやすく作ることが出来る)
そうみたいですね。
www.amazon.co.jp/dp/4822281957/
「オブジェクト指向でなぜつくるのか」
という本にも、クラスを使うメリットが同じように説明されていました。(・∀・)

>>74
Javaの本だと
www.amazon.co.jp/dp/4797331828/
「やさしいJava」をすすめられました。

>>86
(σ・Д・)σプログラミング初心者ですΣ(゚Д゚*)=3

>>89
Zend Frameworkの正式版が出ましたね☆
framework.zend.com/manual/ja/
シンプルなフレームワークを検索したら、CodeIgniterというのがありました。
userguide.cilab.info/


96 名前:nobodyさん [2007/07/08(日) 18:20:46 ID:XFKJF1H9]
最近このスレが怖くて見れん俺ガイル
なんでそんな成長早いんだよ・・・おかしいだろ・・・orz

97 名前:テレビできたよー [2007/07/10(火) 15:53:51 ID:ZIdzImz8]
class TV {
 var $channel;
 var $state;
 var $singleton;
 
 function TV() {
  $this->channel = 1;
  $this->state = false;
 }
 
 function on() {
  if(!$this->state) {
   $this->state = true;
   echo "電源オン<br />";
   $this->reflect();
  } else {
   echo "既に電源はオンになっています<br />";
  }
 }
 
 function off() {
  if($this->state) {
   $this->state = false;
   echo "電源オフ<br />";
  } else {
   echo "既に電源はオフになっています<br />";
  }
 }

98 名前:テレビできたよー [2007/07/10(火) 15:54:22 ID:ZIdzImz8]
 function reflect($c = null) {
  if($this->state) {
   if(!empty($c)) {
    $this->channel = $c;
   }
   
   echo $this->channel . " チャンネルを写します<br />";
  } else {
   echo "電源が入っておりません<br />";
  }
 }
}

$tv = new TV;
$tv->on();
$tv->reflect(8);
$tv->on();
$tv->on();
$tv->off();
$tv->off();
$tv->reflect(5);
$tv->on();


99 名前:nobodyさん mailto:sage [2007/07/11(水) 10:41:20 ID:???]
例外投げるようにすれば?

100 名前:1 ◆SWtzLesEmM mailto:age [2007/07/11(水) 12:59:29 ID:???]
例外処理
www.phppro.jp/word/E4BE8BE5A496E587A6E79086

2. PHPで例外処理
www.phppro.jp/phptips/vol45/eb49e8a31e9132d98a5a7db3df4663e4

PHP5の基本 > 例外処理
www.shigeweb.jp/php/project_p/?section=php5oop&page=exception

phpspot - 例外処理
phpspot.net/php/pg%97%E1%8AO%8F%88%97%9D.html

PHP4ではエラー処理といえば、
if ( ($err = func()) != "" ) {
  die("エラーです");
}
のように戻り値のチェックをしていましたが、エラーというものは、呼び出し側がエラー制御を行うのではなく、呼ばれた側で、どういうエラーがあったか、というものがあった方が自然で、呼ばれた側がエラー処理を行うため、モジュールの場合より再利用性が高くなるでしょう。
更に上記では、どういうエラーが起こってエラーが出ているのかということが想像しにくいですね。
そこで try〜catch です。

■例外処理
www.atmarkit.co.jp/flinux/special/php5/php5d.html
プログラミングにエラー処理は避けて通れない事項だ。
とはいえ、関数やメソッドからの戻り値を毎回エラーチェックするのは煩雑で面倒でもある。
その煩雑さを回避するため、文法として例外処理を持っている言語もある。
PHP5もそれに倣って、言語仕様として例外処理をサポートした。
文法的にはC++やJavaと同様に、try{ }で投げられた例外をcatch{ }で処理するという流れになる。

↑とのことですが、汎用性のある関数やメソッドにしたい場合、エラーが発生したときの処理を書く場所は、関数やメソッドを使う方(呼び出す側)にすることもあるでしょうか?
=戻り値をチェックするというのは、古いやり方なんでしょうか?




101 名前:1 ◆SWtzLesEmM mailto:age [2007/07/11(水) 13:07:20 ID:???]
>>96
PHPプロのメルマガ読んで、知ったかぶりなだけですw
お互いがんばりましょう☆(・∀・)


102 名前:nobodyさん mailto:sage [2007/07/11(水) 14:16:38 ID:???]
いやさ,まず公式マニュアルを読む癖を付けようぜ

103 名前:nobodyさん mailto:sage [2007/07/11(水) 14:44:53 ID:???]
MVCじゃないとOOPなんて意味ないですかr

104 名前:nobodyさん mailto:sage [2007/07/11(水) 17:30:14 ID:???]
( д)      ...。。

105 名前:nobodyさん mailto:sage [2007/07/12(木) 02:57:31 ID:???]
MVCもデザインパターンの一種じゃなかったっけ?

106 名前:nobodyさん mailto:sage [2007/07/12(木) 08:06:18 ID:???]
>>100
なんかphpspotのその文はおかしいな。
エラー処理は例外を使おうがそうじゃなかろうが変わらない。
呼ばれた側はどういうエラーがあったか返す責任があるし、
呼んだ側は返ってきたエラーをチェックする責任がある。
エラーが起きた時の挙動を自分で決めれるならその場で処理すれば良いし、
そこではまだ決められないならさらに上位へreturnなりthrowすれば良い。



107 名前:nobodyさん [2007/07/14(土) 15:28:38 ID:w3CTKtks]
OOPってのはアプリケーションをモノに見立てて、それを構成している部品をクラスとして定義する、ってとこまではなんとなく理解した。

例外処理?なにそれうまいの?

108 名前:nobodyさん mailto:sage [2007/07/14(土) 18:34:23 ID:???]
ダンボールの味がするお

109 名前:nobodyさん mailto:sage [2007/07/14(土) 19:32:25 ID:???]
おまいらオブジェクト指向に騙されてるよ。ただのデータ型に過ぎない。

110 名前:nobodyさん [2007/07/14(土) 19:46:31 ID:w3CTKtks]
今、習作としてプロフィールスクリプト(っていうのも大袈裟なぐらいショボイやつ)を書いてるんだけど、どうにも悩む。悩む。
とりあえず、
-質問と答え(Entry)
--セッタ(SetQuestion,SetAnswer)
--ゲッタ(GetQuestion,GetAnswer)
-それらのEntryを編集したり、操作したりする(ManageEntry)
--POSTされたデータにEntryの値を変更する(EditEntry)
-プロフィール自体(Profiel)
--質問と答えを出力(ViewProfiel)
こんなクラスたちを作ったんだけどなんかおかしい気がしてならない。
とくにManageEntryのとことか。
ManageEntryでEntryオブジェクトの配列Entriesを作っといてそれをそのクラス内で操作とか?は?え?
OOPムズイ、ナキタイ


スレ汚しスマソ



111 名前:nobodyさん mailto:sage [2007/07/14(土) 21:29:40 ID:???]
どんな物を作ってるのかよく分からないけど
ぱっと見で確実に言える事は、個別のクラスが多すぎ。
半分くらい継承とメソッドの追加で済みそう。
今のままだと拡張もやり難そう。

プロフィールが"profiel"なのはつっこんだ方が良いのかな。

CakeとかSynfonyみたいな、ライブラリじゃないフレームワークを
使い込んでソース読んだら、どう設計したらよいか一気に分かるよ。

112 名前:nobodyさん [2007/07/14(土) 22:22:33 ID:w3CTKtks]
継承とメソッドの追加ってどうやるんですか><;
正直どうやったらいいのか全くわからん。
プロフィール?え?あ?あはあは。

113 名前:nobodyさん mailto:sage [2007/07/15(日) 00:13:47 ID:???]
きめぇ

114 名前:nobodyさん mailto:sage [2007/07/15(日) 00:19:07 ID:???]
Synfony はつっこんだ方(ry

115 名前:1 ◆SWtzLesEmM mailto:age [2007/07/26(木) 10:21:49 ID:???]
>>106
>呼ばれた側はどういうエラーがあったか返す責任があるし、
>呼んだ側は返ってきたエラーをチェックする責任がある。

なるほど〜(・∀・)
呼ぶ側と呼ばれた側のそれぞれでエラーの対処があれば、手堅いですね!
大変参考になりました。


116 名前:1 ◆SWtzLesEmM mailto:age [2007/07/26(木) 10:29:09 ID:???]
掲示板の続きを作りました。
DBにアクセスする機能をクラスにしてみました。
kameleon.s241.xrea.com/dokuwiki/doku.php?id=%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%A7%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B

動作サンプル
kameleon.s241.xrea.com/oop/bbs2/index.php

なんか、>>55さんのアドバイスの形になってませんが…orz
とりあえず、DBアクセスをクラスの形にできたので一歩前進!!!\(^o^)/

117 名前:1 ◆SWtzLesEmM mailto:age [2007/07/26(木) 10:50:37 ID:???]
>>110
おー、ガンバレ〜〜〜☆

>>111
(1) Entryクラス
文章を「書き込む」メソッド、「読む」メソッド、「書き換える(編集)」メソッド、「削除する」メソッドが用意されている。

(2) Entryクラスを継承して、質問用のクラスを用意
=質問のデータだけを操作できる

(3) Entryクラスを継承して、答え用のクラスを用意
=答えのデータだけを操作できる

というかんじになるんでしょうか?
どういうまとまりでクラスにすればいいのか、そこら辺がなんかよく分からないんですよねー(ノ∀`)


118 名前:nobodyさん mailto:sage [2007/07/26(木) 10:57:58 ID:???]
どうしてPDOをry

119 名前:nobodyさん mailto:sage [2007/07/27(金) 00:44:20 ID:???]
おんにゃにょこの
おっぱい
ぷぴにぷにだにょ〜

120 名前:nobodyさん mailto:sage [2007/07/28(土) 17:35:02 ID:???]
夏だな



121 名前:nobodyさん mailto:sage [2007/07/30(月) 03:51:10 ID:???]
function &foo {
echo "ほげ"


こういうやつ、「リファレンスを返す」っていうんですか?
これはどういう処理をしているんでしょうか?
どこかで定義されているfoo()という関数に何かしているんですか?

122 名前:nobodyさん mailto:sage [2007/07/31(火) 07:40:25 ID:???]
高機能な参照関数だな

123 名前:nobodyさん [2007/08/01(水) 06:30:28 ID:abLVM2kM]
>>87
買ってしまっていたよ。Iteratorまで読んだけど、
分かったような分からないような気分。

説明が少ない&下手なのは分かった。

124 名前:nobodyさん mailto:sage [2007/08/01(水) 22:18:22 ID:???]
分からない人に分かるように書いてないという意味では同意。
書いてあることを全て理解していこうとするとこんがらがってくるしね。
まぁいい頭の体操になったけど。
あんなサンプルのためのサンプルではなく、具体的な使い方と利点が書いてあるとOOP素人にも理解しやすかったかもね。

125 名前:522 [2007/08/26(日) 13:53:57 ID:QzPwO1Nh]
>>117
なんかCakePHP使ってみたんだけど質問と答えを操作するクラス作って云々みたいになって結局>>110と同じような感じになっちゃいましたとさ・・・
「モノ」に書く機能とか読む機能持たせていーの?おしえてえろいひと><

126 名前:nobodyさん mailto:sage [2007/08/26(日) 14:28:30 ID:???]
お前が「モノ」をどう捉えるか次第だよ

127 名前:nobodyさん mailto:sage [2007/08/28(火) 02:25:00 ID:???]
結局どうやってデータを保持したら、人間にとって分かりやすいか、コンピュータにとってやさしいかってことだろ。

128 名前:nobodyさん mailto:sage [2007/10/03(水) 02:51:35 ID:???]
オブジェクト指向は木構造を再現しようとしているだけ。
インスタンスだのオブジェクトだのは枝、茎、葉、花、果実を作るというだけ。
mainでは結果(果実)だけをとりたいから枝やら茎やらは見えなくしとけってことだろ?

129 名前:nobodyさん mailto:sage [2007/10/03(水) 16:27:59 ID:???]
>>128
まあそんな感じだ

130 名前:nobodyさん mailto:sage [2007/10/03(水) 23:45:33 ID:???]
まぁ、ファイルの管理方法も木構造だし、インターネットなんていっても網状でなく、
サーバーを経由した木構造になってることから演算機が理解しやすいデータ構造は木構造である。
こういってしまっても過言ではないと思う。


例えば、手続き型は東京の小さなバイク便が地方への配達を頼まれても東京発で請け負うみたいなもの。
それに対して、OODはヤ○ト運輸が東京で頼まれた配達を一旦、地方の配送センターに送るようなもの。
配達する対象が少なければ、バイク便に頼んだ方が早いかもしれないけど、数が多くなるとヤ○ト運輸。



131 名前:nobodyさん mailto:sage [2007/10/05(金) 01:16:19 ID:???]
うん、ここ数日でオブジェクト思考勉強してて分かったこと。
ちなみに128==130==漏れです。

・オブジェクト指向は木構造
・目的は種の存続、繁栄
・ここでのフローは一つずつだが、間にどれだけの枝が挟まるかは設計次第

クラス設計
 種(プリプロセッサ)から芽が出る(この時点では手続き型でも、OODでもない)
 根クラス…main関数、もしくはmainクラスの設計、遺伝子(設計の違いで木になるかどうかが決定)
 幹クラス…根から養分を吸い上げる(大まかな工程の分類)

オブジェクト生成
 枝クラス…効率的に日光を取得できるよう枝を伸ばす(コンストラクタ)
 葉クラス…光合成を行い、自己生産を行う(メソッド)
 葉緑素クラス…目立たない頑張り屋さん(ライブラリ)
 花クラス…実となるか枯れ落ちるか(オブジェクト)

実行結果
 果実クラス…土に還り、新たな種となりました(プロジェクト成功)

132 名前:nobodyさん mailto:sage [2007/10/05(金) 20:07:34 ID:???]
なんかすぐ動いて実用的で簡単なサンプルください

133 名前:nobodyさん mailto:sage [2007/10/05(金) 20:35:14 ID:???]
package hoge;


my $class=shift;

$ENV{'TZ'} = "JST-9";
my ($sec,$min,$hour,$mday,$mon,$year) = gmtime(time + 9*60*60);
my $obj={'sec'->$sec, 'min'->$min, 'hour'->$hour, 'mday'->$mday, 'mon'->$mon, 'year'->$year};

return bless $obj, $class;

1;



適当に書いてみた。あとは時間をゴニョゴニョするだけ、普通に作ったほうがメリット大きい気もするがキニシナイ!!
ヨウカソマソ参上===[・∀・]ノシ

134 名前:131 mailto:sage [2007/10/05(金) 23:40:29 ID:???]
実際に設計して、作ってみるとオブジェクト指向の本質は"同じことは出来るだけ"しない。
この論理で動いてるような気がしてきた。何でもかんでもオブジェクトにするのではなく、
運搬の頻度が激しいデータ、プログラム中で何度も使用するデータをオブジェクトにする。
そんな感じで合ってるのかな?あと、変数の受け渡しは原則、参照で行うみたいな。

135 名前:131 mailto:sage [2007/10/06(土) 13:37:33 ID:???]
何となく掴めてきた。もっかい木構造で表してみる。

根: プリプロセッサ、送信データ(実行役)
幹: main(効率よく栄養=処理を振り分ける)

[クラス]・・・大規模にもなるとこれが幾重にもネストされる。
  枝: コンストラクタ(葉に栄養=処理を割り振る、葉で生成された養分=オブジェクトを幹に伝える)
  葉: メソッド(オブジェクト=養分を生成する)
  花: オブジェクト(実行結果=果実の手前)

果実: 実行結果(主の繁栄=実行結果が真)

ちなみに実行結果が偽となるのは幹から花に至るまででエラーが起こった場合。


漏れルール
mainは基本的にクラスに指示を与える以外しない。

コンストラクタでオブジェクトの用意を行う。
メンバメソッドはオブジェクトの加工を行う。
コンストラクタからオブジェクトを返す。

mainは次に必要なオブジェクトを作るクラスへ処理を回す。

136 名前:nobodyさん mailto:sage [2007/10/07(日) 12:52:54 ID:???]
日曜日1GET!
始めまして
まだPHP3ヶ月目ですが早くもオブジェクト指向で挫折><
ちなみに
・「基礎PHP」
・「PHP5であなたもウェブアプリが作れる!」
・「速効!図解プログラミングPHP + MySQL」
を参考書にしています。

分かりやすかったのは基礎PHPです。
掲示版からスケジュール管理に移るところで
Smarty関連を追加するため承継とか出てきてなるほどと思いました。

ただソース理解しても自分では何もできないんですけどねw

137 名前:nobodyさん mailto:sage [2007/10/07(日) 19:12:30 ID:???]
掲示板の改良はどうします?


138 名前:nobodyさん mailto:sage [2007/10/07(日) 21:04:45 ID:???]
丸投げします

139 名前:nobodyさん mailto:sage [2007/10/07(日) 21:09:36 ID:???]
OOPで作ったやつの
ソースとかうpったら
なんか色々言ってもらえるんかな?
このスレでは

140 名前:nobodyさん mailto:sage [2007/10/07(日) 21:46:16 ID:???]
>>139
自分も変なソースですけど味見してもらえます?
恥ずかしいです><



141 名前:nobodyさん mailto:sage [2007/10/08(月) 09:30:37 ID:???]
>>133
これをどうやって使えばいいんですか

142 名前:nobodyさん mailto:sage [2007/10/08(月) 19:27:30 ID:???]
なかなか面白いブログを発見しました。
ぜひ皆さんに見てもらって意見聞きたいな^^

blogs.itmedia.co.jp/tamaki/2006/06/post_57ab.html


143 名前:nobodyさん mailto:sage [2007/10/09(火) 22:34:59 ID:???]
MVCのコントローラについてどこまでクラスにするか迷っています・・・

144 名前:nobodyさん mailto:sage [2007/10/10(水) 16:06:50 ID:???]
ハァ?

145 名前:nobodyさん mailto:sage [2007/10/12(金) 03:46:51 ID:???]
意味わかんね
どこまでクラス?

146 名前:nobodyさん mailto:sage [2007/11/12(月) 13:32:18 ID:???]
まずはモデルでしょ

147 名前:nobodyさん [2007/12/13(木) 08:37:25 ID:Q/a8rTy0]
SPLって使ってる人実在するの?

jp2.php.net/manual/ja/ref.spl.php

148 名前:nobodyさん mailto:sage [2007/12/14(金) 02:09:52 ID:???]
例外はよく使う

149 名前:nobodyさん mailto:sage [2007/12/19(水) 01:29:29 ID:???]
>>147
読み込んでも八割がた無駄なので使わない

150 名前:nobodyさん mailto:age [2007/12/23(日) 12:51:26 ID:???]
かしゆか誕生日おめでとう!
www.tkma.co.jp/tjc/j_pop/perfume/profile.html




151 名前:nobodyさん mailto:sage [2007/12/24(月) 10:55:41 ID:???]
>>149
つりですか?

152 名前:nobodyさん [2007/12/29(土) 00:05:37 ID:4ZpocZiG]
MVCのCってどうやって書けばいいのかわからんぜ。

153 名前:nobodyさん mailto:sage [2007/12/29(土) 02:00:56 ID:???]
その概念中でコントローラーが理解出来ないってやつ初めてみた

とりあえずView上で必要な操作を徹底的にControllerに切り離すが良い。
そしてModelからデータを引き出して必要があれば書き込み更新してやりなさい。

154 名前:nobodyさん mailto:sage [2007/12/31(月) 19:44:35 ID:???]
ユーザークラスで新規登録処理をして、そのときにユーザークラスの中で
プロフィールクラスのオブジェクトを作ってプロフィールの登録もする

これってしいて言えば何パターン?

155 名前:nobodyさん mailto:sage [2007/12/31(月) 19:47:57 ID:???]
ワンパターン

156 名前:nobodyさん mailto:sage [2008/01/01(火) 00:16:32 ID:???]
パターンというかコンポジションでそ

157 名前:nobodyさん mailto:age [2008/01/29(火) 11:18:04 ID:???]
模範解答は無いけれど、以下の相互変換を行うクラス(ChStr)をみんなで
作ってみるという案はどうかな?
そして、これが出来たら、ログファイルに保存などの機能をつけ、
wikiみたいに編集が出来る機能を追加していくという感じに。

<編集>
-------------------------------------------------------------
= 2ch
'''2ch'''とは、総合掲示板のことである。
link:[www.2ch.net]
-------------------------------------------------------------

<出力>
-------------------------------------------------------------
<b><font size="+1">2ch</font></b><br>
<b>2ch</b>とは、総合掲示板のことである。<br>
link:<a href="www.2ch.net">www.2ch.net</a><br>
-------------------------------------------------------------

158 名前:1 ◆SWtzLesEmM mailto:age [2008/01/29(火) 11:29:32 ID:???]
>>157
OOPの勉強というよりも、どちらかというと正規表現の勉強になるでしょうか?
wikiのパーサーつくるなら、既存のwikiスクリプトや、PEARのText_Wikiが参考になるかもしれませんね。

www.phppro.jp/news/172
PEAR::Text_Wiki 1.2.0RC1 リリース 2006年10月11日
labs.cybozu.co.jp/blog/tsuruoka/anubis/blog_show/18
Text_PukiWikiリリース

159 名前:nobodyさん mailto:age [2008/01/29(火) 11:43:55 ID:???]
>>158
C++のOOPの勉強として、文字列を簡単に扱うことが出来るクラスを
自作してみるという演習があったので、それをPHPでもやってみようかなと
思ったものです。
Cでは、文字列を結合したり、splitしたりするのが結構大変なので、
この演習が役に立ったなと思っていたのです。
PHPの場合は、関数を使えばそれで終わってしまうので、もう少し
ひねりを入れたものを考えて見ました。

正規表現を練習するというよりも、正規表現とhtmlの相互変換をする
クラスがあると、プログラムをする際、便利だなという事が実感
出来るのでは?という意味合いです。

(例)正規表現を格納し、html出力する過程。
$text に textarea タグの文字列を格納する。
$str = new ChStr($text);
echo "<html><body>";
$str->Write_html();
echo "</body></html>";

ほら、このクラスがあるとレイアウトを変えたりが、やり易い上に
再利用性が高いでしょ?みたいな。

160 名前:1 ◆SWtzLesEmM mailto:age [2008/01/29(火) 11:47:24 ID:???]
OOPの参考になる解説がありました。

PHPのclass、オブジェクト指向プログラミングに関する質問です。
q.hatena.ne.jp/1187962431

2番の回答者の解説が分かりやすいと思いました。
6番の回答者のサンプルコードも参考になりましたが、これは「インターフェース」の利用方法ではありませんね。><

インターフェイス
www.phppro.jp/phpmanual/php/language.oop5.interfaces.html
あるクラスが実装する必要があるメソッドの種類を、これらのメソッドの実体を定義することなく、指定するコードを作成できるようになります。
インターフェイスはキーワードinterfaceにより定義され、通常のクラスと同様に定義することができますが、メソッドの実装は全く定義されません。



161 名前:1 ◆SWtzLesEmM mailto:age [2008/01/29(火) 12:00:16 ID:???]
>>159
なるほど!(・∀・)
文字列を扱う処理は、いろんなところで出番がありそうですね!
wikiの文法(表記方法)が使える掲示板とか作れそう^^

162 名前:nobodyさん mailto:age [2008/01/29(火) 12:04:23 ID:???]
ChStr クラス の設計はこんな感じかな。

メンバ
private $m_str; // 正規表現文字列を格納する。

コンストラクタ
ChStr($str) // 正規表現の文字列を受け取る。

private メソッド
ch_to_html() // 正規表現をhtmlに変換する。

public メソッド
Write_html() // 格納している文字をhtmlで出力する。
Write_text() // 格納している文字を正規表現で出力する。

---------------------------------------------------
本当は、ログファイルへの保存や読み取りなどを機能として
考え、そのあたりまで含めたクラスの設計をした方が
いいんだろうけれど、まずは簡潔にする方向でいきます。
で、後々拡張の方向で。

163 名前:1 ◆SWtzLesEmM mailto:age [2008/01/29(火) 12:04:44 ID:???]
PHPのインターフェースは、Javaとかのインターフェースとはちょっと違っているみたいですねー。><
(…使ったことないので実感がありませんが^^)

PHPでは実装済みのinterfaceを多重に実装できない
blog.xole.net/article.php?id=589
blog.xole.net/article.php?id=597

164 名前:1 ◆SWtzLesEmM mailto:age [2008/01/29(火) 12:25:09 ID:???]
>>162
こんなかんじのプログラムと似ているかもしれませんねー。

60行で作るPHP用テンプレートエンジン
anond.hatelabo.jp/20071030034313
>テンプレートの中身を置換する
>function convert_string($s)

↑置き換えるパターンに応じて、別々のメソッドを用意したら便利でしょうか?
= 文字サイズ変更、''' 強調、link: リンクとかの記法の置換を担当するprivateメソッド

165 名前:1 ◆SWtzLesEmM mailto:age [2008/01/29(火) 12:34:03 ID:???]
OOPの参考になる解説がありました。

関数、オブジェクト、クロージャ
d.hatena.ne.jp/brazil/20060131/1138692196
>オブジェクトは、データに処理がくっついたものです。
>array.map()のように、後に後に処理を追加していく書き方は、順にコードを追えるため読みやすく、また書きやすいです。

クロージャっていう仕組みは、PHPにはないですね?><
大は小を兼ねる…クロージャの代わりにオブジェクトが使えればとりあえずOKかな?(・∀・)

166 名前:nobodyさん mailto:sage [2008/01/29(火) 13:15:31 ID:???]
>>161
>wikiの文法(表記方法)が使える掲示板とか作れそう^^

PEARのText_Wiki使えばよくね?

167 名前:nobodyさん mailto:age [2008/01/29(火) 13:18:38 ID:???]
>>164
> 置き換えるパターンに応じて、別々のメソッドを用意したら便利でしょうか?
本来ならば、そうなるでしょうね。それらはすべてprivateで作っておいて、
外部には、一つのインターフェースのみ(この例の場合はWrite_html()がそれに該当)
公開となるでしょう。
記号ごとに別々にメソッドを定義しておけば、記号とhtmlの関係が変わる時は、
どのメソッドを触ればよいかが分かるし、それを変更したことで、
他のメソッドには影響は無かったりします。
(これが構造化プログラムの場合は、目的のソースと目的ではないソースを
見極めるところから始まります。)

-------------------------------------------------------------------------
この ChStr に汎用性を持たせる場合は、Write_html()というよりも、
Get_html()とし、html文字列を return する事になるでしょう。
そうすると、別なプログラムで、「出力結果をファイルに保存する」という
使い方も出来ます。しかし、今回は初回なので、Write_html()とし、
メソッド内部で echo 使うことにします。

168 名前:nobodyさん mailto:age [2008/01/29(火) 13:22:48 ID:???]
>>166
学ぶために具体的に物を作るのと、実用性を考えて物を作るのは
別だと思う。なので、今回はこれでいいと考えている。
現に、初心者向けの書籍に載っているソースの実用性はゼロだ。

169 名前:nobodyさん mailto:age [2008/01/29(火) 13:59:05 ID:???]
とりあえず、全体構成の確認のために書いてみた。
ch_to_html()は、追記の必要性がある。
[chstr.php]
<?php
class ChStr {
// メンバ
var $m_str_reg; // 正規表現文字列を格納する。
var $m_str_html; // html文字列を格納する。
// コンストラクタ
// 正規表現の文字列を受け取る。
function ChStr($regstr) {
$this->m_str_reg = $regstr;
$this->ch_to_html();
}
// private メソッド
// 正規表現をhtmlに変換する。
function ch_to_html() {
// 改行を<BR>に変更する。
// nl2br($this->m_str_reg) 使った方がいいかも
$this->m_str_html = ereg_replace("\n","<BR>",$this->m_str_reg);
}
// public メソッド
// 格納している文字をhtmlで出力する。
function Write_html() {
echo $this->m_str_html;
}
// 格納している文字を正規表現で出力する。
function Write_text() {
echo $this->m_str_reg;
}
}
?>

170 名前:nobodyさん mailto:age [2008/01/29(火) 14:03:31 ID:???]
[index.html] 最初に開くファイル。
<html><body>
<form method="POST" action="./text.php"><textarea name="reg_text" cols=40 rows=4>
あああああ
いいいいい
ううううう
</textarea><br>
<input type=submit value=" 送 信 "></form>
</body></html>


[text.php]
<html><body>
<?php
include("./chstr.php");
$in_text = $_POST["reg_text"];
$chst = new ChStr($in_text);
$chst->Write_html();
?>
</body></html>



171 名前:1 ◆SWtzLesEmM mailto:sage [2008/01/29(火) 14:10:04 ID:???]
>>166
確かにそうなんですが、「勉強のため」という目的もあるので、自分で作ってみるというのもありでしょうか?^^
でも、答えが分かっている問題を解くのは楽ですね。>Text_wiki

車輪の再発明 - Wikipedia
ja.wikipedia.org/wiki/%E8%BB%8A%E8%BC%AA%E3%81%AE%E5%86%8D%E7%99%BA%E6%98%8E
車輪の再発明とは、「広く受け入れられ確立した技術や解決法を無視して、同様のものを再び一から作ってしまう事」を意味する
ある技術の意味を理解させるために、意図的に車輪の再発明を行わせる場合がある


172 名前:1 ◆SWtzLesEmM mailto:age [2008/01/29(火) 14:19:35 ID:???]
wikiとか文字列を処理する仕組みは、「パーサー」とか「構文解析」っていうみたいですね(´∀`)

構文解析 - Wikipedia
ja.wikipedia.org/wiki/%E6%A7%8B%E6%96%87%E8%A7%A3%E6%9E%90%E5%99%A8

今までにいろんな仕組みが考えられてきたみたい。
…本格的にやると奥が深そうだけど、一度仕組みを勉強しておいたら、いろいろ使えそうな予感!(・∀・)

↓wikiの仕組みを自分で作っている方は結構いるみたいですねー。

PHP用の汎用WikiParser作り中
tdiary.ishinao.net/20050323.html
RandomNote/PHPについて
tbox.jpn.org/wiki/rnh/index.php?AboutPage.txt

173 名前:nobodyさん mailto:age [2008/01/29(火) 14:21:38 ID:???]
今後の課題と予定
・ch_to_html() の中身を書く。
・[text.php] の機能を充実(テキストファイルに保存するなど)させ、wikiを作る。
・上記とは別に、 ChStr クラスを使い、BBSを作る。
・ChStr クラスに clear()、SetStr() 等のメソッドをつけ加え、汎用性を持たせる。

174 名前:1 ◆SWtzLesEmM mailto:age [2008/01/29(火) 14:38:20 ID:???]
tbox.jpn.org/wiki/rnh/index.php?AboutPage.txt
RandomNoteのMain.phpは参考になるでしょうか?

preg_match
preg_replace
array_push
array_pop
などの関数を使って、文字列の切り貼りをしてるんですねー。

175 名前:nobodyさん mailto:sage [2008/01/29(火) 14:39:05 ID:???]
OOPってより単にクラスの使い方書いてるように見えるのはまあいいとして
メソッドの中でstringをreturnせずにecho使うのは>>167で書いてるように汎用性って面もあるけど
処理と表示の分離って意味合いもあるからちゃんとstringで返したほうがいいよ

176 名前:nobodyさん mailto:age [2008/01/29(火) 15:39:09 ID:???]
>>175
> OOPってより単にクラスの使い方書いてるように見えるのはまあいいとして
OOPについて説明するとなると、具体的なソースコードとは離れた方が
良くなったりしますからね。
(クラスの使い方書いているように見えるとしても、)PHPでclassを
組む場合のメリットみたいな位置づけで学んでいこうと思っています。

> 処理と表示の分離って意味合いもあるからちゃんとstringで返したほうがいいよ
確かに汎用性以外にそういう目的もありますね。
次のものでstringで返すように書き換えます。

177 名前:nobodyさん mailto:age [2008/01/29(火) 18:16:08 ID:???]
htmlのformのコードもクラス化するのが本当の流れんだろうけれどな。
いきなりそれをやると分かりにくくなるかな・・・

178 名前:◆lKs5QMUHoA mailto:sage [2008/01/29(火) 19:20:19 ID:???]
ChStrクラスのサンプルソースを投稿してた者ですが、
今までnobodyさんで書いてたけど、分かりにくくなるかと思ったので
酉入れるようにしてみます。

>>5に書いてあるように、オブジェクト指向は「変数を保持できる事」が
メリットだと思うのですが、これがWebアプリだとどうも実感が無かったりします。
リッチクライアントだと、マウスのクリックに合わせて、メソッドが呼び出され、
そのアプリケーションが終了するまでの間、各種オブジェクトの中の変数に
状態が保持されるという構造なので、そのメリットが感じられるのですが、
Webアプリでは、POSTする度にオブジェクトの変数の状態はリセット
されてしまうので、クラスを書いたとしても、結局はグローバル変数から
各種オブジェクトの変数に代入するみたいなコードを書かなくては
ならなくなってしまうので、このメリットがあるのかと思ってしまうのです。

これは、勉強不足だからなのでしょうか。。。

179 名前:nobodyさん mailto:sage [2008/01/29(火) 22:51:04 ID:???]
>>160
他の人の話のほうがよっぽど核心を突いてるよ

180 名前:nobodyさん mailto:sage [2008/01/29(火) 23:05:47 ID:???]
>>160のはてなのリンクの4番目の話、2chの別の板でも
読んだことがあるけれど、この話本当なの?
具体的に何処でどういう商売をしての話なんだろうか。
アプリケーションを売る話?それとも開発環境用のソフトを売る話?



181 名前:nobodyさん mailto:sage [2008/01/30(水) 21:59:22 ID:???]
ピュアな意味でオブジェクトを操作したいなら
ボタンのクリックに関する全ての画面遷移に関してserializeとunserializeを管理する必要があるだろ

<?php

require_once("hiroyuki.class.php");

$hiroyuki = unserialize($_SESSION["hiroyuki"]

182 名前:nobodyさん [2008/01/31(木) 07:20:40 ID:NaJ3keB3]
>>178
ユーティリティクラスの再実装みたいな事を熱心にやっても
あまり意味が無いと思いますよ。

まさにあなたの言う「いちいち書くのがめんどくさい」のを回避する為に
OOPがあるんだと思います・・・

OOPの勉強なら、簡単なWEBフレームワークを自作するのが一番良いよ。
知識の無い段階でいきなりPHPでOOPって無理だと思いますよ。

背伸びせず、まずjavaやC#を学習する方が近道かもしれないよ。

183 名前:nobodyさん mailto:sage [2008/01/31(木) 08:15:31 ID:???]
.NET 以降の VisualBasic ってどうなの?

184 名前:nobodyさん mailto:sage [2008/01/31(木) 17:31:43 ID:???]
MVCモデルにそって、ユーザの入力データと、CSVファイルのデータを
読み込んで表示させるというものを作ってみました。

ファイル:全部で5つ。index.phpを実行する。
cfcontrol.php
cfview.php
index.php
cfmodel.php
csv.txt

[csv]
aaa,bbb,ccc

[index.php]
<?php
include("./cfcontrol.php");
$form_str = $_POST["form"];
$in_str = $_POST["key"];
$form = new CFControl($form_str, $in_str);
?>

185 名前:nobodyさん mailto:sage [2008/01/31(木) 17:32:35 ID:???]
[cfcontrol.php]
<?php
include("./cfview.php");
include("./cfmodel.php");
class CFControl{
function CFControl($form_str, $in_str){
if( ($form_str == "")or($form_str == "in") ){
$form = new CFView("index.php","in","");
$form->Write_HTML();
}elseif($form_str == "out"){
$da = new CFModel();
$dat = $da->ReadDat($in_str);
$form = new CFView("index.php","out", $dat);
$form->Write_HTML();
}
}
}
?>

186 名前:nobodyさん mailto:sage [2008/01/31(木) 17:33:57 ID:???]
[cfmodel.php]
<?php
class CFModel{
var $m_csv_file;
// コンストラクタ
function CFModel(){
// 読み込むCSVファイルを指定
$this->m_csv_file = "csv.txt";
}
// データを取り出す。
function ReadDat($str){
$INFILE = fopen($this->m_csv_file,"r");
$line = fgets($INFILE, 1024);
fclose($INFILE);
$line = $line . ", " . $str;
return $line;
}
}
?>

187 名前:nobodyさん mailto:sage [2008/01/31(木) 17:37:50 ID:???]
[cfview.php](1/2)
<?php
class CFView{
var $m_file; // POSTするファイル名
var $m_type; // 表示するフォームの種類。in か out
var $m_line; // 表示するデータ
// コンストラクタ
function CFView($file, $type, $line){
$this->m_file = $file;
$this->m_type = $type;
$this->m_line = $line;
}
// private
function in_html(){
echo "<html><body>";
echo '<form method="POST" action="' . $this->m_file . '">';
echo '<input type="hidden" name="form" value="out">';
echo '<input type="text" name="key"><input type="submit" value="送信">';
echo "</form></body></html>";
}

188 名前:nobodyさん mailto:sage [2008/01/31(木) 17:39:35 ID:???]
[cfview.php](2/2)
// private
function out_html(){
echo "<html><body>";
echo '<form method="POST" action="' . $this->m_file . '">';
echo '<input type="hidden" name="form" value="in">';
echo "$this->m_line<br>";
echo '<input type="submit" value="戻る"></form></body></html>';
}
// public
function Write_HTML(){
if($this->m_type == "in"){
$this->in_html();
}elseif($this->m_type == "out"){
$this->out_html();
}
}
}
?>

189 名前:nobodyさん mailto:sage [2008/01/31(木) 17:51:38 ID:???]
フレームワーク使えば?

190 名前:◆lKs5QMUHoA mailto:sage [2008/01/31(木) 19:03:23 ID:???]
とりあえず、MVCに分けて枠組みを作ってみたけれど、
これをより抽象化させていって、「継承して使ってください」という
方向にするのか、それとも最初はクラスの数を増やさないように
しながら簡単なアプリケーションを作る方向にするべきか。
どっちの方向に持っていったほうがいいのか迷うな。。。

ま、そんなことを考える暇があったら手を動かしてみろという
話なのかもしれないが。。



191 名前:nobodyさん mailto:sage [2008/01/31(木) 19:08:05 ID:???]
>>190
自分で考えるのも良いが、君が今やっていることを
やってしまっているのが、フレームワークだ。

まず既存のフレームワークがどうなっているのか参考しろ。

192 名前:nobodyさん mailto:sage [2008/01/31(木) 19:44:25 ID:???]
俺も初心者だからこれが最善とは言い切れないけど
newするときに全部引数で渡すってのはナシじゃね?
分かりやすいところだけ書き出すと
[index.php]
$form = new CFControll();
[cfcontrol.php]
コンストラクタ()
{
 $form_str = $_POST['form'];
 $in_str = $_POST['key'];
 if(inだったら){
  $view = new CFView();
  $view->m_type = 'in';
  $view->Write_HTML();
 }
}
[cfview.php]
メンバ変数
var $m_file = 'index.php';
var $m_type = false;
var $m_line = null;

193 名前:192 mailto:sage [2008/01/31(木) 19:50:52 ID:???]
フレームワーク使ってみろっていうのは賛成
疎結合にとかDRYにっていうのがだんだんわかってきた
理解したところで戻ってきて〜の方が結果的に早そう
俺はまだ勉強中だからそこまで行ってないけど

194 名前:◆lKs5QMUHoA mailto:sage [2008/01/31(木) 19:56:23 ID:???]
>>192
> $view = new CFView();
> $view->m_type = 'in';
これみたいに、直接メンバにアクセスするのは構造的に良くないと聞いたことが
あるよ。「データをやり取りするのは、インターフェースを通じて」という原則を
守るべきだと。
そうしなければ、CFViewクラスを改変する人は、そのクラスを使っている人の
コードを考慮して、メンバの値や変数名を自由に変える事が出来なくなるから。

なので、私は、コンストラクタで値を渡しても良いし、コンストラクタで値を渡して
いなければ、値を渡すためのインターフェースを使って渡すようにする仕様が
適当かなと思っている。

195 名前:192 mailto:sage [2008/01/31(木) 20:08:35 ID:???]
汚染されちゃうけどコンストラクタで全部の値渡すよりはましじゃないかなあ
あとコンパイルするときに全部チェックしてくれる言語とそうじゃない言語ってのもある
phpなんだしゆるーくやればいいじゃん なんていうと怒られるかw

196 名前:◆lKs5QMUHoA mailto:sage [2008/01/31(木) 20:13:09 ID:???]
今調べて知ったのだが、オーバーロードは PHP ではできないらしい。
だったら、コンストラクタで値を渡すよりも、インターフェースで値を
設定するような仕組みになるだろうね。
コンストラクタだと、一度値を設定したら、そのオブジェクトが破棄される
まで、再度設定が出来なくなるから。

197 名前:nobodyさん mailto:sage [2008/01/31(木) 20:22:00 ID:???]
メンバ変数へのアクセスはsetter/getterを使う。これは議論の余地なし。
それを用意した上でコンストラクタに引数を渡すなら渡せば良い。
複雑で多くの設定をしなきゃならない時以外、
newした直後に使える状態になっている方が使いやすい。
> $view = new CFView();
> $view->m_type = 'in';
これをセットで書かなきゃならないなら、
> $view = new CFView('in');
と書きたい。



198 名前:◆lKs5QMUHoA mailto:sage [2008/01/31(木) 20:26:00 ID:???]
私は>>197さんの意見に同意だ。
「このモジュールを使う場合、このように書いてくださいね。」
というコードは、なるべく少ない方がいいからね。
なので、とりあえず設定の値はコンストラクタにいれるという
設計で書いてみた。

199 名前:◆lKs5QMUHoA mailto:sage [2008/01/31(木) 20:31:34 ID:???]
とりあえず、フレームワークを使ってみろという話が出ているが、
具体的にどのフレームワークを使って、どんなプログラムを書いて
みたらいいのか迷うなぁ。

とりあえずはこのあたりに載ってるものの、「和モノ」あたりからかな。
pc11.2ch.net/test/read.cgi/php/1197383840/3

フレームワーク自体の自作の話もいくつかあるみたいだ。
ttp://codezine.jp/a/article.aspx?aid=104

200 名前:192 mailto:sage [2008/01/31(木) 20:36:05 ID:???]
viewに渡すデータはセッタで渡したくならない?
あとinなのかoutなのか分岐させるとしたらそれはコントローラ側の仕事なんじゃないかなと思うんだけど違うかな



201 名前:192 mailto:sage [2008/01/31(木) 20:42:33 ID:???]
いや、見直したらそう書いてた
ごめん気にしないで

202 名前:◆lKs5QMUHoA mailto:sage [2008/01/31(木) 20:46:31 ID:???]
>>200
> viewに渡すデータはセッタで渡したくならない?
表示させるデータはセッタがいいだろうね。

> あとinなのかoutなのか分岐させるとしたらそれはコントローラ側の
> 仕事なんじゃないかなと思うんだけど違うかな
>>185のソースがそれにあたるものだと思ってたけど。
if( ($form_str == "")or($form_str == "in") ){
 省略
}elseif($form_str == "out"){
 省略
}
コントローラは、POSTしてきた値を見て、必要なModelやViewを
選択し、実行する役割なので、それを実現したつもり。

203 名前:◆lKs5QMUHoA mailto:sage [2008/01/31(木) 21:58:27 ID:???]
厳密にMVCを分けることは出来ない場合もあるということだけど、
CFControlクラスで、CFViewを使って表示する内容までもを
指定していする処理を書いていたのは間違いかな?

検索結果の表示や、データの更新の場合は、
Control→Model→View だけど、
ボタンを押した時の画面の展開のみの場合は、
Contol→View という流れとなり、Viewオブジェクトを
生成するクラスが異なるという処理でいいのかな?

204 名前:◆lKs5QMUHoA mailto:sage [2008/02/01(金) 07:38:53 ID:???]
「とりあえずはフレームワークを使ってみろ」という返事がきそうだけど、
各クラスの役割は以下のような感じでいいかな?

Control
・POSTでデータを受け取り、その値に不正なものが無いかをチェック。
・変なところからのアクセスではないかをチェック。
・$_POST["Form"]の値をみて、それに必要な画面と処理を判断する。

Model
・SQLを発行し、データを受け取る。
・データをViewクラスに渡す。

View
・フォームを表示する。(フォームごとにクラスを分けたほうがいいのかは迷うな)
・データを1件受け取り、tableタグでレイアウトを調整し、表示する。

205 名前:nobodyさん mailto:sage [2008/02/01(金) 09:44:17 ID:???]
とりあえずはフレームワークを使ってみろ

206 名前:nobodyさん mailto:sage [2008/02/01(金) 11:08:23 ID:???]
自分なりに調べて見つけたPHPのサンプルを使った解説ページも
読むとwebアプリについて学べるのではないかと思っている。
やることが多くなったけれど、とりあえずは以下の3本だてで
勉強してみることになるのかな。

MVCに分けて、簡単なアプリを自作する。
(ログイン、メニュー、検索条件指定、検索結果、データ編集などの画面があるもの)

和モノフレームワークを使って学ぶ。
簡単なアプリを自作する。
pc11.2ch.net/test/read.cgi/php/1197383840/3

サンプルで理解! フォームデータの受け渡し
ttp://www.atmarkit.co.jp/flinux/rensai/mysql5_03/mysql5_03a.html

207 名前:nobodyさん mailto:sage [2008/02/01(金) 12:06:10 ID:???]
ちいたんのソース見てみたけれど、
class CObject ってあって、必ずそれが継承されて作られてるよね。
これの都合って何なんだろう。(メリットは何?)
javaも.NETもこういう基本クラスがあるよね。

208 名前:nobodyさん mailto:sage [2008/02/01(金) 12:19:15 ID:???]
全部のクラスに共通するメソッド等が実装できる

209 名前:nobodyさん mailto:sage [2008/02/01(金) 13:06:22 ID:???]
>>208
サンクス。
でも、オーバーロードが出来ない場合は逆に足かせになる可能性もあるね。
例えば、継承されているクラスが沢山ある状況でObjectクラスに
メソッドを追加する場合とか。

210 名前:nobodyさん mailto:sage [2008/02/01(金) 16:28:22 ID:???]
喋るのはコントローラとモデル
コントローラとビュー
基本的にはね



211 名前:nobodyさん mailto:sage [2008/02/01(金) 16:49:11 ID:???]
少ない数のクラスを書いたり読んだりする程度であれば、すぐに分かるのだが、
フレームワークレベルのクラス構造となると、その構成が全く分からなくなって
来るんだよなぁ。何かコツのようなものはあるのかな?

処理の内容を追いかけると、次々に別のクラスに処理を渡す構造になっていて、
最後はあっけない、みたいな感じだ。

フレームワークを作る場合のクラスの設計手法を身につけるなどしないと
いけないのかも。
メンバに定義はしていないけれど、メソッドではその変数をエラーが
出ないように処理が書かれているっていう書き方は多いようだ。
そうしておけば、そのフレームワークを使う人は、クラスを継承して
メンバに値を代入するだけで良い。

212 名前:nobodyさん mailto:sage [2008/02/01(金) 18:37:23 ID:???]
このサイト、説明は分かるのだが、具体的に作っているコードは
MVCのうちどれにあたるのかがいまいちです。
ttp://www.stackasterisk.jp/tech/php/phpMvc01_01.jsp

Result.php は、Viewにあたるものという解釈でいいんですよね?

213 名前:nobodyさん mailto:sage [2008/02/01(金) 18:47:22 ID:???]
PHPでMVC関連のサイトを紹介で貼っておきます。

特集:第3回 PHPを思うままに操れるようになる「MVC」と「Smarty」 (1/4)
ttp://www.itmedia.co.jp/enterprise/0402/19/epn01.html

214 名前:nobodyさん mailto:sage [2008/02/01(金) 18:50:51 ID:???]
2004年って・・・・・・・

215 名前:nobodyさん mailto:sage [2008/02/01(金) 20:08:38 ID:???]
OOPに取り付かれている人のブログ

ハタさんのブログ : : php
blog.xole.net/category.php?k=php


216 名前:nobodyさん mailto:sage [2008/02/02(土) 07:42:39 ID:???]
PHPでね、イベントドリブンなWEBフレームワークとか自作してみるといいかも。

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

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

そしてPHPであれこれ試行錯誤したあと、ASP.NETとか参考にするとね
PHPでOOPするバカらしさに気付くかもしれない・・・OTL

217 名前:◆lKs5QMUHoA mailto:sage [2008/02/02(土) 08:25:40 ID:???]
ASP.NET は、ちょっとだけやってみたことあるけど、概念的に違和感が
あって、やらなくなったな。
ある程度Webアプリを学んだ事のある人には便利なんだろうけれど、
初めて学ぶ人には、ドキュメントが少なすぎだし、いきなりイベントドリブンで
やるのはどうかと思った。

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

でも、学ぶ時は、既存のモジュールを使って早くやるのよりも、モジュール
なしの状態で、モジュールを作ってみる方がいいので、とりあえず今は
PHPでOOPです。

218 名前:nobodyさん mailto:sage [2008/02/02(土) 09:56:37 ID:???]
>>217
多分、その違和感のある概念がOOPの本質だと思うよ。
そしてその概念は、洗礼された実装に触れることでしか
身につかないとも思うんだ。

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

PHPでOOPで実装ってケースはありだとは思うけど、
概念は別で学習した方が効率的だと思うんだ。

219 名前:nobodyさん mailto:sage [2008/02/02(土) 13:32:52 ID:???]
OOPに取り付かれているとか良くわからんw

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

switchに取り付かれているとかそういうレベルに聞こえるんだが。


220 名前:nobodyさん mailto:age [2008/02/02(土) 15:21:16 ID:???]
MVCモデルでプログラミングする場合、Model から View へ処理を渡す経緯は、
どっちが正しいのかな?
・Control クラスのメソッド内で、Model クラスと View クラスのインスタンスを生成する。
 Control クラスが、Model からデータを受け取り、View クラスへデータを渡し、
 描画指示を出す。
・Model クラスのメソッド内で、View クラスのインスタンスを生成する。
 Model クラスが、Viewクラスへデータを渡し、描画指示を出す。
 Control クラスは、View クラスを一切操作しない。

それとも、こういうところまでは理論的には定めていないので、
ケースバイケースであり、どちらがよいというものは無いということかな?



221 名前:nobodyさん mailto:sage [2008/02/02(土) 15:36:53 ID:???]
お前は何を言ってるんだ

222 名前:1 ◆SWtzLesEmM mailto:sage [2008/02/02(土) 16:44:49 ID:???]
PHPでイベントドリブンですか?(・∀・)

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

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

●S2Prado.PHP5
labs.s2php5.jp/s2prado.php5
blog.xole.net/article.php?id=553
>S2Baseの方は待望のPRADO対応。

●Piece Framework
trac.piece-framework.com/piece-unity/wiki/ja/Start
>Piece_Unityは、Visual BasicやDelphiのようなイベントドリブンなフレームワークです。

●Delphi for PHP
www.codegear.com/jp/products/delphi/php
orz.qzlab.com/yamagw/index.php?Delphi%20for%20PHP%A4%CE%BB%C8%A4%A4%CA%FD
>イベントドリブンなロジックの実装が容易に実現する。

●Pharon
pharon.lolipop.jp/
>最大の特徴は、wizard によりイベントドリブン型のスケルトンを自動作成することです。

223 名前:1 ◆SWtzLesEmM mailto:sage [2008/02/02(土) 17:00:36 ID:???]
インターネット越しにイベント処理をさせるのが、WEBプログラミングの特徴ですね。
イベントドリブンは、PHPよりもむしろFlash/Flexとかで使われる仕組みなのでしょうか?

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

www.adobe.com/jp/devnet/flex/articles/framework_beta_print.html
>インタラクティブ性に優れたイベントドリブンなインタフェイス

www.atmarkit.co.jp/fwcr/rensai/flex203/01.html
>イベント処理によってアプリケーションを構築する手法はイベント駆動型(イベントドリブン)と呼ばれます。

www.azul.systems-noel.jp/item_9.html
>Flex2はイベントドリブンなので、ビューに起こったイベントをコントローラのリスナでキャッチするように意識すれば、MVCの分離はきれいにできるようになっています。
>なんかほんとにJavaのSwingを使ってるような気分になりますね。

bitmap.dyndns.org/blog/archives/001215.html
>イベントドリブンモデルには、主に以下の 4 つのオブジェクトが登場する。

224 名前:1 ◆SWtzLesEmM mailto:sage [2008/02/02(土) 17:05:16 ID:???]
>>220
>・Control クラスのメソッド内で、Model クラスと View クラスのインスタンスを生成する。
こっちの方が、Controlにまとまっている分だけスッキリしており、分かりやすいコードになるんじゃないでしょうか?

225 名前:nobodyさん mailto:sage [2008/02/02(土) 17:24:12 ID:???]
>>224
レスありがとうございます。
1番目の方にすると、Modelクラスから取得したデータを
Viewクラスに渡すことになるので、その分余計にメモリや
CPUを消費してしまうのでは、と心配になって聞いてみましたが、
考えてみると、コードの見易さなどを優先するのがOOPですので、
そちらの方がいいですね。

でも、フレームワークのソースなどを見ていると、
各クラスが、メンバに、別のクラスへのリファレンスを持ってたり
するので、もっと理論に従った組み方があるのかも、と思っています。

226 名前:nobodyさん mailto:sage [2008/02/02(土) 17:36:37 ID:???]
>>184
ファイル:全部で8つ。index.phpを実行する。
抽象クラスと具象クラスに実装を分けてみました。
csv.txt(※前回と同じ)
index.php
cfcontrol.php

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

コンクリートとして実装
data_model.php
index_view.php
output_view.php

227 名前:nobodyさん mailto:sage [2008/02/02(土) 17:38:02 ID:???]
[config.php]
<?php

// 実際の処理を行うスクリプトをインクルード
include("./index_view.php");
include("./output_view.php");
include("./data_model.php");
// 最初に呼ばれるビューのプレフィックス設定
define ('INDEX_VIEW_PREFIX', "Index");
// モデルクラスのプレフィックス設定
define ('MODEL_PREFIX', "Data");
?>
[index.php]
<?php
include("./cfcontrol.php");
$view_key = $_POST["view_key"];
$data = $_POST["data"];
$app = new CFControl($view_key, $data);
$app->Execute();
?>

228 名前:nobodyさん mailto:sage [2008/02/02(土) 17:39:03 ID:???]
[cfmodel.php]
<?php
class CFModel
{
var $file_name; // 読み込むファイル名
function CFModel() {}// コンストラクタ
function Execute($param) // パブリックメソッド
{
return $this->_OnExecute($param);
}
function _OnExecute($param) // 仮想メソッド
{
trigger_error('オーバーライドしてね。', E_USER_ERROR);
}
}
?>
[cfview.php]
<?php
class CFView
{
var $file_name; // POSTするファイル名
function CFView() {} // コンストラクタ
function Execute($param) // パブリックメソッド
{
return $this->_OnExecute($param);
}
function _OnExecute($param) // 仮想メソッド
{
trigger_error('オーバーライドしてね。', E_USER_ERROR);
}
}
?>

229 名前:nobodyさん mailto:sage [2008/02/02(土) 17:39:58 ID:???]
[cfcontrol.php]
<?php
include("./cfview.php");
include("./cfmodel.php");
include("./config.php");
class CFControl
{
var $_view_key; // 呼び出すビューのプレフィックス
var $_data; // モデルに渡すデータ
function CFControl($view_key, $data) // コンストラクタ
{
$this->_view_key = $view_key;
$this->_data = $data;
}
function Execute() // パブリックメソッド
{
// モデルオブジェクト動的生成
$model_class_name = MODEL_PREFIX . 'Model';
$model = new $model_class_name();
$param = $model->Execute($this->_data);
// ビューオブジェクト動的生成
$view_key = $this->_view_key;
if ($view_key == "") $view_key = INDEX_VIEW_PREFIX;
$view_class_name = $view_key . 'View';
$form = new $view_class_name();
$form->Execute($param);
}
}
?>

230 名前:nobodyさん mailto:sage [2008/02/02(土) 17:40:48 ID:???]
[data_model.php]
<?php
class DataModel extends CFModel
{
function DataModel() // コンストラクタで取得先のファイル設定
{
$this->file_name = 'csv.txt';
}
function _OnExecute($param) // オーバーライドメソッド
{
$INFILE = fopen($this->file_name,"r");
$data = fgets($INFILE, 1024);
fclose($INFILE);
$data = $data . ", " . $param;
return $data;
}
}
?>



231 名前:nobodyさん mailto:sage [2008/02/02(土) 17:41:48 ID:???]
[index_view.php]
<?php
class IndexView extends CFView
{
function IndexView() // コンストラクタでPOST先のファイル設定
{
$this->file_name = 'index.php';
}
function _OnExecute($param) // オーバーライドメソッド
{
echo "<html><body>";
echo '<form method="POST" action="' . $this->file_name . '">';
echo '<input type="hidden" name="view_key" value="Output">';
echo '<input type="text" name="data"><input type="submit" value="送信">';
echo "</form></body></html>";
}
}
?>

232 名前:nobodyさん mailto:sage [2008/02/02(土) 17:42:29 ID:???]
[output_view.php]
<?php
class OutputView extends CFView
{
function OutputView() // コンストラクタでPOST先のファイル設定
{
$this->file_name = 'index.php';
}
function _OnExecute($param) // オーバーライドメソッド
{
echo "<html><body>";
echo '<form method="POST" action="' . $this->file_name . '">';
echo '<input type="hidden" name="form" value="Index">';
echo "$param<br>";
echo '<input type="submit" value="戻る"></form></body></html>';
}
}
?>

233 名前:◆lKs5QMUHoA mailto:sage [2008/02/02(土) 19:04:13 ID:???]
>>226-232
サンプルソースありがとうございます。
抽象クラスの書き方に慣れてますね。私はこのあたりを
しっかりとやってなかったのでちょっと苦手です。
ま、しっかりと勉強していきたいと思います。(^^;

ソースを読んでいて、1点気になったので質問をしたいのですが、
class CFView と class CFModel において、以下のように
パブリックメソッドと仮想メソッドを作り、パブリックメソッドから
仮想メソッドを実行する形式にソースを書いた理由は何でしょうか?
出来ましたら、この設計にした意図を教えていただきたいと思います。

function Execute($param) // パブリックメソッド
{
return $this->_OnExecute($param);
}

function _OnExecute($param) // 仮想メソッド
{
trigger_error('オーバーライドしてね。', E_USER_ERROR);
}

234 名前:◆lKs5QMUHoA mailto:sage [2008/02/02(土) 19:24:37 ID:???]
>>218
レスありがとうございます。
イベントドリブンそのものは、VBでWindowsアプリを組んでやったことがあるので
すぐに入れたのですが、Webアプリを作る際、イベントドリブンでしかやった事が
無いというのは致命的だと思ったので、PerlやPHPでやってみています。
(ASP.NETは、便利ではあるが、IISを使えとか、.NET Frameworkを使えとか
非常に限定される。)

構造化プログラミングで、あまり命名規則を考えずにプログラムをしていると、
グローバル変数や関数が多くなった時、その把握が出来なくなったりする
わけなのですが、そういう苦労する体験をした後、OOPを習うと、その便利な部分が
見えてくるわけです。OOPは経験による結論的な理論だな、と理解できるわけです。
その理解のために、とりあえず、苦労をする方法(PHP で 0 から OOP)で
やってみているのです。
今は、このように考えています。

235 名前:nobodyさん mailto:sage [2008/02/02(土) 19:59:40 ID:???]
人間て暖かいにゃぁ
ポカ・ポカ テンキュー

236 名前:nobodyさん mailto:sage [2008/02/02(土) 21:30:36 ID:???]
>>233
PHP4では全てパブリックだけど例えばC#では以下の実装になるんだ
public object Execute(object parpam)
protected virtual object _OnExecute(object parpam)

CFControlから_OnExecuteメソッドを隠蔽する意図なんだよ。
_OnExecuteはCFViewやCFModelのサブクラスにだけ見えれば十分なんだ。

237 名前:◆lKs5QMUHoA mailto:sage [2008/02/03(日) 11:17:44 ID:???]
>>235
暖かいですねぇ。


>>236
なるほど。ありがとう。

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

[index.php]
include("./cfcontrol.php");
[cfcontrol.php]
include("./cfview.php");
include("./cfmodel.php");
include("./config.php");
[config.php]
// 実際の処理を行うスクリプトをインクルード
include("./index_view.php");
include("./output_view.php");
include("./data_model.php");

これは、MVCフレームワークは、以下の3つのファイルであり、
[cfcontrol.php][cfmodel.php][cfview.php]
それを拡張する形で、残りの6つのファイルを付け加えた形
なので、このようなincludeの構成ということでよろしいのでしょうか。

239 名前:◆lKs5QMUHoA mailto:sage [2008/02/03(日) 14:50:55 ID:???]
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");
include("./data_model.php");

240 名前:nobodyさん mailto:sage [2008/02/03(日) 15:27:26 ID:???]
MVC?な俺にはここが一番わかりやすかった
実例コードが載ってるのがいい

PHPでMVC第1回:前編
ttp://www.stackasterisk.jp/tech/php/phpMvc01_01.jsp




241 名前:nobodyさん mailto:sage [2008/02/03(日) 15:52:25 ID:???]
javaのサイト見ろよ

242 名前:nobodyさん mailto:sage [2008/02/03(日) 16:56:56 ID:???]
やけに伸びるな

243 名前:◆lKs5QMUHoA mailto:sage [2008/02/03(日) 19:47:22 ID:???]
ソースコードをちょっとだけ改変したものを作ってみた。
メモとかを残していく都合もあると思ったから、HP解説してみた。
ttp://www.geocities.jp/narutobakijp2/
本当は、>>1さんがソースの管理とかもしてくれたりしたら、うれしいw

244 名前:nobodyさん mailto:sage [2008/02/04(月) 01:44:33 ID:???]

いちいちzipを解凍する気にならない

245 名前:nobodyさん mailto:sage [2008/02/04(月) 09:02:58 ID:???]
>>243
CFViewクラスに具体的な実装をしちゃダメなんだよ。
そもそもHTMLのフォーム処理とかは、あとでPEARとか使えばいい。

サブクラスをうまく呼び出す仕組みだけを実装していくんだ。

246 名前:nobodyさん mailto:sage [2008/02/04(月) 14:12:44 ID:???]
>>244
> サブクラスをうまく呼び出す仕組みだけを実装していくんだ。
kwsk

247 名前:nobodyさん mailto:sage [2008/02/04(月) 23:36:13 ID:???]
>>246
構造化プログラミングはルーチンを呼ぶ方向で実装すると思うけど
OOPではルーチンに呼ばれる方向で実装して行く感じだよ。

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

だったら基底クラスのメソッドなんて数個で十分じゃないかと思うんだ。
やたら複雑でよくばりな機能のクラスなんて、再利用の価値がないからね。

248 名前:◆lKs5QMUHoA mailto:sage [2008/02/05(火) 01:28:01 ID:???]
>>247
レスありがとうございます。
> 構造化プログラミングはルーチンを呼ぶ方向で実装すると思うけど
> OOPではルーチンに呼ばれる方向で実装して行く感じだよ。
私は、継承を活かした設計をした事が無かったので、ちょっと方向性を
誤ってしまったようですね。

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

となると、html表示は(PEARを使わないのであれば、)htmlタグの
記述を行うCF_HTMLクラスを作り、Viewの具象クラス内で
インスタンスを生成ということですよね?

249 名前:nobodyさん mailto:sage [2008/02/05(火) 08:55:19 ID:???]
>>248
HTML処理のヘルパクラス作成はあまりOOPの勉強にならないとも思うんだ。
もう既に頭の中で実装出来ているだろうし、引数を関数で処理するだけでしょ?

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

すべてをフルスクラッチするプログラミングの方向性は必ずしも得策じゃないよ
既存のライブラリやコンポーネントを上手く利用するのもOOPの要素なんだよ。

250 名前:nobodyさん mailto:sage [2008/02/05(火) 11:06:34 ID:???]
OOPで継承を用いた設計について調べてみた。(OOP理論の入門ではなく、
継承を用いた設計などが入った解説)
この連載は良いかもしれない。

オブジェクト指向プログラミング超入門
.NETでオブジェクト指向プログラミングを始めよう
www.atmarkit.co.jp/fdotnet/basics/oop_index/index.html

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

第6回 階層の頂点に立つクラス
www.atmarkit.co.jp/fdotnet/basics/oop06/oop06_01.html



251 名前:nobodyさん mailto:sage [2008/02/05(火) 11:52:25 ID:???]
>>250
PHPのプログラマにも非常に参考になると思いますよ。

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

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

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

プロテクテッドメソッドの概念とかIDEがないと、なんでそうするのか
なかなか理解出来ないとも思いますしね。

252 名前:nobodyさん mailto:sage [2008/02/05(火) 11:56:50 ID:???]
いくらかのデータを登録し、その内容を検索するWebシステムで使用する
クラス構成で、Viewに絞った構成を考えてみた。

[View]
├[認証]
├[個人情報入力]
├[メニュー]
├[検索指定]
├[検索結果]

別の案として、[View]から[Input View]と[Output View]の
二つを継承し、さらに以下のような継承も浮かんだけれど、
継承して分ける必要性は無さそうなので、上記の方が良いように思う。

[Input View]
├[認証]
├[個人情報入力]

[Output View]
├[メニュー]
├[検索指定]
├[検索結果]

253 名前:nobodyさん mailto:sage [2008/02/05(火) 12:16:06 ID:???]
>>252
[View]
├[LoginView]
├[InsertView]
├[MenuView]
├[SelectView]
├[ResultView]

こんな感じ?

254 名前:nobodyさん mailto:sage [2008/02/05(火) 13:28:44 ID:???]
Debug用出力のメソッドをView(基底クラス)に追加するといいだろうね。
各画面([LoginView] [InsertView] [MenuView] ・・・)で
エラー確認用のメソッドをオーバーロードする形で。
開発中はPOSTで受け取ったデータとかを画面上部に表示しながら動作確認する
っていうのは、よくやるからね。

Objectクラスを継承する形にするのは、このスレでは共通したメソッドの
実装という理由だ。という話だったけど、リファレンス関係の処理で
便利だという話がサイトに載っているようだね。
このあたりの考え方も活かすと良いかもしれない。
ただ、PHPのOOPだとうまく実装出来ないかもしれないが。
>>207-209 >>250

255 名前:nobodyさん mailto:sage [2008/02/05(火) 13:44:31 ID:???]
Modelクラスも以下のメソッドを追加するという感じで設計すると良いのかな。

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

>>228に載ってる既存のクラスには Execute があるけれど、
これも残しておくべきかな?

256 名前:◆lKs5QMUHoA mailto:sage [2008/02/05(火) 19:03:57 ID:???]
案がいくつか出てきたので、前回の駄目なソースを破棄して
またソースコードをリニューアルしようかと思ったが、
いざやり始めてみると、データベースを管理する基底クラスの
設計を具体的にどうするかをきめないといけなくなり、それを
どうするかで迷っている。。。

概ね以下のような感じにしたいと思ってるんだけどね。
DB格納の基底クラス:CFDB
テキストファイルに保存するクラス:Text_DB extend CFDB
PostgreSQLに保存するクラス:PostgreSQL_DB extend CFDB
MySQLに保存するクラス:MySQL_DB extend CFDB

で、この3つのいずれかのインスタンスを Model のメンバに持たせる。
現在のコード(CFModelのメンバ)
var $file_name; // 読み込むファイル名
更新案のコード
var $m_db; // データベースを格納。

257 名前:nobodyさん mailto:sage [2008/02/05(火) 20:33:23 ID:???]
>>255
普通は機能をメソッドに振り分けると思うけど
コントローラのメソッド内で以下の様に
操作出来たら面白くない?

// モデルにフォーム値を渡してデータ書き込み
$insert = $this->models['InsertModel'];
$insert->setItem('name',  $_POST['name']);
$insert->setItem('title', $_POST['title']);
$insert->setItem('body',  $_POST['body']);
$insert->execute();

// ビュー表示用にデータをロードする
$select = $this->models['SelectModel'];
$data = $select->execute();

>>256
自分なりに試行錯誤で機能を実装してみるのも楽しいかもね。
誰か>>252のアプリ作成に必要な要求仕様作ってよ。

258 名前:◆lKs5QMUHoA mailto:sage [2008/02/05(火) 23:02:08 ID:???]
>>257
要求仕様案

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

・眼鏡を購入した顧客の情報を登録しておき、ある一定期間経つと
新しい眼鏡を購入する案内のDMを発送したい。
→条件検索をしたい。
・登録した情報を検索し、どんなお客様かをすぐに確認出来るようにする。
→例えば、苗字を聞いて、詳細が分かるようにする。
・眼鏡の定期的なメンテナンスで、訪問してきたら、その対応履歴を
登録しておきたい。
→眼鏡のクリーニング、シリコンパッド(鼻にあてるやつ)の交換など
・定期的なメンテナンスは無料であるので、全く店に来ない客には、
その無料案内のDMを発送したい。
→今回は、複数の店舗にまたがった処理はいらない。
・他の社員に勝手に情報を触られないように、認証を通すようにする。

眼鏡の在庫管理は、このシステムとは別。

これは、プログラムの規模が大きくなりすぎるようであれば、
もちろん内容を変えてもいいです。「顧客の情報を登録し、
それを検索する」という流れだと、勉強用サンプルとして非常に
良いのでは、と思いました。

259 名前:◆lKs5QMUHoA mailto:sage [2008/02/05(火) 23:21:24 ID:???]
[データの入力例]
氏名:茂名
フリガナ:モナー
性別:男性
生年月日:H1/3/3
住所:東京都・・・
コメント:ふちなしタイプを希望している。

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

[2007/1/5に購入した2ch]のメンテナンス履歴
2007/2/5:クリーニング
2007/3/15:ネジの交換
2007/5/1:クリーニング、曲がったフレームの修正


顧客のデータ1件に、眼鏡の購入日がつながり、さらに、メンテナンス履歴が
つながる構成になるけれど、今回は勉強用なので、「顧客のデータ1件=眼鏡の購入日1件」
としてもいいかもね。
再度購入したら、顧客の個人情報を0から入力しなおすみたいな。

260 名前:◆lKs5QMUHoA mailto:sage [2008/02/06(水) 01:36:05 ID:???]
View の Debug メソッドの仕様もどうするかで迷っている。
Execute($param)したあと、Debugとか、もしくは、
Debugの中でExecute($param)を呼び出す処理だと、
<html>タグのそとに確認データが出力されてしまう。

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

みんなどう思う?



261 名前:nobodyさん mailto:sage [2008/02/06(水) 09:30:01 ID:???]
>>258
ちょっとしたシステムじゃん・・ (´・ω・)
それこそ既存のフレームワーク使用する案件だよ。

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

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

あれほどインタフェイスだけで実装するんだと(ry
それよりコントローラの実装仕様どうするの?

262 名前:1 ◆SWtzLesEmM mailto:sage [2008/02/06(水) 10:44:17 ID:???]
>>243
>ttp://www.geocities.jp/narutobakijp2/

↓動作サンプルを設置しました。
ssurl.net/so2o

↓コードに関するコメントのまとめ(>>184-226辺り)
ssurl.net/h8bu

263 名前:nobodyさん mailto:sage [2008/02/06(水) 11:45:05 ID:???]
>>262
非常に乙です。m(_ _)m

>>226だけど >>1さんにここまでやって貰っちゃって申し訳ないし
これぞOOPってサンプルを必死に実装してアップするんでしばしお待ちを・・


264 名前:nobodyさん mailto:sage [2008/02/06(水) 13:18:03 ID:???]
>>263
はやくアップしろよなw

俺がそれ見て勉強して、いつかエロイ人になったら
お前を雇ってやるよ! 感謝しろ


265 名前:◆lKs5QMUHoA mailto:sage [2008/02/06(水) 16:04:09 ID:???]
>>262
動作サンプルまでつけていただいて、ありがとうございます。
過去ログも、そのままコピペするんじゃなくて、色をつけたり
分類したりすると非常に分かり易いですね。

ShiftJISだったりとか、スペース2個というのは標準じゃないとかは
気づいてたのですが、そこまで治していただいて申し訳ないです。

266 名前:nobodyさん mailto:sage [2008/02/06(水) 16:34:44 ID:???]
MVCって難しいね。

267 名前:nobodyさん mailto:sage [2008/02/06(水) 17:31:55 ID:???]
>>266
別にわかんなくったって、やってけるから大丈夫。
無理に背伸びする必要は無い。

268 名前:◆lKs5QMUHoA mailto:sage [2008/02/06(水) 20:19:07 ID:???]
フレームワークの解説に関するサイトを見つけました。
ここで概要をつかんだ後、実際に触れてみるといいかもしれない。

ASP.NET vs. Struts
フレームワーク徹底比較[前編]
www.atmarkit.co.jp/fdotnet/special/aspstruts01/aspstruts01_04.html

この文章書いてる人、ネットワーク関連の書籍でよく見かけるよね。

269 名前:nobodyさん mailto:sage [2008/02/07(木) 10:03:39 ID:???]
>>261
> OOPに対する基本的概念への理解があまりにも無さ過ぎると思うんだ。
> >>255にしても、Executeメソッドに呼ばれる仕組み作ってんのに、
> なんで新しいメソッド実装して直接呼びたがるんだろう?

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

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

俺はこれから勉強していくところなので理解がないのは認めるが、
このあたりはどういう見解なのかを教えて欲しい。
今回作るMVCフレームワークは、学習用なのでもっと簡潔な
レベルなのを想定しているとか、ちいたん作っている人がOOPに
関する理解が無いだけだとか。

270 名前:nobodyさん mailto:sage [2008/02/07(木) 10:24:36 ID:???]
>>269
フレームワーク実装に正解も不正解も無いと思うけどね・・

例えば
・クラスを使った構造化的メソッド呼び出し
$model->insert();
$model->del();
よりも
・ポリモーフィズム
$insert->execute();
$del->execute();
のほうがインターフェイスが規定されていて
簡潔で安全だと説明したかったんだよ。

insertメソッドやdelメソッドを呼ぶ文脈が規定されていたらどう?
insertオブジェクトのexecuteメソッドならオブジェクトが
文脈をコントロール出来るでしょ? どうかな?

学習用だからこそ『呼ばれる仕組み』で実装しようとしているんだよ。



271 名前:nobodyさん mailto:sage [2008/02/07(木) 10:55:50 ID:???]
>>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;

function setItem($field, $data){
if($field == "a"){
$field_a = $data;
}
if($field == "b"){
$field_b = $data;
}
if($field == "c"){
$field_c = $data;
}
}

function _OnExecute($param){
$fp = fopen($file_name,"a");
$write_line = $field_a . "," . $field_b . "," . $field_c;
fwrite($fp,$write_line);
fclose($fp);
}
}

272 名前:nobodyさん mailto:sage [2008/02/07(木) 11:32:07 ID:???]
じゃ、用件仕様はこんな感じで良いのか?

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

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

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

[検索指定]
→・氏名のキーワードを含む検索、性別指定が出来る。

[検索結果]
→・条件に一致するデータを一覧で出す。
 ・個人情報を修正したい場合は、ここから[個人情報入力]へ移動する。
 ・個人情報を削除したい場合は、ここで削除ボタンを押す。

273 名前:nobodyさん mailto:sage [2008/02/07(木) 12:35:22 ID:???]
>>271今こんな感じ。
[DataModel.php]
<?php
/**
 * データModel抽象クラスです。
 */
class DataModel extends Model
{
# @access private
var $_items;

# @access public
var $file_name;

# @access public
function setItem($key, $value)
{
$this->_items[$key] = $value;
}

# @access public
function getItem($key)
{
return $this->_items[$key];
}
}
?>

274 名前:nobodyさん mailto:sage [2008/02/07(木) 12:36:19 ID:???]
[InsertModel.php]
<?php
/**
 * データ追加Model抽象クラスです。
 */
class InsertModel extends DataModel
{
# @access sealed
function & _onExecute(&$param)
{
return $this->_OnInsert(&$param);
}
# @access protected
function & _onInsert(&$param)
{
trigger_error('オーバーライドして下さい。', E_USER_ERROR);
}
}

275 名前:nobodyさん mailto:sage [2008/02/07(木) 12:37:26 ID:???]
[SampleInsertModel.php]
<?php
/**
 * データ追加 サンプルクラスです。
 */
class SampleInsertModel extends InsertModel
{
# @access protected
function & _onInsert(&$param)
{
// ここで初めてユーザ定義のメソッドを実行する。
// FWからここが呼ばれるまで待ってるのがポイント!
// INSERTイベントの処理ハンドラに記述するともとれるね。
return $this->_saveData();
}
/**
* ユーザ定義のプライベートメソッド
*/
# @access private
function _saveData()
{
// リクエストは以下のインターフェイスで取得。
$value = $this->getItem('hoge_data');
// ここで初めてHogeHogeする。
// DBオブジェクト呼ぶなりご自由に!
return $data;
}
}
?>

276 名前:nobodyさん mailto:sage [2008/02/07(木) 13:59:04 ID:???]
細かい指摘になるけれど、継承関係の勉強中なので質問で書き込みします。

[InsertModel.php]
class InsertModel extends DataModel
function & _onExecute(&$param)  のところは、
return $this->_OnInsert(&$param);  となっているけれど、
return $this->_onInsert(&$param);  が正しいという解釈で良いのですよね?

277 名前:nobodyさん mailto:sage [2008/02/07(木) 14:16:55 ID:???]
>>273-275
ソースのサンプルサンクス。
イメージしてたよりも継承が多いですね。

全体ソースコードの可読性よりも、クラス単位での
再利用性を考えた場合は、このような構成になる
のでしょうね。早く慣れないといけません。

278 名前:nobodyさん mailto:sage [2008/02/07(木) 15:36:22 ID:???]
まだ中身が出来ていない状況なので、修正の必要はあるだろうけど、
こんな感じでドキュメントもまとめていくと、分かりやすくなるだろうね。

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

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

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

[publicメソッド]
setItem($key, $value):setter。フィールド名を指定し、データを登録する。
getItem($key):getter。フィールド名を指定し、データを取得する。
Execute($param):setItemでセットしたデータをDBに記録する。

◎使用例
$model = new SampleInsertModel(); // クラスのインスタンスを生成する。
$model->setItem('Name', 'Tarou'); // [Name]フィールドに[Tarou]を登録する。
$model->setItem('Sex', 'man'); // [Name]フィールドに[man]を登録する。
$model->Execute(); // setItemで登録したデータをDBに書き込む。

279 名前:nobodyさん mailto:sage [2008/02/07(木) 23:22:51 ID:???]
>>263 ひとまず出来ました・・疲れました・説明は後でアップしようと思います・・
ttp://proxy.f3.ymdb.yahoofs.jp/bc/4525b767_dfac/bc/452a/PHP%a5%d5%a5%ec%a1%bc%a5%e0%a5%ef%a1%bc%a5%af.zip?BCUjxqHB4brtVvJJ

280 名前:◆lKs5QMUHoA mailto:sage [2008/02/07(木) 23:27:16 ID:???]
>>279
乙です。じっくりソースを読んでみます。



281 名前:◆lKs5QMUHoA mailto:sage [2008/02/08(金) 08:04:01 ID:???]
せっかくプログラムを作っていただいたのだから、みんなでその説明文章をまとめるといいかもね。
例えば、こんな感じでhtmlで書いておいて、ファイル名をクリックすると、その詳細の説明のページに飛ぶとか。

[abstract]
  [controls]
    空
  [models]
    DataModel.php、DeleteModel.php、InsertModel.php、SelectModel.php、UpdateModel.php
  [views]
    HtmlQuickFormSmartyView.php、RenderView.php
[controls]
  MainControl.php、SkeletonControl.php
[data]
  空
[framework]
  Base.php、Control.php、Model.php、View.php
[lib]
  Request.php
[models]
  SampleInsertModel.php、SampleSelectModel.php、SkeletonSelectModel.php
[smarty]
  [cashe]
    空
  [templates]
    index_tmple.html、output_tmple.html
  [templates_c]
    空
[views]
  HtmlQuickFormSmartyIndexView.php、HtmlQuickFormSmartyOutputView.php
  IndexView.php、OutputView.php、SkeletonView.php

app.log、appconf.php、csv.txt、hoge.txt、index.php、Main.php、userconf.php

282 名前:nobodyさん mailto:sage [2008/02/08(金) 08:10:57 ID:???]
>>281
>>279ですがphpDocumentorで今作っているのでちょっと待っててね。

283 名前:nobodyさん mailto:sage [2008/02/08(金) 08:52:15 ID:???]
phpDocumentorにソース読み込ませて吐かせただけです。
ttp://proxy.f3.ymdb.yahoofs.jp/bc/4525b767_dfac/bc/452a/PHP_FW_DOC_01.zip?BCKv5qHBVNsncE.h
フォルダ内のindex.htmlです、荒いですがご容赦を。

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

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

[モデルの処理]
_onSelect
_onInsert

[ビューの処理]
_onRender

上記のイベントハンドラにユーザ処理を記述して
フレームワークに呼んでもらう構造になってます。
>>216を実装したつもりです・・・
有名なハリウッドの法則です。

[カプセル化]は良いとして、やはり[継承]と[ポリモーフィズム]を
うまく使うのは最初難しいかもしれない・・
これらの実装もデザパタとしてライブラリ化されたものに過ぎないけどね。

284 名前:nobodyさん mailto:sage [2008/02/08(金) 09:26:17 ID:???]
ファイルが見れん・・・

285 名前:nobodyさん mailto:sage [2008/02/08(金) 11:03:39 ID:???]
OOP FW ソース
ttp://proxy.f3.ymdb.yahoofs.jp/bc/4525b767_dfac/bc/452a/OOP_FW_02.zip?BCE07qHBz_6Z6R84
OOP FW ドキュメント
ttp://proxy.f3.ymdb.yahoofs.jp/bc/4525b767_dfac/bc/452a/OOP_FW_DOC_02.zip?BCE07qHB2C3Z36pC

すいません再アップしました、ドキュメントにControlが反映されてませんでした。

286 名前:nobodyさん mailto:sage [2008/02/08(金) 11:20:06 ID:???]
サンクス

287 名前:nobodyさん mailto:sage [2008/02/08(金) 11:51:38 ID:???]
全体構成の把握はまだ出来てないけれど、只今、ソース解析中・・・
いちゃもんつけるつもりじゃないけれど、気になった点を2つ。

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

class Control extends Base
var \$_view_calss;
このメンバはあえてclassにしてない理由はあるのでしょうか。

288 名前:nobodyさん mailto:sage [2008/02/08(金) 12:39:56 ID:???]
>>287
POSTされたサブミットボタン名取得部分は説明の通りです・・
今その部分をC#でのデリゲートで実装しようと思ってます。

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

オブジェクトにexecute以外のパブリックメソッドを
実装しないのが目標です・・(※アクセサ以外)

289 名前:nobodyさん mailto:sage [2008/02/08(金) 13:12:48 ID:???]
クラスの継承関係が結構複雑になってますね。
Documentsいただいても、追いかけていって、全体構造を把握するのが結構大変。
例えば、SampleInsertModelからその元を追っていくと、以下のような継承構造。
Base - Model - DataModel - InsertModel - SampleInsertModel

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

■Base(抽象)クラス[fw/framework/Base.php]
●パブリックメソッド
& execute(&$param, $e) →アプリのログを記録する。_onExecute(&$param, $e)を実行
●プロテクテッドメソッド
_onExecute(&$param, $e) →サブクラスでオーバーライドして使用。

■Model(抽象)クラス[fw/framework/Mode.php]
●プロパティ
$src_file_name; // 読み込むファイル名
$dst_file_name; // 書き込むファイル名

290 名前:nobodyさん mailto:sage [2008/02/08(金) 13:15:33 ID:???]
■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)
●プロテクテッドメソッド
& _onInsert(&$sender, $e) →オーバーライドして使用する。

■SampleInsertModelクラス[fw/models/SampleInsertModel.php]
●プロテクテッドメソッド
$ _onInsert(&$sender, $e) →ここにユーザ定義のコードを記述する。_saveData()を実行
●プライベートメソッド
_saveData() →現在未実装。



291 名前:nobodyさん mailto:sage [2008/02/08(金) 13:32:42 ID:???]
こうやってみてみると、クラスを継承する際の設計思想が見えてくるな。
どの段階で実装を替えるかを考えた場合、どのクラスを置き換えれば良いかも分かる。

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

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

292 名前:nobodyさん mailto:sage [2008/02/08(金) 13:51:09 ID:???]
ちょっと紹介しておきますね。

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

特集:第1回 フレームワーク「Struts」の基礎を知る (3/8)
フレームワークのメリットとデメリット
www.itmedia.co.jp/enterprise/0310/06/epn03_3.html

293 名前:nobodyさん mailto:sage [2008/02/08(金) 15:31:59 ID:???]
Control の & _onExecute(&\$param, \$e) で
\$this->_view_calss = \$view_calss;
というコードがあるけれど、右辺の \$view_calss って、
何処でも定義されてないですよね?
このまま動かすと、nullが入るだけのように思えるんだけど。

294 名前:nobodyさん mailto:sage [2008/02/08(金) 16:04:40 ID:???]
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]
●プロテクテッドメソッド
& _onExecute(&$sender, $e) // _onRender(&$sender, $e)を呼ぶ
& _onRender(&$sender, $e) // サブクラスにてオーバーラードする。

■IndexViewクラス[fw/views/IndexView.php]
●コンストラクタ
$this->post_file = 'index.php';
●プロテクテッドメソッド
& _onRender(&$sender, $e) // オーバーライド
 →html出力する。テキストボックスと送信ボタン

295 名前:nobodyさん mailto:sage [2008/02/08(金) 16:20:36 ID:???]
>>293
1行上のフックハンドラ実行の結果を渡している。

296 名前:nobodyさん mailto:sage [2008/02/08(金) 16:41:04 ID:???]
ロードメソッド[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)を呼び出す。
Control::_hookedUpControler(&\$sender, \$e) にて、Control::_form_onLoad(&$sender, $e)を呼ぶ。
これはMainControl::_form_onLoad(&$sender, $e)にてオーバーライドされている。
MainControl::_form_onLoad(&$sender, $e) が実行される。

継承関係
Base - Control - MainControl
Base - Main

297 名前:nobodyさん mailto:sage [2008/02/08(金) 17:33:12 ID:???]
リンク

symfony入門(1):symfonyで始めるPHPフレームワーク
codezine.jp/a/article/aid/704.aspx?p=1

Zend Framework入門(1):フレームワークの全体像とインストール
codezine.jp/a/article/aid/1824.aspx?p=1

298 名前:◆lKs5QMUHoA mailto:sage [2008/02/08(金) 18:46:07 ID:???]
>>285のファイルが落とせない・・・

299 名前:nobodyさん mailto:sage [2008/02/08(金) 19:33:52 ID:???]
>>298 見れるはずですが・・以下はどうですか?
Eclipceでのデバッグ画面です
ttp://proxy.f3.ymdb.yahoofs.jp/bc/4525b767_dfac/bc/452a/OOPFW_DEBUG.jpg?BC3YDrHBI.a6ljXl

300 名前:nobodyさん mailto:sage [2008/02/08(金) 22:21:47 ID:???]
>>298どうでしょうか?
ttp://briefcase.yahoo.co.jp/bc/oopfw



301 名前:nobodyさん mailto:sage [2008/02/08(金) 22:24:55 ID:???]
なんでPHP4文法でやってんの?

302 名前:◆lKs5QMUHoA mailto:sage [2008/02/08(金) 23:53:42 ID:???]
>>300でいけました。サンクスです。

303 名前:◆lKs5QMUHoA mailto:sage [2008/02/09(土) 01:49:09 ID:???]
これは、>>1さんのサイトでは、「入力フォームを作ってみる」とは
別で、「フレームワークを作ってみる」の演習という位置づけにした
方がいいかもしれないね。

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

このフレームワークは、MFCみたく、あらかじめ準備された
クラスのメソッド中に書き加えていくスタイルなのかな?
それとも、VBみたいにそういうソースコードを全部隠蔽
してしまう方向でいくのかな?ちょっと気になった。

304 名前:◆lKs5QMUHoA mailto:sage [2008/02/09(土) 02:12:22 ID:???]
こうやってソースを読んでみると、これまで抽象的に聞いていた
フレームワークを使ったプログラミングのメリットとデメリットが実感できるね。

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

小規模で全体概要を把握したいとか、移植性を考える場合は、フレームワークよりも、
クラスライブラリを使うスタイルの方が良い場合もありそうだ。

305 名前:◆lKs5QMUHoA mailto:sage [2008/02/09(土) 08:12:13 ID:???]
MVCでフレームワークを自作する方向と、クラスライブラリを自作する方向の
2つの方向をやってみて、それぞれのメリットとデメリットを確認していけば、
システムを作る場合の検討材料に出来ると思う。

何でもフルスクラッチしていき、なるべく依存性は無いようにし、(言語の
バージョンくらいに収めるとか)その組み合わせでアプリを作る、みたいな。

306 名前:nobodyさん mailto:sage [2008/02/09(土) 09:45:19 ID:???]
再度リファクタしてみました。
ttp://briefcase.yahoo.co.jp/bc/oopfw

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

[Modelクラス]
・継承関係の見直し、ItemBaseクラスの導入などです・・
MVCの継承関係が美しくないですが・・

>>291
リファクタしながら構成を練っていってますが
継承クラスでの責任が小さい単位で分割されていると
大きく修正が入った時も楽だと思います。

>>303
MFCもVB6もフックハンドラに処理を記述していく方式なので
それを参考にしています、サンプルFWも自由にいじってもらって
参考にしてもらえたら良いと思います。
>>305クラスライブラリ方式もいいかもしれないですね。

307 名前:nobodyさん mailto:sage [2008/02/09(土) 10:20:45 ID:???]
フレームワークのメリットとデメリットにおいて、なるべく具体例を書いた形でまとめてみた。

【メリット】
1.ビューとロジックの切り分けが出来る。(共同作業時に便利)
 www.atmarkit.co.jp/fdotnet/aspandvs/aspandvs01/aspandvs01_01.html
2.定型的なコードを何度も書かなくてよくなる。
 例えば、ASP.NETでは、POSTの値を取得して・・・などの事を考えなくて良い。
 テキストボックスやボタンも、画面にドラッグするだけ。
3.ソースコードが自動的にフレームワークの規約に従った記述方法となり、
全体的な処理構成が把握しやすく、メンテナンスが楽になる。
 例えば、構造化プログラミングならば、まず全体構成(どの関数がどんな役割を
 持っているかなど)を把握し、そこから問題部分を探すことになる。
 フレームワークの場合は、まずはこのイベントハンドラの部分を見れば良いなという事が分かる。

【デメリット】
1.フレームワーク自体の使い方を学ばなければならない。
・言語の基本ルールとは異なった、フレームワーク特有の記述方法があるため、すぐに組めない。
 ASP.NETでは、IsPostBack の概念を学ばなければならない。
 www.atmarkit.co.jp/fdotnet/dotnettips/043postback/postback.html
 ちいたんでは、function action( &$c )とか、$c->という書き方と機能を把握しなければならない。
 php.cheetan.net/manual/tutorial.php
・フレームワーク自体にも得手・不得手など特徴があり、それを把握しなければならない。
 ASP.NETはIISが必要な為、自動的にサーバOSはWindowsが必須となり、依存性がある。
 ASP.NETとStrutsの比較は、以下のサイトを参照
 www.atmarkit.co.jp/fdotnet/special/aspstruts01/aspstruts01_01.html
2.フレームワーク自体に問題があると対処が困難。
 例えば.NET Framework のバグは、開発元の不具合修正を待つしかない。
 オープンソースのフレームワークであっても、ソースコードが大量な為、把握が出来ない。

308 名前:nobodyさん mailto:sage [2008/02/09(土) 11:01:52 ID:???]
QA方式で書いてみた。

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

Q:フレームワークがあまり向かない場合は?
・個人で小規模アプリを組む時。(一度組んで終わりの場合など)
・そのアプリの全体構成をすみずみまで把握しておきたい場合
・サーバの移植を想定しなければならないなど、環境があまり固定出来ない場合
このような状況の場合は、クラスライブラリの使用を検討すると良い。

309 名前:nobodyさん mailto:sage [2008/02/09(土) 11:18:48 ID:???]
何かフレームワークを使ったとして、そのフレームワークがいつまでメンテされるか
判らないことを考えると、バージョンアップをするようなアプリの開発に向いていると
いえるかどうかは、かなり怪しいと思う。

310 名前:nobodyさん mailto:sage [2008/02/09(土) 11:25:52 ID:???]
>>309
そういうケースもあるから入れるか迷ったんだよね・・・
だけど、現在の比較的規模の大きなアプリは何らかのフレームワークで
組まれている事実があるということで、書いてみた。
フレームワークのメンテが突然打ち切られるケースは無いと見ても
良いと思うけどね。事前に何らかのアナウンスがあるはず。

で、フレームワークそのものを入替える必要が生じた時は、もちろん
全部作り直しになるが、この労力は、フレームワークを使わない場合に
比べて楽だよね。という意見です。



311 名前:nobodyさん mailto:sage [2008/02/09(土) 12:20:07 ID:???]
書いてみた、とかって適当かつ無責任な

312 名前:nobodyさん mailto:sage [2008/02/09(土) 12:23:25 ID:???]
完璧な文章がいきなりかけるわけないんだから修正しながらでいいと思う。
適当だの無責任だのいうのなら、このスレに来なくて良いと思う。

313 名前:nobodyさん mailto:sage [2008/02/09(土) 12:32:04 ID:???]
ひょっとして、つられた?

314 名前:nobodyさん mailto:sage [2008/02/09(土) 15:20:46 ID:???]
つんでれた

315 名前:nobodyさん mailto:sage [2008/02/09(土) 15:25:19 ID:???]
>>308
> Q:フレームワークがあまり向かない場合は?
> ・そのアプリの全体構成をすみずみまで把握しておきたい場合
全体構成を隅々まで把握してなんの意味があるのだろうか?
どうせ数日たったら忘れるんだし。

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

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

フレームワークの開発というのは、そもそもが環境が固定されていないので
そういう場合にはなおさらフレームワークを使ったほうが良い。


316 名前:nobodyさん mailto:sage [2008/02/09(土) 15:29:20 ID:???]
理解と記憶は別物だと思うけどな。

317 名前:nobodyさん mailto:sage [2008/02/09(土) 16:52:42 ID:???]
>>315
> 全体構成を隅々まで把握してなんの意味があるのだろうか?
> どうせ数日たったら忘れるんだし。
じゃ、この項目は消しておきます。


> PHP4、PHP5両対応のフレームワークもあるし、
> いろんなデータベースに対応している場合もある。
> フレームワークの開発というのは、そもそもが環境が固定されていないので
> そういう場合にはなおさらフレームワークを使ったほうが良い。
PHPスレで言うのもなんだけど、ASP.NETなども含めた総論という考えだったんだけどね。
Windowsサーバなのかなどを気にするとか、PHP5のみ対応のフレームワークで
開発していて、PHP4しか対応していないサーバで動かすことになる場合を
という意味で、環境が固定されない書きました。

318 名前:nobodyさん mailto:sage [2008/02/09(土) 17:04:40 ID:???]
修正案

Q:どんな時にフレームワークを使った方がいいの?
・短期間で仕上げなければならない時(この場合はフレームワークの使い方を把握しているのが前提)
・チームで分担してシステムを組む時
・バージョンアップや不具合修正など、納品後もメンテナンスが想定される時

Q:フレームワークがあまり向かない場合は?
・個人で小規模アプリを組む時。(一度組んで終わりの場合など)
・サーバの移植を想定しなければならないなど、環境があまり固定出来ない場合
 このような状況の場合は、クラスライブラリの使用を検討すると良い。

319 名前:nobodyさん mailto:sage [2008/02/09(土) 22:32:17 ID:???]
あえてPHP4の構文でやってるのは、PHP4との互換性を保つため?
PHP5でやっちゃうと、PHP4の環境で動かなくなるから。

320 名前:◆lKs5QMUHoA mailto:sage [2008/02/10(日) 03:19:14 ID:???]
ChStrクラスの件を再開しようかな。



321 名前:1 ◆SWtzLesEmM mailto:age [2008/02/10(日) 18:45:04 ID:???]
>>300
>ttp://briefcase.yahoo.co.jp/bc/oopfw
ソースコードを見てビックリ!(・∀・)
コメントが丁寧に書いてあり、OOPを学習する上でとても助かります!
貴重なサンプルを提供していただき、どうもありがとうございました。m(_~_)m

現時点で、バージョンがOOP_FW_02とOOP_FW_03の2つあるみたいですが、とりあえずOOP_FW_02の方をまとめページに掲載させていただきました。
ssurl.net/8vyv

>>281
ssurl.net/cp7a
ちょっとずつ読んでますが、全部はまだ理解できないです。(´;ω;`)
レスも参考にしてみます。
(=分からないことでも、検索で調べるときのヒント・手掛かりになるので)

322 名前:nobodyさん mailto:sage [2008/02/10(日) 22:19:07 ID:???]
>>321
乙です。m(_ _)m
>>306ですが今後は
・認証の仕組み
・ロギングの仕組み
・エラーハンドリングの仕組み
・バリデイトの仕組み
・トークンの仕組み
・リダイレクトの仕組み
・入力→確認→完了の仕組み
・コアオブジェクトの実行権限の仕組み
など実装していく予定です・・

でも、こればっかりやってるわけにいかないので
気長に見守ってやって下さい。

323 名前:◆lKs5QMUHoA mailto:sage [2008/02/11(月) 02:31:35 ID:???]
>>321
乙です。分かりやすくまとまっていますね。
私も少しずつ読んでいって理解しようと思っています。
他のものに比べ、コメントが多いのが助かりますよね。


>>322
読むほうも時間がかかると思いますので、
一気にやらなくていいと思います。(^^;

324 名前:◆lKs5QMUHoA mailto:sage [2008/02/11(月) 02:35:18 ID:???]
MVCフレームワークを作っていただいてる流れとはおもいっきり違う事をいうけれど。

>>1さんのOOPで掲示板を作るところは、もう少しクラスを分けたほうが
いいと思ったので、自分なりに作ってみました。

index.phpに、いろいろと処理を詰め込んでいるような感があったので、
それを分ける考え方です。
しかし、DBはテキストベースにしているとか、書き込み欄と表示欄を
同じページにしているなど、基本構成から大幅に変えています。(^^;

www.geocities.jp/narutobakijp2/
OOPの勉強として、簡易なBBSを作ってみました。
BBS Version1(2008.2.11)

325 名前:◆lKs5QMUHoA mailto:sage [2008/02/11(月) 08:27:05 ID:???]
クラス間のデータのやり取りにおいて、Listクラスを使う設計にしたけれど、
PHPの場合はハッシュでよかったような気がする件。
まだまだ未熟だな・・・

今後は、これを構造化指向へ変換したプログラムを作り、うpする予定です。
この両方のプログラムを見比べてみることで、OOPのメリットとデメリットが
見えてくるかもしれません。

326 名前:nobodyさん mailto:sage [2008/02/11(月) 10:26:11 ID:???]
OOPの継承やポリモーフィズムについての概念やそのコードの書き方に
ついては分かったけれど、その設計方法のノウハウの文章はぐぐっても
なかなか見当たらない。
「設計というのはそれぞれで目的次第」といってしまえばそうだけど、
hiroxpepeさんのソースや、.NET Framework や java の各クラスの
継承関係の設計を見ていると、何か共通したものを感じる。
その具体的な方針と、それを取る理由がはっきりとは分からない・・・

何か良い文章を見かけた、もしくは知っている方は、お願いします。

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ができるのにな

428 名前:nobodyさん mailto:sage [2008/02/15(金) 17:51:58 ID:???]
少しだけど、クラス分割のコツが掲載されてたのではっておきます。
VBプログラマ向けの情報だと、OOPの考え方の情報が結構ありそうです。

業務Webアプリの作り方の基礎(前編)
業務アプリ開発で失敗しないコツ
www.atmarkit.co.jp/fdotnet/vblab/bizappbasic01/bizappbasic01_01.html
> 1つの機能(=たとえWebアプリで複数のページにまたがっていたとしても一連の作業を
> 完了させるまでの一連の操作)に対して、1つのビジネス・ロジック層のクラスを
> 作ってみることをお勧めする。

> 一般的な業務アプリでは、クラスを細かくしすぎてしまうとどこで何を行っているのかが
> 分かりづらくなり、結果的にメンテナンスしづらいアプリになることがある。

(パフォーマンスを考慮し、)
> 可能な限りクラスのインスタンス化が必要ない静的メソッド(Sharedプロシージャ)で
> 作成したステートレスな設計にすることをお勧めする。

429 名前:nobodyさん mailto:sage [2008/02/15(金) 20:19:56 ID:???]
たまに昔のサイト触ったりすると非OOPなんてもうやってらんねーと思う
DRYになってないから直すの大変

430 名前:nobodyさん mailto:sage [2008/02/15(金) 22:23:07 ID:???]
OOPってのは設計的な考え方ってのが含まれるんだけど、
そういう考え方は別として、単にコーディング技法として便利だよ。



431 名前:nobodyさん mailto:sage [2008/02/15(金) 22:36:39 ID:???]
>>272
プリミティブだけど実装してみました・・
もはやQuickFormとSmartyがないと動きませんが・・
ttp://briefcase.yahoo.co.jp/bc/oopfw

432 名前:◆lKs5QMUHoA mailto:sage [2008/02/15(金) 23:49:43 ID:???]
風邪をひいてしまい、最近頭が回らないです。レスも遅れてしまってます。。。

>>392
確かにそうですね。継承をして作ったクラスはすべてPostgreSQLに依存してしまいます
ので、is-a関係が正しいですね。

>>407
接続に関して抽象的にクラスを定義するところは勉強になりました。
私はまだまだ継承を使いこなせてないですね。

>>410
> 接続オブジェクト(CDB_PostgreSQL)はCSearch_Personalクラス外部から与える。
この発想は思いつきませんでした。
確かに言われてみるとそうです。CSearch_Personalを一切修正しないで済むようになります。

433 名前:◆lKs5QMUHoA mailto:sage [2008/02/15(金) 23:50:26 ID:???]
>>431
サンプルありがとうございます。
あとでソースを読んでみます。

434 名前:383 mailto:sage [2008/02/16(土) 00:15:26 ID:???]
質問しておきながら、反応かなり遅れてしまってごめんなさい。

具体的なコードやアドバイスを提示してくださった方々、ありがとう。
ちょっとまだ、自分には敷居が高くて色々大変そうですが、
考えるよりも産むが易し、と言うので、手を動かして色々試行錯誤してみます。

ありがとうございました。

435 名前:nobodyさん mailto:sage [2008/02/16(土) 11:47:29 ID:???]
フレームワークの利点などの検証の参考となるかと思ったので書いておきます。

ASP.NETでは、「検証コントロール」というのが便利そうだ。
「プログラムを作成するたびにこういうのをいちいち書いたりしなくていい」という
部分の利便性は良く分かる。

ASP.NETで学ぶVisual Studio .NETの魅力
第2回 Visual Studio.NETでプログラム・レス開発を学ぶ(前編)
www.atmarkit.co.jp/fdotnet/aspandvs/aspandvs02/aspandvs02_04.html

だが、こういうのは逆にそのフレームワークに縛られてしまうのが欠点だな。
準備されてるコントロールを自分の意図するようにやりたいが、その方法が誰も分からない
もしくは、出来ない場合は、それで終わりみたいな。

話はずれるが、Accessで開発してる時、各種コントロールやウィザードの組み合わせでは
対応出来ないと感じたのを思い出した。ウィザードが準備する通りの物が目的ならば良いのだが、
それにちょっと変更を加えたい場合はどうしたらよいのかという感じ。各種プロパティーの
値を変更してみても変な方向に変わっていくだけ。
自分の意図するようにカスタマイズしたい場合は、非連結のテキストボックスを貼り付けて
VBAで制御するスタイルでやってたな。

436 名前:nobodyさん mailto:sage [2008/02/16(土) 12:59:37 ID:???]
Accessではグリッドが無いけれど、サブフォームで代用する方法はある。
しかし、そのカスタマイズ度は低い。(確か、クリックしたセルの場所を
取るとか、一つのセルだけ色を変更するとかがかなり苦手だったような。)
サブフォームで代用できない場合は、フォーム上にグリッドを貼り付けるような
モジュールは無いので、DBへのアクセス手段が手軽なものを捨ててでも
VBで0から作り直すのが一般的な選択方法となる。

Webアプリのフレームワークでもこのような状況になる事ってあるのかなぁ?

437 名前:383 mailto:sage [2008/02/16(土) 17:18:06 ID:???]
PDOを継承する形でこんなクラスにしてみました。
突っ込みどころ満載だと思うんだけど、とりあえず、このコーディング方法はやめておいたほうがいい、
っていうところを教えていただけると嬉しいです。

class DBConnect(){
// メンバ変数にDB接続情報を記述

function __construct(){} // PDOをインスタンス化
function getConnID(){} // PDOオブジェクト格納変数を返す
}

class TableCtrl extends PDO{} //PDOを継承、汎用関数を定義してもOK.

class CtrlA extends TableCtrl{ // テーブルAを操作する
protected $ConnID;
function __construct($ConnID){} //PDOオブジェクト格納変数を渡す
}

438 名前:438 mailto:sage [2008/02/16(土) 17:21:28 ID:???]
スクリプト先頭で、DBConnectをnewして、PDO格納オブジェクトを受け取ってから、
それを引数にCtrlAをnewする感じ……。
一応動きはするけど……全然ダメだな……。

439 名前:nobodyさん mailto:sage [2008/02/16(土) 17:46:45 ID:???]
>>438
なんでもいいけど、既存のフレームワークがどうなっているか見てみろ。

見たら自分で作るきなくなるけどなw

440 名前:438 mailto:sage [2008/02/17(日) 16:53:21 ID:???]
>>439
返信ありがとう。

まったくわかってないみたいなので、クラスの設計方法から学び直します。

実際の処理をする具象クラスを作って、また別に、それを統括するクラスを作っていく。
複数のクラスを設定によって使い分けしなきゃいけない場合は、抽象クラスなりインターフェイスなりを継承(後者の場合は実装)させて、
メソッド名を統一させた上で、ポリモーフィズム――クラスによって同名メソッドの振る舞いを変えさせるって解釈でいいよね?――で実現させる。
基本こんな感じかな?

プリペアドステートメントに惹かれて、PDOを継承する形で作って見たんだけど、
DB接続関連の場合、接続IDを返してくるmysql_connect(); なんかのほうが、使いやすい気がする。

フレームワーク自作なんて、自分にとってはとんでもない話しですよ……。



441 名前:nobodyさん mailto:sage [2008/02/17(日) 19:14:54 ID:???]
お前の下らない御託はいいから見ろっつの

442 名前:nobodyさん mailto:sage [2008/02/17(日) 20:01:12 ID:???]
>>441
ごめん、無視してたわけじゃないんだ。
とりあえず、軽い「ちいたん」とやらを見てきます。

スレ汚し、ごめんなさい。自重します。

443 名前:nobodyさん mailto:sage [2008/02/17(日) 20:03:55 ID:???]
なぜちいたんを選ぶか・・・


444 名前:nobodyさん mailto:sage [2008/02/17(日) 20:08:23 ID:???]
( ゚д゚)ポカーン

445 名前:nobodyさん mailto:sage [2008/02/17(日) 20:22:12 ID:???]
救いようが無いな。

446 名前:nobodyさん mailto:sage [2008/02/17(日) 21:40:51 ID:???]
スレのレベルを下げちゃってごめんなさい……。

軽い「ちいたん」が入門にはちょうどいいかな、と思っての選択です。
いきなり、CakePHPなど大きいのを見ても、余計に混乱しそうだったので。

スレのレベルを余計に下げるだけなのでROMします。
度重なるスレ汚し、失礼しました。

447 名前:1 ◆SWtzLesEmM mailto:age [2008/02/17(日) 23:11:41 ID:???]
>>324
>>335
掲示板スクリプトの改善、どうもありがとうございます。(*^^*)v

↓動作サンプルを設置しました。

ssurl.net/n777
ssurl.net/ioah

448 名前:nobodyさん mailto:age [2008/02/22(金) 09:37:11 ID:???]
フレームワークをみてみろとアドバイスをしてくださってる方は、
もう少し具体的なアドバイスを出して欲しい。
具体的に、どんなフレームワークの構造を見て、どんなことを
学んだのかなどをあわせて出してくれたら、勉強もしやすいと
思うのですが。

449 名前:nobodyさん mailto:sage [2008/02/22(金) 09:52:27 ID:???]
お前は人に逐一指示されないと何にもできないんだな

450 名前:nobodyさん mailto:sage [2008/02/22(金) 09:59:49 ID:???]
フレームワークはどこに行けば手に入りますか?



451 名前:nobodyさん mailto:sage [2008/02/22(金) 11:02:18 ID:???]
>>449
漠然としすぎていて良く分からないのである程度は具体例が
欲しいという意味なのですが。


>>450
こちらへどうぞ
【PHP】フレームワークについて語るスレ10【総合】
pc11.2ch.net/test/read.cgi/php/1202521438/l50

452 名前:nobodyさん mailto:sage [2008/02/22(金) 11:21:05 ID:???]
>>451
そのくらい自分で探せよという意味なのですが

453 名前:nobodyさん mailto:sage [2008/02/22(金) 11:36:33 ID:???]
>>451
自分でDBの抽象化を考えてみて、クラスの定義だけでも書いてみろ。
その後にZFのZend_DBを見て、自分のとどう違うか、なぜそうなっているのかを考えろ。

それから、偉そうな態度で教えてもらおうと思うな。



454 名前:nobodyさん mailto:sage [2008/02/22(金) 11:50:38 ID:???]
別に偉そうじゃないだろ。
むしろお前のほうが偉そうだ。
何被害妄想してるんだw

455 名前:nobodyさん mailto:sage [2008/02/22(金) 12:50:26 ID:???]
本気でOOP勉強したい人はまずPHP止めないと・・
PHPの世界にOOPの参考になるものがどれほどある?
javaやらずOOP出来ましたってありえないでしょ。

456 名前:nobodyさん mailto:sage [2008/02/22(金) 12:58:24 ID:???]
>>455
OOP勉強するなら、SmallTalkだな。
Javaとかアフォ?w

457 名前:nobodyさん mailto:sage [2008/02/22(金) 13:04:24 ID:???]
本気でOOP勉強する為にPHPをやめる必要は無い。
PHP使いながら、OOP勉強すればいいだけ。

本気でOOP勉強をするなら、非実用的な言語も含めていろいろな
言語を使うことになる。そしてそれらが実用的かというと別の問題。

いくらsmalltalkでOOPをマスターしました!とかいっても
それでウェブサービスを作ることはまずありえないんだから

手段と目的を逆にしないようにね。

458 名前:nobodyさん mailto:age [2008/02/22(金) 13:04:45 ID:???]
その論争は、きりが無いから、マ板とかのOOPのスレでやって欲しい。
「スクリプトの世界ならRubyだろ。」とか、結論が見えてこないし、
このスレの趣旨とは違うと思う。

459 名前:nobodyさん mailto:age [2008/02/22(金) 13:06:38 ID:???]
>>457は非常にすばらしいことを言ったと思う。

460 名前:nobodyさん mailto:sage [2008/02/22(金) 13:13:27 ID:???]
確かにPHPでOOPの解説をしている情報は非常に少ないので、
勉強の際はjavaやC#などの情報を読みながらやることになると思う。
しかし、PHPを辞めるまでする必要性は無いと思う。
言いたいのは「OOPの勉強するのなら、PHPに限定してはいけないよ。」
じゃないの?



461 名前:nobodyさん mailto:sage [2008/02/22(金) 13:16:21 ID:???]
本気で勉強する為にPHPをやめた。
そしてOOPをマスターした。

しかし、Javaでは共有サーバーで動くソフトを作れなかった。
多くのオープンソースアプリはPHP製だった。

OOPをマスターしたが、何も出来なくなった。 完。

462 名前:nobodyさん mailto:sage [2008/02/22(金) 13:27:17 ID:???]
前から思ってたんだが、頭の悪い人間が粘着してるな。
自分がどんな風に思われてるかも分かってないんだろうなw

463 名前:nobodyさん mailto:sage [2008/02/22(金) 13:58:48 ID:???]
>>457
> いくらsmalltalkでOOPをマスターしました!とかいっても
> それでウェブサービスを作ることはまずありえないんだから

今やウエブサービスに欠かせないMVCはそもそもsmalltalkのOOP由来なんだが…。
継続ベースだって覚えておいて損はない。

www.ibm.com/developerworks/opensource/library/os-lightweight8/
www.ibm.com/developerworks/jp/java/library/j-cb07056/index.html

464 名前:nobodyさん mailto:sage [2008/02/22(金) 14:19:47 ID:???]
PHPでOOPする為に別の言語でOOPの勉強をする。
自分の為に必要だからやるだけ。

465 名前:nobodyさん mailto:sage [2008/02/22(金) 14:42:14 ID:???]
>>463
うん。だからさ勉強・研究の為の言語と
実用・開発の為の言語は別なの。

466 名前:nobodyさん mailto:sage [2008/02/22(金) 17:56:13 ID:???]
このソースの解析をがんばればいろいろ見えてくるだろうけど、
一人じゃ到底無理だろうな。別スレでも立てて、解析して
ドキュメント作ろう!見たいなことやってみる?

Visual Studio 2008で見る.NET Frameworkのソースコード
www.atmarkit.co.jp/fdotnet/insiderseye/20080222sourcecode/sourcecode.html
> 公開されたソースコードには(もちろん英語だが)多くのコメントが入っており、
> ローカル変数名も元のままの“生”のソースコードである。
> そしてそれがVisual Studio 2008でシームレスにトレースできるようになる

467 名前:nobodyさん mailto:sage [2008/02/23(土) 08:39:50 ID:???]
>>447
サンプル見たけど
Viewで変数が入らないとこで”を使ってる意味がわからない
”と’の使い方間違ってると思う
面倒な使いわけするならsprintfという手もある

パラメータ変数が渡ってくる
switch文のcaseに頭文字を大文字にしてる意味がわからない



468 名前:nobodyさん mailto:sage [2008/02/23(土) 08:44:08 ID:???]
function html_head(){
echo "<html>";
echo "<head><title>BBS</title></head>";
echo "<body>";
}

上は、こうでいいやん!

function html_head(){
echo '<html>';
echo '<head><title>BBS</title></head>';
echo '<body>';
}

なんでダブルクォートやねん

469 名前:nobodyさん mailto:sage [2008/02/23(土) 09:12:10 ID:???]
>>447

class View_Baseは
helper的な役割だからいいとしても

View_List
View_WriteFinish

コントローラで判断させるべき機能が
Viewで書かれてるし
テンプレート化されてないのもあって
ぐちゃぐちゃですね。
ここがOOP構造を理解しにくい作りになってる

コントローラは面倒でもOOP理解するには必要だ
理解しやすくするためにテンプレート化も必要

470 名前:nobodyさん mailto:sage [2008/02/23(土) 09:19:29 ID:???]
>>447
本来コントローラとModelがやりとりする部分が
コントローラが無いために
Viewで処理されてる

MVモデルですね!
OOP構造化理解のためには
面倒でもMVCモデルじゃないと
初心者を間違った方向に導きますよ!!





471 名前:nobodyさん mailto:sage [2008/02/23(土) 12:22:21 ID:???]
>>469
具体的にどうすればいいの?
条件分岐してないから切り分けは良さげに見えたんだが。
viewは機能ごとの静的HTML吐くのとは違うの?

472 名前:nobodyさん [2008/02/23(土) 13:43:29 ID:i4AYcehM]
www.microsoft.com/japan/msdn/practices/type/Patterns/enterprise/DesMVC.aspx

これの

アクティブモデルは、コントローラとは関係なくモデルで状態が変更される場合に使用されます。
これは別のソースでデータが変更され、この変更をビューに反映する必要がある場合に起こります。
株価相場表示を例に考えてみます。株価データが変更された場合、外部ソースからデータを受け取り、チッカーバンドや警告ウィンドウなどのビューを更新する必要があります。
モデルの内部状態の変更が検知できるのはモデルだけなので、モデルからビューに表示を更新するよう通知する必要があります。

って、hoge.php?param1=aaa¶m2=iiiみたいなリクエストを解析してコントローラがそれに応じたビューを選択して云々
ではなくて、例えばブログだったら記事テーブルにまだ一つもデータが無いときは「まだ記事が登録されていません」のビューをモデルが選ぶ、ってことかい?

だとしたらどうやって実装したらいいんだろ・・・

そのモデルを使用するビューをモデルに登録しておいて、モデルのデータによって分岐させて使うビューを選択。そのときにビューは出力に必要なデータをモデルからひっぱりだす

MSDNは書き方がやたらめんどいぜ

473 名前:nobodyさん [2008/02/23(土) 13:56:50 ID:i4AYcehM]
コントローラがリクエスト解析

そのリクエストにおいて必要なモデルのインスタンス生成

モデルのメソッド呼び出す

選択したビューのupdate呼びだして出力に必要な変数定義

モデルがビューの出力するメソッドを呼ぶ

ビューはモデルからの変更を受け付けるupdateメソッドと出力するためのputHtmlメソッド持つインターフェイスを実装する

なんか間違ってますか>< 教えてください!><

474 名前:nobodyさん mailto:sage [2008/02/23(土) 14:42:12 ID:???]
なんですでにあるフレームワークを参考にしない?

475 名前:474 mailto:sage [2008/02/23(土) 14:43:18 ID:???]
474は無視してくれ

476 名前:474 mailto:sage [2008/02/23(土) 15:11:03 ID:???]
>>472
それはようするに、株価データのようにユーザーが
ページを更新しなくてもデータが更新されるときの話。

コントローラがモデルからデータ引っ張ってきて
そのデータをビューに渡して表示という処理は変わらない。
↑この処理を、普通は「URLを開いた」というタイミングで行っているわけ。

しかし、そのタイミングだと株価データ表示のようなリアルタイムでの表示は難しい
人間がF5を押す必要がある。この場合も更新されているとは限らず無駄に負荷が高くなる。

それを(ウェブアプリ以外では)モデルからデータが変更されたよーと
コントローラ・ビューに通知し、その通知が来たタイミングでコントローラ・ビューが
モデルからデータを引っ張ってきて(ry)という設計方法がある。
それが>>472で言っていること。

モデルに対して、コントローラやビューを「変更あったら俺に通知してくれ」
登録することでそれを実現する。
(データに変更があったらコントローラ・ビューのこの関数を呼び出してくれとモデルに登録する)


でも、この設計。モデル(つまりサーバー)から変更の通知をすることになるので
ウェブアプリでは一工夫必要になる。結局は、JavaScriptを使って
一定ごとに変更チェックをすることになるわけだが、まあそれをAjaxとかの技術で
非同期的にバックグラウンドで行うことにより、見た目上はサーバーから
変更通知がくるような感じに出来るんでしょ?やったこと無いけど。
その通知を元に、画面の一部、もしくはすべてを再描画する。



あとは詳しい人に任せた。

477 名前:nobodyさん [2008/02/23(土) 17:10:06 ID:i4AYcehM]
>>476
レスd

オブザーバパターンはWebアプリに不向きなのかー。

じゃあ、
//コントローラの実行メソッド
public function doExecute(){
if($this->model->getArticleNum() === 0){
$message = '記事がまだ一つもありません';
require_once('./template/Error.php');
}else{
$this->view->putHtml();
}
}

こういう、コントローラがモデルからデータ引っ張ってきて分岐して、ビューを選択する、ってのはアリなのかな?

ちょっとCakePHPとかの資料ググってくるは

478 名前:nobodyさん mailto:sage [2008/02/23(土) 17:50:55 ID:???]
そういう場合Comet使うんじゃね?
Cometすげえ!って大騒ぎになってたころ資料見ても俺には何がなんだか理解できなかったけど

479 名前:nobodyさん mailto:sage [2008/02/23(土) 20:15:50 ID:???]
1を含めてコントローラの役割が全然わかってないんだよ!
MVモデルになってるんだよ!
CakePHP、symfonyのソースをよく解読してみろよ!
1のサンプルにはVIEWにコントローラで処理するコードかいてあるんだぜ!

480 名前:nobodyさん mailto:sage [2008/02/23(土) 20:21:31 ID:???]
PHPでOOPを追求すると
結局はMVCモデルのフレームワークにテーマが行き着くんだよね
だったらPHPフレームワークのスレと同じじゃんて感じで
ここでOOPを議論するときは
MVCモデル以外を議論の対象にしたいよ



481 名前:nobodyさん mailto:sage [2008/02/23(土) 20:27:22 ID:???]
>>478
ワロタ。目からうろこw
httpってのはクライアント(ブラウザ側)から聞くことしかできないんだ。
どうやってもサーバーから話しかけることはできない。

だから、たとえば一分おきに、
「データ変わったかい?」「変わってねーよ」
「データ変わったかい?」「変わってねーよ」
「データ変わったかい?」「変わってねーよ」
「データ変わったかい?」「変わってねーよ」
「データ変わったかい?」「変わったよ!」

って聞かないといけない。たとえ4分半の時点でデータが変わっていても
5分後に聞くまでわからない。Cometというのは、
「データ変わったかい?」・・・・・・・・・・・(4分30秒後)「変わったよ!」・・・(数分後)「また変わったよ!」
とこうなる。

本質的にはクライアントから聞いているわけだが、変更があるまで
みのもんたみたいにずっと溜めてから返答するため、
負荷の軽減とリアルタイムな通知が実現できるというわけ。

しかし、いまさらだけどhttpで無茶やりすぎだw

482 名前:nobodyさん mailto:sage [2008/02/23(土) 20:30:12 ID:???]
例え巧すぎワロタ

483 名前:nobodyさん mailto:sage [2008/02/23(土) 20:32:35 ID:???]
>>479
だから具体的にどこがだよ?

484 名前:nobodyさん mailto:sage [2008/02/23(土) 20:35:35 ID:???]
>>480
> PHPでOOPを追求すると
> 結局はMVCモデルのフレームワークにテーマが行き着くんだよね

それはPHPに限らず。

そもそもOOPが一番よく使われるのは、フレームワーク部分なんだよ。
OOPはフレームワークを作るときに使うものといっても過言じゃない。

通常のビジネスロジック部分は基本的に単純な命令の集まりになるので
OOPを使っているという感じは無くなる。

485 名前:nobodyさん mailto:sage [2008/02/23(土) 20:43:56 ID:???]
>>484
だから結局フレームワークの議論になるんなら
このスレの意味が無いんだよ

486 名前:nobodyさん mailto:sage [2008/02/23(土) 20:45:46 ID:???]
>>483
>>469

487 名前:nobodyさん mailto:sage [2008/02/23(土) 20:49:01 ID:???]
>>485
フレームワークスレは、フレームワークの比較などを話すスレ
OOPはフレームワークを題材に、OOPの話をするスレ

おk?

488 名前:nobodyさん mailto:sage [2008/02/23(土) 20:53:31 ID:???]
>>486
class View_List extends View_Base{
//
function Write_HTML_head(){
$this->html_head();
$this->html_title("--- PHP で OOP の BBS ---");
echo "<hr>";
}

// 書き込みフォームを表示させる。
function Write_HTML_form(){
$this->html_form_start("index.php");
echo "<b>[メッセージを投稿する]</b><br>";
$this->html_input_hidden("PAGE", "Write");
echo "タイトル:<br>";
$this->html_input_text("title");
echo "<br>";
echo "メッセージ:<br>";
$this->html_textarea("msg");
echo "<br>";
$this->html_submit(" 書き込む ");
$this->html_form_end();
}


489 名前:nobodyさん mailto:sage [2008/02/23(土) 20:54:28 ID:???]
//
function Write_HTML_foot(){
$this->html_foot();
}
//
function Write_HTML_data($line){
echo "<b>タイトル:</b>";
echo $line->GetName();
echo "<br>";
echo "<b>メッセージ:</b>";
echo $line->GetMsg();
echo "<hr>";
}
}
この中のどこがコントローラで判断させるべき処理なんだ?

490 名前:nobodyさん mailto:sage [2008/02/23(土) 20:57:01 ID:???]
>>487
OOPはフレームワークを題材に、OOPの話をするスレならプログラム板だろ?
初心者だらけの、ここよりも良レスが来ると思うんだが
PHPにこだわる理由がわからない
WEBでのフレームワークならどれも仕組みは同じだろうに
じゃあperlでOOP、rubyでOOPていうスレが無いのは何でなんだ?



491 名前:nobodyさん mailto:sage [2008/02/23(土) 21:21:33 ID:???]
function GetNextData(){
if( $line = fgets($this->m_file_hd, 1024) ){
$line2 = split($this->m_pause_chr, $line);
$ans = new Line();
$ans->SetData($line2[0], $line2[1]);
}else{
$ans = "";
}
return $ans;
}

これは下記がいいだろ?

function GetNextData(){

$ans = "";
if( $line = fgets($this->m_file_hd, 1024) ){
$line2 = split($this->m_pause_chr, $line);
$ans = new Line();
$ans->SetData($line2[0], $line2[1]);
}

return $ans;
}

492 名前:nobodyさん mailto:sage [2008/02/23(土) 21:36:01 ID:???]
// データを1行読み出す。
function GetNextData(){
if( $line = fgets($this->m_file_hd, 1024) ){
$line2 = split($this->m_pause_chr, $line);
$ans = new Line();
$ans->SetData($line2[0], $line2[1]);
}else{
$ans = "";
}
return $ans;
}

変数名の最後に数字使うのは初心者だろ?
もしコード拡張で数値計算が入ったら紛らわしい

493 名前:nobodyさん mailto:sage [2008/02/23(土) 21:39:32 ID:???]
// データを最後に追記する。
function AddLast($title, $msg){
// ファイルを開く
$hd = fopen($this->m_file_name , "a");
// データを書き込む
$line = $title . $this->m_pause_chr . $msg . "\n";
fwrite($hd, $line);
// ファイルを閉じる
fclose($hd);
}

なんでflock入れないの?

494 名前:nobodyさん mailto:sage [2008/02/23(土) 21:47:30 ID:???]
$line2 = split($this->m_pause_chr, $line);

はこれの方がわかりやすいだろ?

list($name,$msg) = split($this->m_pause_chr, $line);

495 名前:nobodyさん mailto:sage [2008/02/23(土) 21:52:46 ID:???]
function GetNextData(){
if( $line = fgets($this->m_file_hd, 1024) ){
$line2 = split($this->m_pause_chr, $line);
$ans = new Line();
$ans->SetData($line2[0], $line2[1]);
}else{
$ans = "";
}
return $ans;
}

これは下記に修正した方がわかりやすいよ

function GetNextData(){

$ans = "";
if( $line = fgets($this->m_file_hd, 1024) ){
 list($name,$msg) = split($this->m_pause_chr, $line);
 $ans = new Line();
 $ans->SetData($name, $msg);
}

return $ans;
}

496 名前:nobodyさん mailto:sage [2008/02/23(土) 21:55:49 ID:???]
変数にオブジェクトが入ってくるなら
初期化はこうだった

function GetNextData(){

$ans = null;
if( $line = fgets($this->m_file_hd, 1024) ){
 list($name,$msg) = split($this->m_pause_chr, $line);
 $ans = new Line();
 $ans->SetData($name, $msg);
}

return $ans;
}


497 名前:nobodyさん mailto:sage [2008/02/23(土) 22:04:10 ID:???]
else{
$ans = "";
}

これ全部

$ans = null;
に初期化に変えて
elseとっぱらった方がいいよ

返り値はオブジェクトが入ってるか入ってないかという処理なのに
空文字を返すのよくないよ!

498 名前:nobodyさん mailto:sage [2008/02/23(土) 22:44:30 ID:???]
まぁ空文字もnullも演算子によっては同様にfalse扱いできるという点がPHPの特徴なわけで

499 名前:nobodyさん mailto:sage [2008/02/24(日) 05:50:47 ID:???]
>>490
> じゃあperlでOOP、rubyでOOPていうスレが無いのは何でなんだ?
人気が無い言語だからw

500 名前:nobodyさん mailto:sage [2008/02/24(日) 11:09:06 ID:???]
プログラム初心者がPHPだけでOOPを習得するのはほぼ不可能に近いと思う。
OOP習得が目的ならあまりにも無謀だし、全くもって得策ではない。

フレームワークとか利用しても、ユーザが$_POSTとか直接呼べちゃうと
結局OOPの意味が無いんではないだろうか?むしろそれが出来てしまうPHPは
OOP理解には全く向いていない言語だとも思うのだ。

でも不完全ながら、PHPでOOPっぽくコーディングすること自体は楽しいと思う。



501 名前:nobodyさん mailto:sage [2008/02/24(日) 11:31:24 ID:???]
>>500
> プログラム初心者がPHPだけでOOPを習得するのはほぼ不可能に近いと思う。
どんな言語でも当たり前。

> フレームワークとか利用しても、ユーザが$_POSTとか直接呼べちゃうと
> 結局OOPの意味が無いんではないだろうか?
まったく関係ない。


502 名前:nobodyさん mailto:sage [2008/02/24(日) 14:04:04 ID:???]
PHPでOOPするには
初心者じゃ無理だよ
オブジェクトの設計は上手に出来ても
コーディングレベルで初心者ならではのミスが目立つ

503 名前:nobodyさん mailto:sage [2008/02/24(日) 14:08:38 ID:???]
PHPでOOP勉強は適してないよ
JAVA,C#,rubyみたいに
OOPを前提として作られた言語じゃないからね


504 名前:nobodyさん mailto:sage [2008/02/24(日) 15:14:16 ID:???]
「PHPでOOPは」みたいな話は何度も出てるのに、いつも具体的な話にならないのは何で?

505 名前:nobodyさん mailto:sage [2008/02/24(日) 15:31:22 ID:???]
お前に知識がないから

506 名前:nobodyさん mailto:sage [2008/02/24(日) 15:37:16 ID:???]
( ´・∀・`)へー

507 名前:nobodyさん mailto:sage [2008/02/24(日) 15:38:42 ID:???]
関係なくはないよ。グローバル変数として、どこからでも呼べちゃうんだから、カプセル化できてないってことになる。
だいたい$_REQUESTや$_SESSIONがオブジェクトじゃなくって、変数な時点で、PHPのウェブアプリでオブジェクトなんて使うなっていう、PHP開発者からのメッセージと理解すべき。

508 名前:nobodyさん mailto:sage [2008/02/24(日) 15:44:11 ID:???]
グローバル変数が使えたら、カプセル化できない言語ってことになるのか。
そりゃすごい。

509 名前:nobodyさん mailto:sage [2008/02/24(日) 16:03:09 ID:???]
俺も、>>469に書いてる、コントローラで判断させるべき処理の具体的な
コードを教えて欲しい。
このコードの話が質問されても出ていないのはなぜ?フレームワークを
使わないと、理論を完全に実現できないとかそういう話だから?

510 名前:nobodyさん mailto:sage [2008/02/24(日) 16:19:48 ID:???]
>>479=486も結局答えられてないしな。
だめだだめだと言うものの、何故だめなのか、どう書けばいいのかということには答えられない低レベル批判厨なのさ



511 名前:nobodyさん mailto:sage [2008/02/24(日) 19:08:42 ID:???]
また見えなくすることをカプセル化と勘違いしてる高レベルプログラマさんのお出ましだ

512 名前:1 ◆SWtzLesEmM mailto:age [2008/02/24(日) 19:49:37 ID:???]
>>1 ◆SWtzLesEmM :2007/02/23(金) 13:35:52

このスレも1周年を迎えてましたね!
…時間が経つのは早いなー。><

1年前からあまり進歩してないのは気のせい?(・∀・)

513 名前:1 ◆SWtzLesEmM mailto:age [2008/02/24(日) 19:50:55 ID:???]
>>487
PHPでOOPを勉強するとき、フレームワークは良い見本になりますね!

>>490
>PHPにこだわる理由がわからない
ホームページ作成でPHPの勉強を始めました。
プログラミングの勉強をしていたら、手続き型以外にOOPという方法があることを知り、使えるようになりたいと思いました。

>>502
Zendが積極的に音頭を取って、初心者向けの情報提供をやってくれたらいいですね。><
www.zend.co.jp/tech/
Zendの代わりに、PHPプロというサイトがPHP初心者のニーズをカバーしてくれているでしょうか?(・∀・)
www.phppro.jp/

>>503
Javaもちょっと勉強してみました。^^
…今使っているレンタルサーバだとJavaが動かない><

>>507
自分で作ったクラスに関しては、クラス内に変数を封じ込めておけるので、スコープ(変数が操作できる領域)をコントロールできるのではないでしょうか?
PHPが最初から用意してくれているグローバル変数($_REQUES等T)のデメリットがよく分からないのですが、いつでもアクセスできるのでこれはこれで便利だと思います。

とりあえず、PHPでOOPが使えるようになりたいです。
PHP以外の言語も使ってみて、必要に応じて使い分けができるようになれればイイですね!(´∀`)

514 名前:1 ◆SWtzLesEmM mailto:age [2008/02/24(日) 20:01:23 ID:???]
フレームワークに関して情報提供どうもありがとうございます。

>>479
MVモデル…(ノ∀`) アチャー
以前作った掲示板を、MVCフレームワークの形で作り直してみました。(^^)v

ssurl.net/ryol

515 名前:nobodyさん mailto:sage [2008/02/24(日) 20:34:16 ID:???]
結局1のやりたいことは
アマゾンのアフィリエイトの誘導らしいwww

516 名前:1 ◆SWtzLesEmM mailto:age [2008/02/24(日) 22:49:51 ID:???]
>>515
PukiWikiPlusでamazonプラグインをデフォルトのまま使うと、プラグイン作者さん?のアフィリエイトコードが付くようですね。><
ttp://cafelounge.net/dev/?PukiWiki%20Plus!%2FPlng-in%20Customize#a5aa9e2a
>amazonアカウントを設定します。
>define('AMAZON_AID','mikoscafeterr-22');

アフィリエイトはやってませんが、とりあえず本の情報をまとめるのに便利なのでamazonプラグインを使ってみます。^^

517 名前:nobodyさん mailto:sage [2008/02/25(月) 07:27:51 ID:???]
>>516
本の情報とかいらんよ
あと、valueclickのアフィリエイトも出てるし
あとTOPページいくとgoogle広告も出てる
結局こういうことかいな
最悪やなお前

518 名前:nobodyさん mailto:sage [2008/02/25(月) 11:09:54 ID:???]
具体的な本の紹介をサイトに掲載することは俺は賛成だけどな。
でも、単に羅列してるだけよりも、読んでみてどう思ったのかという
レビューをだして、その人なりの評価を出して欲しいとは思った。
羅列しているだけだと、そのサイト特有の色を感じない。

519 名前:nobodyさん mailto:sage [2008/02/25(月) 11:36:58 ID:???]
どう考えても本の紹介を書くのおかしいだろう?
ここだけじゃないけど
技術的なサイトに広告とかマジうざい!!!!





520 名前:nobodyさん mailto:sage [2008/02/25(月) 11:41:53 ID:???]
「OOPやるのならば、PHPを辞めた方がいい」といっている人は、
それをいいたいのならば、もっと具体的に言って欲しい。
「RubyはもともとOOPとして設計されている」とか抽象論で終わってるから
何も話が進まず、同じことの繰り返しが続いているんだと思う。
「$_POSTなど、グローバル変数があるからオブジェクト指向的な考えには
ならない」とかそういう話をしてもらえれば、勉強する人はそれを
それぞれに解釈して学んでいけるのではと思う。
「じゃ、辞めようか」と思う人もいれば、「じゃ、その部分だけ気を
つけていけばPHPでもOOPがやれるんだな」と思う人もいるわけで。



521 名前:nobodyさん mailto:sage [2008/02/25(月) 11:44:37 ID:???]
1は誤解を招くことは面倒だからやめた方がいいよ



522 名前:nobodyさん mailto:sage [2008/02/25(月) 11:44:58 ID:???]
>>519
そこまでいいきるのなら、じゃ、みなけりゃいいじゃんとか思うけどな。

あからさまなCMじゃなければいいと思うけどな。俺はこの本をつかって
こういう勉強をして、こういう役に立ったとか、いいじゃん。
このスレは勉強しようっていうスレなんだから。

523 名前:nobodyさん mailto:sage [2008/02/25(月) 11:46:05 ID:???]
>>521
それにおいては俺も同意だな。

524 名前:nobodyさん mailto:sage [2008/02/25(月) 11:47:54 ID:???]
特に2ちゃんはスレ利用して
最終的に宣伝目的にするやつが多いからな
リンク先に広告があるかどうかだけはシビアに見てる奴が多いよ

525 名前:nobodyさん mailto:sage [2008/02/25(月) 11:51:48 ID:???]
100歩譲って本を紹介しても、それは構わないけど
それがアフィリエイトになってるのがおかしいよ

526 名前:nobodyさん mailto:sage [2008/02/25(月) 11:54:29 ID:???]
以前、面白いレスを自分のサイトに集めて、面白かったと思う
投稿も受け付けたりしていて、そのサイトに広告を出して儲けてた
人がいて、叩かれたことがあったからな。
あと、のまねこ。
そういう事件があったから、2ちゃんねるをつかって管理者が
儲けようとする目的で広告が掲載されていることにはぴりぴりと
している傾向はあると思うな。

2ちゃんねるを通じて何か企画をするのには賛成だけど、やるのなら
GPLライセンスでやるみたいな意識でやらないとだめなんじゃないかな。

527 名前:nobodyさん mailto:sage [2008/02/25(月) 11:59:06 ID:???]
書籍の紹介は良いと思う。そうしないと、@ITの紹介もだめになるわけで、
本当に内容の無いことしかかけなくなってしまう。
情報をまとめていることで、便利だというものもあるしね。
だけど、「アフィリエイトはダメだ」という意見には賛成だ。

528 名前:nobodyさん mailto:sage [2008/02/25(月) 12:02:29 ID:???]
1がアフィリエイトするのは構わないけど
2ちゃんを利用するというのが問題あり

529 名前:nobodyさん mailto:sage [2008/02/25(月) 12:06:47 ID:???]
2ちゃんねるのスレのまとめサイトであるにもかかわらず、
アフィリエイトされていると、それがどこかで告知されて、
大きく騒がれると思う。このスレに厨を沢山呼ぶことにも
なりかねない。
記念パピコとかが大量に来るので、1は早急にアフィリエイトは
辞めるべきだと思う。

530 名前:nobodyさん mailto:sage [2008/02/25(月) 12:07:12 ID:???]
嫌いだと思う事と否定すべき事は分けるものだと思うが、ここでのOOPの議論を見れば
それができないのも仕方がない。



531 名前:nobodyさん mailto:sage [2008/02/25(月) 12:08:30 ID:???]
>>530
kwsk

532 名前:nobodyさん mailto:sage [2008/02/25(月) 12:34:45 ID:???]
2ちゃん利用して金儲けはよくないし
まとめサイトで書籍紹介するのも始めてみて正直びびった


533 名前:1 ◆SWtzLesEmM mailto:age [2008/02/25(月) 12:50:47 ID:???]
ご意見どうもありがとうございます。もう少しPHPでOOPの勉強を続けてみます。

>>517
2chでソースコードを投稿(>>36-50)したら、>>53さんが「わかりにくいからWebサイトにまとめてくれ。」とアドバイスしてくれました。
とりあえず、無料サーバ(XREA)にまとめサイトを設置しましたが、XREAは広告を表示するようになっているので仕方ないですね。
ttp://www.xrea.com/?action=ad
>当サイトは、無料運営のため、広告コードを自分で挿入する、または、自動的に挿入して頂く必要があります。

>>521
アドバイスどうもありがとうございます。
PukiWikiPlusのamazonプラグインに付いていたプラグイン作者さん?のアフィリエイトコードは外しました。

>>526
CGM型のサイトを運営して収益が出る場合、運営者だけが利益を得て、参加者に利益が還元されないと、不公平=不満に感じる人もいるかもしれませんね。
このまとめサイトは、ソースコード置き場+自分のメモという感じで使っていますが、利益が出せるでしょうか?

営利目的の企画として行なうなら、企業や出版社等に運営してもらった方が、本格的になっていいかもしれませんね。(^^;
…どこかで「PHPでOOP」講座を作ってもらえないでしょうか?>PHPプロさんとか?

>>527
勉強するとき、本を読む人っていますよね?
本は読まない人もいると思いますが、本の情報も調べたのでついでにまとめました。

534 名前:nobodyさん mailto:sage [2008/02/25(月) 12:58:27 ID:???]
1の目的がよくわらん。
1がコテハン使ってスレをリードするのおかしいやろ?
まとめサイトも1が作るのちゃうやろ
名無しがやることやろ


535 名前:nobodyさん mailto:sage [2008/02/25(月) 13:00:22 ID:???]
1がスレをリードせんといて
長くレスが続くなら
それは本当に需要のあるスレであって
1が作り上げたスレになってるやん

536 名前:nobodyさん mailto:sage [2008/02/25(月) 13:14:26 ID:???]
>>533
1(個人)に利益が出てたら、必ず騒ぐ人が出てくる。
しかし、利益が出てなければ、その旨を断っておけば、
騒いでいる意見は無視しておけば、しばらくすれば蒸発
すると思う。

537 名前:nobodyさん mailto:sage [2008/02/25(月) 13:18:05 ID:???]
>>534
俺は1ではないが。

> 1の目的がよくわらん。
スレタイの通り。PHPでOOPを勉強する。

> 1がコテハン使ってスレをリードするのおかしいやろ?
何がおかしいのかがわからん。
こうあるべきだとかいうガイドラインでもあるわけ?

> まとめサイトも1が作るのちゃうやろ
> 名無しがやることやろ
お前のローカルルールを押し付けるな。
1がまとめサイトやめたら変わりにお前がやるのか?

538 名前:nobodyさん mailto:sage [2008/02/25(月) 13:21:26 ID:???]
>>535
お前のやりたいことの方が分からん。
変な哲学押し付けるな。

539 名前:nobodyさん mailto:sage [2008/02/25(月) 13:27:10 ID:???]
スレ主がまとめサイト作ってるスレてあるの?
広告目的以外に見たことないんだけどwww

540 名前:nobodyさん mailto:sage [2008/02/25(月) 13:30:31 ID:???]
なんで事例が必要なの?



541 名前:nobodyさん mailto:sage [2008/02/25(月) 13:35:02 ID:???]
>>539
だったら君が利用しなきゃいいだけでは?

542 名前:nobodyさん mailto:sage [2008/02/25(月) 13:35:25 ID:???]
WebProg板で
スレ主がまとめサイト作ってるスレどこにあるんだよ?

543 名前:nobodyさん mailto:sage [2008/02/25(月) 13:36:07 ID:???]
2ちゃんにふさわしくない行動は見て見ぬふりは出来んよ

544 名前:nobodyさん mailto:sage [2008/02/25(月) 13:39:24 ID:???]
1は需要のないスレを無理に上げるのやめて欲しいよ
自分の存在を認められたいだけのオナニスレだよ

545 名前:nobodyさん mailto:sage [2008/02/25(月) 13:44:21 ID:???]
アフィリエイト見てオナニスレてことに確信がもてたよ
このスレは1の自己満足以外に何も生まれないよ結果としてね

546 名前:nobodyさん [2008/02/25(月) 13:45:42 ID:nYfgU4lL]
>>543-544
何で君はスルーができないの?
誰も書き込まなければそのまま消えていくんじゃないの?

547 名前:nobodyさん mailto:sage [2008/02/25(月) 13:46:57 ID:???]
コテハン使って自慢げにソースコード公開するやつは
よほど腕に自信がある奴か
初心者相手に自己満足したい奴かのどっちか

548 名前:nobodyさん mailto:sage [2008/02/25(月) 13:47:30 ID:???]
>>545
君の語りを見てオナニレスてことに確信がもてたよ
これらのレスは君の自己満足以外に何も生まれないよ結果としてね

549 名前:nobodyさん mailto:sage [2008/02/25(月) 13:49:30 ID:???]
>>547
ああ、そうか。だったら君はもう来るな。

550 名前:nobodyさん mailto:sage [2008/02/25(月) 13:52:02 ID:???]
1が名無しとなって言い訳してるくさいな



551 名前:nobodyさん mailto:sage [2008/02/25(月) 13:54:58 ID:???]
>>550
俺は1じゃないんだけどな。言い返せなくてそれしかいえないんだな。
それにお前がここに常駐する意味はないよな。

552 名前:nobodyさん mailto:sage [2008/02/25(月) 13:58:28 ID:???]
記念パピコ

553 名前:nobodyさん mailto:sage [2008/02/25(月) 14:52:48 ID:???]
コマツも軍需だよね

554 名前:nobodyさん mailto:sage [2008/02/25(月) 17:26:59 ID:???]
さ あ 、 も り あ が っ
                  て
                     ま
                       い
                         り
                          ま
                           し
                           た

555 名前:nobodyさん mailto:sage [2008/02/26(火) 10:28:32 ID:???]
1が書き込みしないと
恐ろしいほどさびれてんねw
1だけがPHPでOOPに興味があって
その興味を無理矢理に広めようとしてる
このスレの落胆ぶり見ればよくわかるwww

556 名前:nobodyさん mailto:sage [2008/02/26(火) 12:06:28 ID:???]
PHPにかぎらず、「オブジェクト指向」が一般化したと言っても、実際にはライブラリ(フレームワークを含む)が
クラス化されて、プログラマはそれを使ってるという程度の話でしかないから、OOPそのものの話が盛り
上がらないのは、当然といえば当然。

557 名前:nobodyさん mailto:sage [2008/02/26(火) 14:01:10 ID:???]
WebProgで勢いあるのなんてくだすれぐらいだろ

558 名前:nobodyさん mailto:sage [2008/02/27(水) 22:15:02 ID:???]
何度も1のこと前向きにとらえようとしたけど
やはり1が何をしたいのかよくわからん

559 名前:nobodyさん mailto:sage [2008/02/28(木) 00:08:29 ID:???]
OOPの勉強じゃないの?

560 名前:nobodyさん mailto:sage [2008/03/01(土) 01:04:42 ID:???]
自称非営利団体の運営を本業に転換する難しさのバーチャル体験学習。
乗せられたボランティアからの不満が噴出。
ありがち。そして解散。ありがち。



561 名前:nobodyさん mailto:sage [2008/03/02(日) 15:48:10 ID:???]
私も1が必死にスレ継続させてる意味が???
営利団体なら意味はわかりますが

562 名前:nobodyさん mailto:sage [2008/03/02(日) 16:50:51 ID:???]
このスレ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


563 名前:nobodyさん mailto:sage [2008/03/02(日) 20:21:37 ID:???]
暇人乙

564 名前:nobodyさん mailto:sage [2008/03/02(日) 23:43:21 ID:???]
まー、ここで勉強するな、とは言わないけど、本気でやろうと思ってる人は、まず自分で本買うなりして勉強すると思うよ。

別に興味ないやつはスルーでも何でもしときゃいいと思う。

565 名前:nobodyさん mailto:sage [2008/03/09(日) 10:19:09 ID:???]
>>562
1自演乙!

566 名前:nobodyさん mailto:sage [2008/03/10(月) 14:48:07 ID:???]
自演度は THE END

567 名前:nobodyさん mailto:sage [2008/03/17(月) 07:13:22 ID:???]
保守

568 名前:nobodyさん mailto:sage [2008/03/28(金) 02:04:42 ID:???]
このスレで、今日から貴方もOOP!!!\(^o^)/

>>1
オッパッピーの間違いですよね

569 名前:nobodyさん mailto:sage [2008/04/20(日) 09:34:37 ID:???]
保守

570 名前:nobodyさん mailto:sage [2008/05/24(土) 06:41:54 ID:???]
保守



571 名前:nobodyさん mailto:sage [2008/06/16(月) 13:47:07 ID:???]
難解も、難解も、オブジェクト指向

572 名前:nobodyさん mailto:sage [2008/06/17(火) 12:52:46 ID:???]
スレタイの主旨からずれるけど、
やはりC言語は、一度は学んでいた方が良いな。

Javaからプログラムに入ったから、PHPのOOPでアロー演算子使うのにとても違和感あったのだけど、
Cの構造体を知って、ドットシンタックスよりアロー演算子の方が正統派と思えるようになった。

573 名前:nobodyさん mailto:sage [2008/06/17(火) 13:01:04 ID:???]
どっと疲れる

574 名前:nobodyさん mailto:sage [2008/06/17(火) 16:56:31 ID:???]
どっと込む

575 名前:nobodyさん mailto:sage [2008/07/01(火) 00:56:40 ID:???]
>>573
>>574
バカアロー

576 名前:nobodyさん mailto:sage [2008/07/27(日) 23:15:55 ID:???]
諸事情により、Web系のプログラミングから離れていたけれど、
また時間がとれたら舞い戻ってきます。よろしくw

577 名前:nobodyさん mailto:sage [2008/08/09(土) 20:52:22 ID:???]
PHPに触る機会が・・・なんで、VBばっかりなんだ・・・

578 名前:nobodyさん mailto:sage [2008/08/19(火) 00:44:43 ID:???]
保守

579 名前:nobodyさん mailto:sage [2008/08/28(木) 21:10:25 ID:???]
保守

580 名前:1 ◆SWtzLesEmM [2008/09/02(火) 15:51:27 ID:w90kCMMO]
クラスの作り方(設計)について、考え方が参考になる本がありました。

www.amazon.co.jp/dp/4798110558/
モデルとプロセスをめぐる冒険

「モデリング」ということについて調べてみると、いろいろノウハウがあるようです。



581 名前:nobodyさん mailto:sage [2008/09/27(土) 22:23:48 ID:???]
保守

582 名前:nobodyさん mailto:sage [2008/10/06(月) 00:30:42 ID:???]
保守

583 名前:nobodyさん mailto:sage [2008/10/24(金) 23:26:54 ID:???]
保守

584 名前:yodobashi mailto:sage [2008/10/26(日) 01:15:24 ID:???]
大手ECサイトのヨドバシドットコムが、サイトリニューアルから大規模な障害を3日間...
detail.chiebukuro.yahoo.co.jp/qa/question_detail.php?qid=1220150877

506 :目のつけ所が名無しさん:2008/10/26(日) 00:47:20
大手ECサイトで、ここまで派手なリリース失敗は初めて見た。
エンジニア向けIT情報誌や関連サイトは、ぜひ取材して原因を明かして欲し
いは。


585 名前:nobodyさん mailto:sage [2008/11/05(水) 20:43:48 ID:???]
保守

586 名前:nobodyさん mailto:sage [2008/11/13(木) 23:12:08 ID:???]
保守

587 名前:nobodyさん mailto:sage [2008/11/15(土) 09:19:30 ID:???]
定期的に保守してるの誰?
糞スレに対してその執念が怖いんだが。。。


588 名前:nobodyさん mailto:sage [2008/11/23(日) 22:46:31 ID:???]
お前の粘着質の方が怖い

589 名前:nobodyさん mailto:sage [2008/11/29(土) 11:22:40 ID:???]
PHP でオブジェクト指向の設計をするための 7 つの良い習慣を身につける
www.ibm.com/developerworks/jp/opensource/library/os-php-7oohabits/

PHP での適切な OO の習慣を身につけることによって、より安定していて、保守が容易で、拡張も容易にできるアプリケーションを作成することができます。そのためには、次のことを忘れないでください。

* 控え目である
* 良き隣人である
* メドゥーサを見ないようにする
* 結びつきを極力弱くする
* 結束性を高める
* 家族の一員として扱う
* パターンで考える

こうした習慣を身につけ、使いこなせるようになると、皆さんはきっとアプリケーションの品質が変わったことに驚くはずです。

590 名前:nobodyさん mailto:sage [2008/11/30(日) 22:51:36 ID:???]
内容は否定しないが、その書き方はどうかなと思うな。
英語の翻訳だからなのかな。
「メドゥーサを見ないようにする」なんて飛躍した比喩表現では
イメージつかないだろw



591 名前:nobodyさん mailto:sage [2008/11/30(日) 23:12:38 ID:???]
phpspot.org/blog/archives/2008/11/php_7_1.html
パクりblog乙

592 名前:nobodyさん [2008/12/01(月) 12:13:27 ID:YUzphIUV]
>>589
メデューサの項目でインタフェースを使う意義って何?
ファクトリーパターンの利点しか説明してないような気がするんだが

593 名前:nobodyさん mailto:sage [2008/12/02(火) 01:29:02 ID:???]
>>591
広告の方が多いってどうなんだよ
1:4で広告じゃねーか


594 名前:nobodyさん mailto:sage [2008/12/04(木) 18:30:24 ID:???]
DIコンテナとかどうなのか






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前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