X



PHPでOOP
00011 ◆SWtzLesEmM
垢版 |
2007/02/23(金) 13:35:52ID:???
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^)/
0002nobodyさん
垢版 |
2007/02/23(金) 13:38:15ID:???
初心者にもわかるようにメリットぐらいかいてよ・・。
0003nobodyさん
垢版 |
2007/02/23(金) 13:41:55ID:???
インスタンスとインヘリタンスがまぎわらしい(なぜか変換・・・
00041 ◆SWtzLesEmM
垢版 |
2007/02/23(金) 13:42:26ID:???
オブジェクトと関数の本質的な違いと使い分け
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
00051 ◆SWtzLesEmM
垢版 |
2007/02/23(金) 13:51:33ID:???
>>2
ttp://d.hatena.ne.jp/toku-hiro/20060826
この説明見てなるほどな〜〜〜!と思いました^^

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

「クラス」という仕組は便利そうですね。クラスを考えた奴、偉い!
00061 ◆SWtzLesEmM
垢版 |
2007/02/23(金) 13:54:53ID:???
>>3
なんかプログラミングって、カタカナ用語がたくさん登場しますよね><
クラスって聞いたら学校の「教室」を連想しちゃう><
0009nobodyさん
垢版 |
2007/02/23(金) 16:52:36ID:???
トリップ出してるのに自作自演もくそもあるのかw
00101 ◆SWtzLesEmM
垢版 |
2007/02/23(金) 19:44:43ID:???
>>7
>Webでオブジェクト指向
>http://pc10.2ch.net/test/read.cgi/php/1133489897/
>こっちじゃ何故駄目なんだ?

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

PHPに的を絞った情報が欲しいので、専用のスレを立ててみました。
もちろん、JavaやRuby、Pythonとかも使えればいいけど、そこまで手を広げる時間がないので、とりあえず今の段階ではPHPで勉強。
PHPを使っていて、オブジェクト指向プログラミングのやり方を勉強したい人がいたら一緒に勉強していきましょう。
よろしく(・∀・)
0011nobodyさん
垢版 |
2007/02/23(金) 21:14:52ID:???
>>9
ちげーよ
自分のサイトの宣伝して
「この説明見てなるほどな〜〜〜!と思いました^^」
と書いてるところがだよ
0012nobodyさん
垢版 |
2007/02/23(金) 21:34:47ID:???
>>11
OOPのメリット聞かれたから自分で見つけた参考サイト出して自分の所感言っただけだろ。
聞くだけで何もしない厨より、アクティブな>>1に好感が持てたが。

って擁護すると自演って言うのかな?
0013nobodyさん
垢版 |
2007/02/23(金) 22:38:47ID:???
まあ、PHPでOOPなんてのは、今までて来たtoku-hiroさん以外にも
書いている人は多そうだから(俺は知らないけど)
他のも出せば、>>1の疑いは晴れるんじゃないかな。
00171 ◆SWtzLesEmM
垢版 |
2007/02/24(土) 00:03:56ID:???
PHP4のオブジェクト指向、デザインパターンについての説明がありました。
http://www.aglabo.com/agl/proevo/PHP/objectbrain/4-composite2.html

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

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

今の段階では、ちょっとよく理解できませんでしたがこんな話もあるんですね。
0018nobodyさん
垢版 |
2007/02/24(土) 00:47:36ID:???
初心者のおれも学習するから講義すすめてくれ
0019nobodyさん
垢版 |
2007/02/24(土) 01:05:02ID:???
>>18
わかった。

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

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

0020nobodyさん
垢版 |
2007/02/24(土) 13:35:58ID:???
オブジェクトを利用すると何がいいのか一言でまとめて
0021nobodyさん
垢版 |
2007/02/24(土) 13:43:25ID:???
プロとしての自信が持てるようになります
00221 ◆SWtzLesEmM
垢版 |
2007/02/24(土) 16:26:54ID:???
とりあえず簡単なWEBアプリケーションを作りながらOOPの勉強をしてみたいです。
OOPで掲示板を作ってみたいです。

(1)最初はOOPを使わないで掲示板を作ってみる
(2)次にOOPで同じ掲示板を作ってみる
という流れにすると、対比によってOOPが理解しやすくなるでしょうか?
=始めに完成形ありきと。
00231 ◆SWtzLesEmM
垢版 |
2007/02/24(土) 16:34:22ID:???
掲示板の機能としては、

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

という最低限の機能で作ってみて、
後から徐々に機能を追加して拡張してみましょう。
00241 ◆SWtzLesEmM
垢版 |
2007/02/24(土) 16:45:34ID:???
データベースは普段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切れのっているかという違い…些細なことはどうでもいいか。
00251 ◆SWtzLesEmM
垢版 |
2007/02/24(土) 16:53:26ID:???
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」という句を削らないとエラーになると思います。
00261 ◆SWtzLesEmM
垢版 |
2007/02/24(土) 17:00:26ID:???
画面は、>>23の(1)〜(3)の3画面を用意すればOKかな?
画面(ハリボテ)を先に作ってみて、それにプログラムを付けて動くようにしてみます。

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

http://itpro.nikkeibp.co.jp/article/COLUMN/20070214/261859/
「HTML画面をそのまま仕様書に」,5カ月で1000画面を構築した就職サイトPuffの高速開発手法
00281 ◆SWtzLesEmM
垢版 |
2007/02/24(土) 20:07:40ID:???
>>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 ;
0029nobodyさん
垢版 |
2007/02/25(日) 02:57:19ID:???
サンプルページ公開して
00302
垢版 |
2007/02/25(日) 16:11:09ID:???
定番のhelloを表示w
class hello {
var $aisatu = "こんにちは";
}

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

読み図ら買ったら適当に改行して
00312
垢版 |
2007/02/25(日) 16:19:08ID:???
#オブジェクト学校のhelloクラスを作る
class hello {


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


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




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


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


#魔法にかかった生徒挨拶君をおまえらのディスプレイに召還する。
echo $aisatu;
0032nobodyさん
垢版 |
2007/02/26(月) 16:35:48ID:???
コードの解説なんてしなくても見ればわかる。
「なぜOOP」か、だとか、
こういう場合にOOPが役立つ、というのを具体的なコードで示してくれ
0033nobodyさん
垢版 |
2007/02/26(月) 18:41:14ID:???
namespace は結局 PHP5 では実装されなかったんだね・・・・
悲しい。悲しすぎる。
0034nobodyさん
垢版 |
2007/02/26(月) 23:07:07ID:???
MVCのMをOOPでCは手続きVはテンプレート
00351 ◆SWtzLesEmM
垢版 |
2007/02/27(火) 15:21:07ID:???
>>22 (1)最初はOOPを使わないで掲示板を作ってみる
OOPを使わないで作った簡単な掲示板をアップしてみます。

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

/index.html 掲示板のトップページ
/db.php データベースの接続関係のデータのファイル
/input.php メッセージ入力ページ
/list.php メッセージ一覧ページ
/message.php メッセージ詳細ページ
00361 ◆SWtzLesEmM
垢版 |
2007/02/27(火) 15:22:07ID:???
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>
00371 ◆SWtzLesEmM
垢版 |
2007/02/27(火) 15:24:34ID:???
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");
}

(以下、続く)
00381 ◆SWtzLesEmM
垢版 |
2007/02/27(火) 15:25:32ID:???
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;
}
00391 ◆SWtzLesEmM
垢版 |
2007/02/27(火) 15:26:17ID:???
db.phpの続き(その2)です。

//MySQLプリペアードステートメント関数(SQLインジェクション対策)
//(参考)http://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;
}
?>
00401 ◆SWtzLesEmM
垢版 |
2007/02/27(火) 15:30:07ID:???
input.phpの内容は以下の通りです。

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

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

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

(以下、続く)
00411 ◆SWtzLesEmM
垢版 |
2007/02/27(火) 15:30:59ID:???
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 = "http://";.$_SERVER['HTTP_HOST']."/test2/list.php";//メッセージ一覧
header("Location: ".$url);
exit;
}
} else {
$error_msg = "名前、タイトル、メッセージをすべて入力してください。";
}
?>
00421 ◆SWtzLesEmM
垢版 |
2007/02/27(火) 15:34:29ID:???
>>41
間違えました。

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

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

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

もう一回訂正してアップします。
00431 ◆SWtzLesEmM
垢版 |
2007/02/27(火) 15:40:30ID:???
>>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 = "http://";.$_SERVER['HTTP_HOST']."/list.php";//メッセージ一覧
header("Location: ".$url);
exit;
}
} else {
$error_msg = "名前、タイトル、メッセージをすべて入力してください。";
}
?>

(以下、続く)
00441 ◆SWtzLesEmM
垢版 |
2007/02/27(火) 15:42:00ID:???
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>
00451 ◆SWtzLesEmM
垢版 |
2007/02/27(火) 15:44:03ID:???
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());
?>
00461 ◆SWtzLesEmM
垢版 |
2007/02/27(火) 15:45:25ID:???
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>
00471 ◆SWtzLesEmM
垢版 |
2007/02/27(火) 15:46:10ID:???
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>
00481 ◆SWtzLesEmM
垢版 |
2007/02/27(火) 15:47:39ID:???
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);
}
?>
00491 ◆SWtzLesEmM
垢版 |
2007/02/27(火) 15:49:23ID:???
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>
00501 ◆SWtzLesEmM
垢版 |
2007/02/27(火) 15:50:12ID:???
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>
00511 ◆SWtzLesEmM
垢版 |
2007/02/27(火) 15:59:41ID:???
それでは、次行ってみよう!
>>22 (2)次にOOPで同じ掲示板を作ってみる

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

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

(1)コントローラー(+アクション)→input、list、message
(2)モデル→データベース接続処理も1つのクラスにするのでしょうか?
(4)ビュー→テンプレートシステムへの出力
というかんじで3個のクラスが必要でしょうか?
それぞれのクラスに必要なプロパティとメソッドを何にするか?
クラスを考えて、UMLでクラス図を作ってみたいです。
0052nobodyさん
垢版 |
2007/02/27(火) 22:54:58ID:???
がんばってるなあ。
おれもがんばろう。
0053nobodyさん
垢版 |
2007/02/28(水) 03:12:15ID:???
わかりにくいからWebサイトにまとめてくれ。PHP使いなんだし
00541 ◆SWtzLesEmM
垢版 |
2007/02/28(水) 20:49:38ID:???
>>53
まとめサイトを設置しました。
ttp://kameleon.s241.xrea.com/dokuwiki/doku.php
0055nobodyさん
垢版 |
2007/02/28(水) 22:48:34ID:???
最終的にMVCな構成を目標に
少しずつリファクタリングしていけばよいと思う

とりあえずDBアクセスを一箇所にまとめるモデルを作ってみるといいんじゃない
・全件取得
・1件取得
・1件追加
できるMessageクラスとかを作ってそこにDBアクセス(SQL)をまとめれ
0056nobodyさん
垢版 |
2007/03/03(土) 13:53:29ID:Ej/v+KpC
期待上げ
0057nobodyさん
垢版 |
2007/03/04(日) 04:17:32ID:xhaosu8B
期待
0058nobodyさん
垢版 |
2007/03/11(日) 11:30:29ID:???
OOP勉強したいなら、実力不足のやつが書いたガラクタ掲示板スクリプトを
読むより、有名なオープンソースのスクリプトを読めばいいじゃん。
そもそも>>1の意味不明な独善なんかに付き合わなくてもOOPに関する情報
はいくらでも手にはいるし。
0059nobodyさん
垢版 |
2007/03/11(日) 23:56:02ID:???
ど素人に肥大したコードを読ませて理解できると思ってる思考回路がカコイイ!
0060nobodyさん
垢版 |
2007/03/12(月) 08:27:35ID:cm9vlrfS
>>59
ど素人はみんな、自分みたいな学習意欲も向上心もない人間だと思ってる
思考回路がカコイイ!
0062nobodyさん
垢版 |
2007/03/12(月) 09:57:59ID:???
>>59-61
全員カコワルイ!! 俺はカコイイ!!
0064nobodyさん
垢版 |
2007/03/12(月) 14:07:03ID:???
で、結局荒れ放題になり>>1の独善は無事終了したのだった。
ちゃんちゃん。
00651 ◆SWtzLesEmM
垢版 |
2007/05/12(土) 03:12:14ID:???
>>55
DBにアクセスするためのクラスを作ろうと思って、とりあえずdb.phpをクラスの形に変えてみようと試みました。
だけど、コンストラクタでエラーが出てストップ!
Fatal error: Cannot access empty property in /…/test.php on line 18

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

ところで、このbnoteというサイトのPHP解説記事には、掲示板を作ってみるサンプルがあり、参考になりそうです。
http://www.bnote.net/php/php_idx.shtml
>PHPでフォーラムを作ろう!
0066nobodyさん
垢版 |
2007/05/12(土) 16:09:18ID:???
中傷されている>>1だが、
普通に>>1のおかげでだいぶいい情報が手に入った。
曖昧だったクラスがなんとか分かりそうだよ。
ありがとー
PHPでわからない人は情報が足りないのかもな。
似てるJAVAで本格的なものを見てみると分かるのかも。

昔、歴史で年表同士のつながりが薄くて分かりづらかったように、
もっと詳しく高校の歴史くらいのをみれば分かりやすい。
0067nobodyさん
垢版 |
2007/05/12(土) 23:32:04ID:s118dfiw
なんていうか「こういうときにはこういう設計をします」っていう
具体的な情報がほしいよな
俺は車なんかプログラミングしないっての
0068nobodyさん
垢版 |
2007/05/14(月) 00:46:15ID: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バリバリなので、勉強になること間違いなし!
0069nobodyさん
垢版 |
2007/05/15(火) 15:55:34ID:???
しかし PHP関連の本でOOPをわかりやすく書いてあるのが



「ない!」 お勧め教えて
0070nobodyさん
垢版 |
2007/05/15(火) 16:01:33ID:???
本なんか読むよりPEARやフレームワークのソース読んで
勉強しながら自分なりに書いていけ、金かからないしだしそれが一番の近道
気が付いたらOOPなんて空気のように有って当たり前になるもんだから
0071nobodyさん
垢版 |
2007/05/15(火) 16:06:06ID:???
わかりにくいの例として

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

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

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

糞った本しか読んでいないかもしれないが一応書いておく
「PHP5プログラミング エキスパート編」 //最強の意味不明
「MySQL4/PHP5によるWebデータベース構築」 //わかりやすいがODPの章になると意味不明
0072nobodyさん
垢版 |
2007/05/15(火) 16:08:18ID:???
書きながら次第にむかつき度が増加して誤字だらけになった(怒

>>70
それ疲れる
0073nobodyさん
垢版 |
2007/05/15(火) 17:01:49ID:???
>>69
独習PHPのクラスらへんの説明は中々分かりやすいよ。
作者があまりいいとはいえんが、ファーストステップにはいい感じ。
0074nobodyさん
垢版 |
2007/05/22(火) 15:14:54ID:???
同じ事を色々な言葉で表現するから迷うずら
PHPの本読むよりJAVAの本読んだほうが理解できる罠。
0075nobodyさん
垢版 |
2007/05/28(月) 14:46:00ID:???
自分が作るだけなら手続き型でいいけど
人の作ったライブラリ使いたいから
最低限、何が書いてあって何をしているのか読めるようになりたい
0076nobodyさん
垢版 |
2007/05/29(火) 05:34:16ID:???
答えが出てるじゃないか。その使いたいライブラリのコードを読め
0077nobodyさん
垢版 |
2007/06/05(火) 12:23:56ID:/w569Zaf
OOPS
0079nobodyさん
垢版 |
2007/06/11(月) 22:06:39ID:2dWIuVC4
>>65に誰もつっこまないのかよ!!

DBアクセスの為のクラス書くのかw
おそらくPHPインストール時に君のHDDの中にすでに入ってる訳だが…
しかもあらゆるDBに同じ書式でアクセス出来るやつが…
0081nobodyさん
垢版 |
2007/06/12(火) 00:15:06ID:???
PEARのソースは読まない方が身のため
0082nobodyさん
垢版 |
2007/06/12(火) 06:55:41ID:e4tfCBN5
79は勘違いしてるが、彼がいいたいのはPearのDBクラスのことだろう
0083nobodyさん
垢版 |
2007/06/12(火) 09:31:07ID:???
82が勘違いだろ。
単にPDOだろ
00841 ◆SWtzLesEmM
垢版 |
2007/06/12(火) 10:24:12ID:???
>>73
情報提供どうもありがとうございます。
独習PHPは、図書館でかりて読んでみました。
オブジェクト構文の説明は分かりやすいと思いました。

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

>>82
PHP5に標準で用意されているPDOのことですね。
http://jp2.php.net/pdo
PHP Data Objects (PDO) 拡張モジュールは、 PHP の中からデータベースにアクセスするための軽量で高性能な インターフェイスを定義します。
PDO は PHP 5.1 以降にバンドルされており、PHP 5.0 では PECL 拡張モジュールとして使用可能です。
PDO は PHP 5 の新機能である オブジェクト指向機能を使用しており、それより前のバージョンの PHP では動作しません。
0085nobodyさん
垢版 |
2007/06/12(火) 10:56:05ID:???
mysqliとどっちがいい?
0086nobodyさん
垢版 |
2007/06/12(火) 17:53:32ID:???
ふとおもったんだが、>>1はできるんじゃないのか。
0087nobodyさん
垢版 |
2007/06/17(日) 01:20:06ID:???
被害者増やさないように書いておく。
「PHPデザインパターン入門」は買うな。

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

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

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

中身薄くて有名なヤマダヨウカン本の方がマシに感じるレベル。
0088nobodyさん
垢版 |
2007/06/17(日) 01:28:20ID:???
なんか良く読むと、この本は解説の日本語が
オブジェクト指向で書かれてる気がした。

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

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

この本理解するには色んな本を買って、全部理解した後じゃないと
読めない。意味ねえじゃん。
0089nobodyさん
垢版 |
2007/06/17(日) 01:54:28ID:???
軽いフレームワークいじって使うのが一番いいオブジェクト指向の勉強だよ
0090nobodyさん
垢版 |
2007/06/17(日) 14:22:50ID:???
ウェブアプリにオブジェクト指向なんていらないよ。どうせ文字列を加工してデータベースのテーブルのカラムに並べるだけなんだから。
0091nobodyさん
垢版 |
2007/06/17(日) 18:51:52ID:???
じゃどういうときに必須なんよ
0092nobodyさん
垢版 |
2007/06/24(日) 17:09:42ID:???
オブジェクト指向と言う言葉にまどわされず、
クラスの勉強をすればいいんだよ。 

単に、呼び出してるだけだから。 
0093nobodyさん
垢版 |
2007/06/24(日) 19:32:38ID:???
PEARをサンプルみながら見よう見まねでインスタンス作って
なんだかんだで実際動いてるんだけど何してるかイマイチ理解出来てないんだよね
functionの中でインスタンス作るとその外側ではやっぱアクセスできないのかな
PEARDBのインスタンスがあっちゃこっちゃに散らばっちゃって困る
00951 ◆SWtzLesEmM
垢版 |
2007/07/06(金) 14:33:24ID:???
>>68
>拡張がやりやすい(やりやすく作ることが出来る)
そうみたいですね。
http://www.amazon.co.jp/dp/4822281957/
「オブジェクト指向でなぜつくるのか」
という本にも、クラスを使うメリットが同じように説明されていました。(・∀・)

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

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

>>89
Zend Frameworkの正式版が出ましたね☆
http://framework.zend.com/manual/ja/
シンプルなフレームワークを検索したら、CodeIgniterというのがありました。
http://userguide.cilab.info/
0096nobodyさん
垢版 |
2007/07/08(日) 18:20:46ID:XFKJF1H9
最近このスレが怖くて見れん俺ガイル
なんでそんな成長早いんだよ・・・おかしいだろ・・・orz
0097テレビできたよー
垢版 |
2007/07/10(火) 15:53:51ID: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 />";
  }
 }
0098テレビできたよー
垢版 |
2007/07/10(火) 15:54:22ID: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();
0099nobodyさん
垢版 |
2007/07/11(水) 10:41:20ID:???
例外投げるようにすれば?
01001 ◆SWtzLesEmM
垢版 |
2007/07/11(水) 12:59:29ID:???
例外処理
http://www.phppro.jp/word/E4BE8BE5A496E587A6E79086

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

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

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

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

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

↑とのことですが、汎用性のある関数やメソッドにしたい場合、エラーが発生したときの処理を書く場所は、関数やメソッドを使う方(呼び出す側)にすることもあるでしょうか?
=戻り値をチェックするというのは、古いやり方なんでしょうか?
01011 ◆SWtzLesEmM
垢版 |
2007/07/11(水) 13:07:20ID:???
>>96
PHPプロのメルマガ読んで、知ったかぶりなだけですw
お互いがんばりましょう☆(・∀・)
0102nobodyさん
垢版 |
2007/07/11(水) 14:16:38ID:???
いやさ,まず公式マニュアルを読む癖を付けようぜ
0103nobodyさん
垢版 |
2007/07/11(水) 14:44:53ID:???
MVCじゃないとOOPなんて意味ないですかr
0104nobodyさん
垢版 |
2007/07/11(水) 17:30:14ID:???
( д)      ...。。
0105nobodyさん
垢版 |
2007/07/12(木) 02:57:31ID:???
MVCもデザインパターンの一種じゃなかったっけ?
0106nobodyさん
垢版 |
2007/07/12(木) 08:06:18ID:???
>>100
なんかphpspotのその文はおかしいな。
エラー処理は例外を使おうがそうじゃなかろうが変わらない。
呼ばれた側はどういうエラーがあったか返す責任があるし、
呼んだ側は返ってきたエラーをチェックする責任がある。
エラーが起きた時の挙動を自分で決めれるならその場で処理すれば良いし、
そこではまだ決められないならさらに上位へreturnなりthrowすれば良い。

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

例外処理?なにそれうまいの?
0108nobodyさん
垢版 |
2007/07/14(土) 18:34:23ID:???
ダンボールの味がするお
0109nobodyさん
垢版 |
2007/07/14(土) 19:32:25ID:???
おまいらオブジェクト指向に騙されてるよ。ただのデータ型に過ぎない。
0110nobodyさん
垢版 |
2007/07/14(土) 19:46:31ID:w3CTKtks
今、習作としてプロフィールスクリプト(っていうのも大袈裟なぐらいショボイやつ)を書いてるんだけど、どうにも悩む。悩む。
とりあえず、
-質問と答え(Entry)
--セッタ(SetQuestion,SetAnswer)
--ゲッタ(GetQuestion,GetAnswer)
-それらのEntryを編集したり、操作したりする(ManageEntry)
--POSTされたデータにEntryの値を変更する(EditEntry)
-プロフィール自体(Profiel)
--質問と答えを出力(ViewProfiel)
こんなクラスたちを作ったんだけどなんかおかしい気がしてならない。
とくにManageEntryのとことか。
ManageEntryでEntryオブジェクトの配列Entriesを作っといてそれをそのクラス内で操作とか?は?え?
OOPムズイ、ナキタイ


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

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

CakeとかSynfonyみたいな、ライブラリじゃないフレームワークを
使い込んでソース読んだら、どう設計したらよいか一気に分かるよ。
0112nobodyさん
垢版 |
2007/07/14(土) 22:22:33ID:w3CTKtks
継承とメソッドの追加ってどうやるんですか><;
正直どうやったらいいのか全くわからん。
プロフィール?え?あ?あはあは。
0114nobodyさん
垢版 |
2007/07/15(日) 00:19:07ID:???
Synfony はつっこんだ方(ry
01151 ◆SWtzLesEmM
垢版 |
2007/07/26(木) 10:21:49ID:???
>>106
>呼ばれた側はどういうエラーがあったか返す責任があるし、
>呼んだ側は返ってきたエラーをチェックする責任がある。

なるほど〜(・∀・)
呼ぶ側と呼ばれた側のそれぞれでエラーの対処があれば、手堅いですね!
大変参考になりました。
01161 ◆SWtzLesEmM
垢版 |
2007/07/26(木) 10:29:09ID:???
掲示板の続きを作りました。
DBにアクセスする機能をクラスにしてみました。
http://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

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

なんか、>>55さんのアドバイスの形になってませんが…orz
とりあえず、DBアクセスをクラスの形にできたので一歩前進!!!\(^o^)/
01171 ◆SWtzLesEmM
垢版 |
2007/07/26(木) 10:50:37ID:???
>>110
おー、ガンバレ〜〜〜☆

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

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

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

というかんじになるんでしょうか?
どういうまとまりでクラスにすればいいのか、そこら辺がなんかよく分からないんですよねー(ノ∀`)
0119nobodyさん
垢版 |
2007/07/27(金) 00:44:20ID:???
おんにゃにょこの
おっぱい
ぷぴにぷにだにょ〜
0121nobodyさん
垢版 |
2007/07/30(月) 03:51:10ID:???
function &foo {
echo "ほげ"


こういうやつ、「リファレンスを返す」っていうんですか?
これはどういう処理をしているんでしょうか?
どこかで定義されているfoo()という関数に何かしているんですか?
0122nobodyさん
垢版 |
2007/07/31(火) 07:40:25ID:???
高機能な参照関数だな
0123nobodyさん
垢版 |
2007/08/01(水) 06:30:28ID:abLVM2kM
>>87
買ってしまっていたよ。Iteratorまで読んだけど、
分かったような分からないような気分。

説明が少ない&下手なのは分かった。
0124nobodyさん
垢版 |
2007/08/01(水) 22:18:22ID:???
分からない人に分かるように書いてないという意味では同意。
書いてあることを全て理解していこうとするとこんがらがってくるしね。
まぁいい頭の体操になったけど。
あんなサンプルのためのサンプルではなく、具体的な使い方と利点が書いてあるとOOP素人にも理解しやすかったかもね。
0125522
垢版 |
2007/08/26(日) 13:53:57ID:QzPwO1Nh
>>117
なんかCakePHP使ってみたんだけど質問と答えを操作するクラス作って云々みたいになって結局>>110と同じような感じになっちゃいましたとさ・・・
「モノ」に書く機能とか読む機能持たせていーの?おしえてえろいひと><
0126nobodyさん
垢版 |
2007/08/26(日) 14:28:30ID:???
お前が「モノ」をどう捉えるか次第だよ
0127nobodyさん
垢版 |
2007/08/28(火) 02:25:00ID:???
結局どうやってデータを保持したら、人間にとって分かりやすいか、コンピュータにとってやさしいかってことだろ。
0128nobodyさん
垢版 |
2007/10/03(水) 02:51:35ID:???
オブジェクト指向は木構造を再現しようとしているだけ。
インスタンスだのオブジェクトだのは枝、茎、葉、花、果実を作るというだけ。
mainでは結果(果実)だけをとりたいから枝やら茎やらは見えなくしとけってことだろ?
0130nobodyさん
垢版 |
2007/10/03(水) 23:45:33ID:???
まぁ、ファイルの管理方法も木構造だし、インターネットなんていっても網状でなく、
サーバーを経由した木構造になってることから演算機が理解しやすいデータ構造は木構造である。
こういってしまっても過言ではないと思う。


例えば、手続き型は東京の小さなバイク便が地方への配達を頼まれても東京発で請け負うみたいなもの。
それに対して、OODはヤ○ト運輸が東京で頼まれた配達を一旦、地方の配送センターに送るようなもの。
配達する対象が少なければ、バイク便に頼んだ方が早いかもしれないけど、数が多くなるとヤ○ト運輸。
0131nobodyさん
垢版 |
2007/10/05(金) 01:16:19ID:???
うん、ここ数日でオブジェクト思考勉強してて分かったこと。
ちなみに128==130==漏れです。

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

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

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

実行結果
 果実クラス…土に還り、新たな種となりました(プロジェクト成功)
0132nobodyさん
垢版 |
2007/10/05(金) 20:07:34ID:???
なんかすぐ動いて実用的で簡単なサンプルください
0133nobodyさん
垢版 |
2007/10/05(金) 20:35:14ID:???
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;



適当に書いてみた。あとは時間をゴニョゴニョするだけ、普通に作ったほうがメリット大きい気もするがキニシナイ!!
ヨウカソマソ参上===[・∀・]ノシ
0134131
垢版 |
2007/10/05(金) 23:40:29ID:???
実際に設計して、作ってみるとオブジェクト指向の本質は"同じことは出来るだけ"しない。
この論理で動いてるような気がしてきた。何でもかんでもオブジェクトにするのではなく、
運搬の頻度が激しいデータ、プログラム中で何度も使用するデータをオブジェクトにする。
そんな感じで合ってるのかな?あと、変数の受け渡しは原則、参照で行うみたいな。
0135131
垢版 |
2007/10/06(土) 13:37:33ID:???
何となく掴めてきた。もっかい木構造で表してみる。

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

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

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

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


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

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

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

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

ただソース理解しても自分では何もできないんですけどねw
0137nobodyさん
垢版 |
2007/10/07(日) 19:12:30ID:???
掲示板の改良はどうします?
0139nobodyさん
垢版 |
2007/10/07(日) 21:09:36ID:???
OOPで作ったやつの
ソースとかうpったら
なんか色々言ってもらえるんかな?
このスレでは
0140nobodyさん
垢版 |
2007/10/07(日) 21:46:16ID:???
>>139
自分も変なソースですけど味見してもらえます?
恥ずかしいです><
0141nobodyさん
垢版 |
2007/10/08(月) 09:30:37ID:???
>>133
これをどうやって使えばいいんですか
0143nobodyさん
垢版 |
2007/10/09(火) 22:34:59ID:???
MVCのコントローラについてどこまでクラスにするか迷っています・・・
0145nobodyさん
垢版 |
2007/10/12(金) 03:46:51ID:???
意味わかんね
どこまでクラス?
0146nobodyさん
垢版 |
2007/11/12(月) 13:32:18ID:???
まずはモデルでしょ
0149nobodyさん
垢版 |
2007/12/19(水) 01:29:29ID:???
>>147
読み込んでも八割がた無駄なので使わない
0152nobodyさん
垢版 |
2007/12/29(土) 00:05:37ID:4ZpocZiG
MVCのCってどうやって書けばいいのかわからんぜ。
0153nobodyさん
垢版 |
2007/12/29(土) 02:00:56ID:???
その概念中でコントローラーが理解出来ないってやつ初めてみた

とりあえずView上で必要な操作を徹底的にControllerに切り離すが良い。
そしてModelからデータを引き出して必要があれば書き込み更新してやりなさい。
0154nobodyさん
垢版 |
2007/12/31(月) 19:44:35ID:???
ユーザークラスで新規登録処理をして、そのときにユーザークラスの中で
プロフィールクラスのオブジェクトを作ってプロフィールの登録もする

これってしいて言えば何パターン?
0156nobodyさん
垢版 |
2008/01/01(火) 00:16:32ID:???
パターンというかコンポジションでそ
0157nobodyさん
垢版 |
2008/01/29(火) 11:18:04ID:???
模範解答は無いけれど、以下の相互変換を行うクラス(ChStr)をみんなで
作ってみるという案はどうかな?
そして、これが出来たら、ログファイルに保存などの機能をつけ、
wikiみたいに編集が出来る機能を追加していくという感じに。

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

<出力>
-------------------------------------------------------------
<b><font size="+1">2ch</font></b><br>
<b>2ch</b>とは、総合掲示板のことである。<br>
link:<a href="http://www.2ch.net">http://www.2ch.net<;/a><br>
-------------------------------------------------------------
0159nobodyさん
垢版 |
2008/01/29(火) 11:43:55ID:???
>>158
C++のOOPの勉強として、文字列を簡単に扱うことが出来るクラスを
自作してみるという演習があったので、それをPHPでもやってみようかなと
思ったものです。
Cでは、文字列を結合したり、splitしたりするのが結構大変なので、
この演習が役に立ったなと思っていたのです。
PHPの場合は、関数を使えばそれで終わってしまうので、もう少し
ひねりを入れたものを考えて見ました。

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

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

ほら、このクラスがあるとレイアウトを変えたりが、やり易い上に
再利用性が高いでしょ?みたいな。
01601 ◆SWtzLesEmM
垢版 |
2008/01/29(火) 11:47:24ID:???
OOPの参考になる解説がありました。

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

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

インターフェイス
http://www.phppro.jp/phpmanual/php/language.oop5.interfaces.html
あるクラスが実装する必要があるメソッドの種類を、これらのメソッドの実体を定義することなく、指定するコードを作成できるようになります。
インターフェイスはキーワードinterfaceにより定義され、通常のクラスと同様に定義することができますが、メソッドの実装は全く定義されません。
01611 ◆SWtzLesEmM
垢版 |
2008/01/29(火) 12:00:16ID:???
>>159
なるほど!(・∀・)
文字列を扱う処理は、いろんなところで出番がありそうですね!
wikiの文法(表記方法)が使える掲示板とか作れそう^^
0162nobodyさん
垢版 |
2008/01/29(火) 12:04:23ID:???
ChStr クラス の設計はこんな感じかな。

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

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

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

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

---------------------------------------------------
本当は、ログファイルへの保存や読み取りなどを機能として
考え、そのあたりまで含めたクラスの設計をした方が
いいんだろうけれど、まずは簡潔にする方向でいきます。
で、後々拡張の方向で。
01641 ◆SWtzLesEmM
垢版 |
2008/01/29(火) 12:25:09ID:???
>>162
こんなかんじのプログラムと似ているかもしれませんねー。

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

↑置き換えるパターンに応じて、別々のメソッドを用意したら便利でしょうか?
= 文字サイズ変更、''' 強調、link: リンクとかの記法の置換を担当するprivateメソッド
01651 ◆SWtzLesEmM
垢版 |
2008/01/29(火) 12:34:03ID:???
OOPの参考になる解説がありました。

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

クロージャっていう仕組みは、PHPにはないですね?><
大は小を兼ねる…クロージャの代わりにオブジェクトが使えればとりあえずOKかな?(・∀・)
0166nobodyさん
垢版 |
2008/01/29(火) 13:15:31ID:???
>>161
>wikiの文法(表記方法)が使える掲示板とか作れそう^^

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

-------------------------------------------------------------------------
この ChStr に汎用性を持たせる場合は、Write_html()というよりも、
Get_html()とし、html文字列を return する事になるでしょう。
そうすると、別なプログラムで、「出力結果をファイルに保存する」という
使い方も出来ます。しかし、今回は初回なので、Write_html()とし、
メソッド内部で echo 使うことにします。
0168nobodyさん
垢版 |
2008/01/29(火) 13:22:48ID:???
>>166
学ぶために具体的に物を作るのと、実用性を考えて物を作るのは
別だと思う。なので、今回はこれでいいと考えている。
現に、初心者向けの書籍に載っているソースの実用性はゼロだ。
0169nobodyさん
垢版 |
2008/01/29(火) 13:59:05ID:???
とりあえず、全体構成の確認のために書いてみた。
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;
}
}
?>
0170nobodyさん
垢版 |
2008/01/29(火) 14:03:31ID:???
[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>
01711 ◆SWtzLesEmM
垢版 |
2008/01/29(火) 14:10:04ID:???
>>166
確かにそうなんですが、「勉強のため」という目的もあるので、自分で作ってみるというのもありでしょうか?^^
でも、答えが分かっている問題を解くのは楽ですね。>Text_wiki

車輪の再発明 - Wikipedia
http://ja.wikipedia.org/wiki/%E8%BB%8A%E8%BC%AA%E3%81%AE%E5%86%8D%E7%99%BA%E6%98%8E
車輪の再発明とは、「広く受け入れられ確立した技術や解決法を無視して、同様のものを再び一から作ってしまう事」を意味する
ある技術の意味を理解させるために、意図的に車輪の再発明を行わせる場合がある
01721 ◆SWtzLesEmM
垢版 |
2008/01/29(火) 14:19:35ID:???
wikiとか文字列を処理する仕組みは、「パーサー」とか「構文解析」っていうみたいですね(´∀`)

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

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

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

PHP用の汎用WikiParser作り中
http://tdiary.ishinao.net/20050323.html
RandomNote/PHPについて
http://tbox.jpn.org/wiki/rnh/index.php?AboutPage.txt
0173nobodyさん
垢版 |
2008/01/29(火) 14:21:38ID:???
今後の課題と予定
・ch_to_html() の中身を書く。
・[text.php] の機能を充実(テキストファイルに保存するなど)させ、wikiを作る。
・上記とは別に、 ChStr クラスを使い、BBSを作る。
・ChStr クラスに clear()、SetStr() 等のメソッドをつけ加え、汎用性を持たせる。
0175nobodyさん
垢版 |
2008/01/29(火) 14:39:05ID:???
OOPってより単にクラスの使い方書いてるように見えるのはまあいいとして
メソッドの中でstringをreturnせずにecho使うのは>>167で書いてるように汎用性って面もあるけど
処理と表示の分離って意味合いもあるからちゃんとstringで返したほうがいいよ
0176nobodyさん
垢版 |
2008/01/29(火) 15:39:09ID:???
>>175
> OOPってより単にクラスの使い方書いてるように見えるのはまあいいとして
OOPについて説明するとなると、具体的なソースコードとは離れた方が
良くなったりしますからね。
(クラスの使い方書いているように見えるとしても、)PHPでclassを
組む場合のメリットみたいな位置づけで学んでいこうと思っています。

> 処理と表示の分離って意味合いもあるからちゃんとstringで返したほうがいいよ
確かに汎用性以外にそういう目的もありますね。
次のものでstringで返すように書き換えます。
0177nobodyさん
垢版 |
2008/01/29(火) 18:16:08ID:???
htmlのformのコードもクラス化するのが本当の流れんだろうけれどな。
いきなりそれをやると分かりにくくなるかな・・・
0178◆lKs5QMUHoA
垢版 |
2008/01/29(火) 19:20:19ID:???
ChStrクラスのサンプルソースを投稿してた者ですが、
今までnobodyさんで書いてたけど、分かりにくくなるかと思ったので
酉入れるようにしてみます。

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

これは、勉強不足だからなのでしょうか。。。
0179nobodyさん
垢版 |
2008/01/29(火) 22:51:04ID:???
>>160
他の人の話のほうがよっぽど核心を突いてるよ
0180nobodyさん
垢版 |
2008/01/29(火) 23:05:47ID:???
>>160のはてなのリンクの4番目の話、2chの別の板でも
読んだことがあるけれど、この話本当なの?
具体的に何処でどういう商売をしての話なんだろうか。
アプリケーションを売る話?それとも開発環境用のソフトを売る話?
0181nobodyさん
垢版 |
2008/01/30(水) 21:59:22ID:???
ピュアな意味でオブジェクトを操作したいなら
ボタンのクリックに関する全ての画面遷移に関してserializeとunserializeを管理する必要があるだろ

<?php

require_once("hiroyuki.class.php");

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

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

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

背伸びせず、まずjavaやC#を学習する方が近道かもしれないよ。
0183nobodyさん
垢版 |
2008/01/31(木) 08:15:31ID:???
.NET 以降の VisualBasic ってどうなの?
0184nobodyさん
垢版 |
2008/01/31(木) 17:31:43ID:???
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);
?>
0185nobodyさん
垢版 |
2008/01/31(木) 17:32:35ID:???
[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();
}
}
}
?>
0186nobodyさん
垢版 |
2008/01/31(木) 17:33:57ID:???
[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;
}
}
?>
0187nobodyさん
垢版 |
2008/01/31(木) 17:37:50ID:???
[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>";
}
0188nobodyさん
垢版 |
2008/01/31(木) 17:39:35ID:???
[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();
}
}
}
?>
0189nobodyさん
垢版 |
2008/01/31(木) 17:51:38ID:???
フレームワーク使えば?
0190◆lKs5QMUHoA
垢版 |
2008/01/31(木) 19:03:23ID:???
とりあえず、MVCに分けて枠組みを作ってみたけれど、
これをより抽象化させていって、「継承して使ってください」という
方向にするのか、それとも最初はクラスの数を増やさないように
しながら簡単なアプリケーションを作る方向にするべきか。
どっちの方向に持っていったほうがいいのか迷うな。。。

ま、そんなことを考える暇があったら手を動かしてみろという
話なのかもしれないが。。
0191nobodyさん
垢版 |
2008/01/31(木) 19:08:05ID:???
>>190
自分で考えるのも良いが、君が今やっていることを
やってしまっているのが、フレームワークだ。

まず既存のフレームワークがどうなっているのか参考しろ。
0192nobodyさん
垢版 |
2008/01/31(木) 19:44:25ID:???
俺も初心者だからこれが最善とは言い切れないけど
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;
0193192
垢版 |
2008/01/31(木) 19:50:52ID:???
フレームワーク使ってみろっていうのは賛成
疎結合にとかDRYにっていうのがだんだんわかってきた
理解したところで戻ってきて〜の方が結果的に早そう
俺はまだ勉強中だからそこまで行ってないけど
0194◆lKs5QMUHoA
垢版 |
2008/01/31(木) 19:56:23ID:???
>>192
> $view = new CFView();
> $view->m_type = 'in';
これみたいに、直接メンバにアクセスするのは構造的に良くないと聞いたことが
あるよ。「データをやり取りするのは、インターフェースを通じて」という原則を
守るべきだと。
そうしなければ、CFViewクラスを改変する人は、そのクラスを使っている人の
コードを考慮して、メンバの値や変数名を自由に変える事が出来なくなるから。

なので、私は、コンストラクタで値を渡しても良いし、コンストラクタで値を渡して
いなければ、値を渡すためのインターフェースを使って渡すようにする仕様が
適当かなと思っている。
0195192
垢版 |
2008/01/31(木) 20:08:35ID:???
汚染されちゃうけどコンストラクタで全部の値渡すよりはましじゃないかなあ
あとコンパイルするときに全部チェックしてくれる言語とそうじゃない言語ってのもある
phpなんだしゆるーくやればいいじゃん なんていうと怒られるかw
0196◆lKs5QMUHoA
垢版 |
2008/01/31(木) 20:13:09ID:???
今調べて知ったのだが、オーバーロードは PHP ではできないらしい。
だったら、コンストラクタで値を渡すよりも、インターフェースで値を
設定するような仕組みになるだろうね。
コンストラクタだと、一度値を設定したら、そのオブジェクトが破棄される
まで、再度設定が出来なくなるから。
0197nobodyさん
垢版 |
2008/01/31(木) 20:22:00ID:???
メンバ変数へのアクセスはsetter/getterを使う。これは議論の余地なし。
それを用意した上でコンストラクタに引数を渡すなら渡せば良い。
複雑で多くの設定をしなきゃならない時以外、
newした直後に使える状態になっている方が使いやすい。
> $view = new CFView();
> $view->m_type = 'in';
これをセットで書かなきゃならないなら、
> $view = new CFView('in');
と書きたい。

0198◆lKs5QMUHoA
垢版 |
2008/01/31(木) 20:26:00ID:???
私は>>197さんの意見に同意だ。
「このモジュールを使う場合、このように書いてくださいね。」
というコードは、なるべく少ない方がいいからね。
なので、とりあえず設定の値はコンストラクタにいれるという
設計で書いてみた。
0199◆lKs5QMUHoA
垢版 |
2008/01/31(木) 20:31:34ID:???
とりあえず、フレームワークを使ってみろという話が出ているが、
具体的にどのフレームワークを使って、どんなプログラムを書いて
みたらいいのか迷うなぁ。

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

フレームワーク自体の自作の話もいくつかあるみたいだ。
ttp://codezine.jp/a/article.aspx?aid=104
0200192
垢版 |
2008/01/31(木) 20:36:05ID:???
viewに渡すデータはセッタで渡したくならない?
あとinなのかoutなのか分岐させるとしたらそれはコントローラ側の仕事なんじゃないかなと思うんだけど違うかな
0201192
垢版 |
2008/01/31(木) 20:42:33ID:???
いや、見直したらそう書いてた
ごめん気にしないで
0202◆lKs5QMUHoA
垢版 |
2008/01/31(木) 20:46:31ID:???
>>200
> viewに渡すデータはセッタで渡したくならない?
表示させるデータはセッタがいいだろうね。

> あとinなのかoutなのか分岐させるとしたらそれはコントローラ側の
> 仕事なんじゃないかなと思うんだけど違うかな
>>185のソースがそれにあたるものだと思ってたけど。
if( ($form_str == "")or($form_str == "in") ){
 省略
}elseif($form_str == "out"){
 省略
}
コントローラは、POSTしてきた値を見て、必要なModelやViewを
選択し、実行する役割なので、それを実現したつもり。
0203◆lKs5QMUHoA
垢版 |
2008/01/31(木) 21:58:27ID:???
厳密にMVCを分けることは出来ない場合もあるということだけど、
CFControlクラスで、CFViewを使って表示する内容までもを
指定していする処理を書いていたのは間違いかな?

検索結果の表示や、データの更新の場合は、
Control→Model→View だけど、
ボタンを押した時の画面の展開のみの場合は、
Contol→View という流れとなり、Viewオブジェクトを
生成するクラスが異なるという処理でいいのかな?
0204◆lKs5QMUHoA
垢版 |
2008/02/01(金) 07:38:53ID:???
「とりあえずはフレームワークを使ってみろ」という返事がきそうだけど、
各クラスの役割は以下のような感じでいいかな?

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

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

View
・フォームを表示する。(フォームごとにクラスを分けたほうがいいのかは迷うな)
・データを1件受け取り、tableタグでレイアウトを調整し、表示する。
0205nobodyさん
垢版 |
2008/02/01(金) 09:44:17ID:???
とりあえずはフレームワークを使ってみろ
0206nobodyさん
垢版 |
2008/02/01(金) 11:08:23ID:???
自分なりに調べて見つけたPHPのサンプルを使った解説ページも
読むとwebアプリについて学べるのではないかと思っている。
やることが多くなったけれど、とりあえずは以下の3本だてで
勉強してみることになるのかな。

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

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

サンプルで理解! フォームデータの受け渡し
ttp://www.atmarkit.co.jp/flinux/rensai/mysql5_03/mysql5_03a.html
0207nobodyさん
垢版 |
2008/02/01(金) 12:06:10ID:???
ちいたんのソース見てみたけれど、
class CObject ってあって、必ずそれが継承されて作られてるよね。
これの都合って何なんだろう。(メリットは何?)
javaも.NETもこういう基本クラスがあるよね。
0208nobodyさん
垢版 |
2008/02/01(金) 12:19:15ID:???
全部のクラスに共通するメソッド等が実装できる
0209nobodyさん
垢版 |
2008/02/01(金) 13:06:22ID:???
>>208
サンクス。
でも、オーバーロードが出来ない場合は逆に足かせになる可能性もあるね。
例えば、継承されているクラスが沢山ある状況でObjectクラスに
メソッドを追加する場合とか。
0210nobodyさん
垢版 |
2008/02/01(金) 16:28:22ID:???
喋るのはコントローラとモデル
コントローラとビュー
基本的にはね
0211nobodyさん
垢版 |
2008/02/01(金) 16:49:11ID:???
少ない数のクラスを書いたり読んだりする程度であれば、すぐに分かるのだが、
フレームワークレベルのクラス構造となると、その構成が全く分からなくなって
来るんだよなぁ。何かコツのようなものはあるのかな?

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

フレームワークを作る場合のクラスの設計手法を身につけるなどしないと
いけないのかも。
メンバに定義はしていないけれど、メソッドではその変数をエラーが
出ないように処理が書かれているっていう書き方は多いようだ。
そうしておけば、そのフレームワークを使う人は、クラスを継承して
メンバに値を代入するだけで良い。
0212nobodyさん
垢版 |
2008/02/01(金) 18:37:23ID:???
このサイト、説明は分かるのだが、具体的に作っているコードは
MVCのうちどれにあたるのかがいまいちです。
ttp://www.stackasterisk.jp/tech/php/phpMvc01_01.jsp

Result.php は、Viewにあたるものという解釈でいいんですよね?
0213nobodyさん
垢版 |
2008/02/01(金) 18:47:22ID:???
PHPでMVC関連のサイトを紹介で貼っておきます。

特集:第3回 PHPを思うままに操れるようになる「MVC」と「Smarty」 (1/4)
ttp://www.itmedia.co.jp/enterprise/0402/19/epn01.html
0214nobodyさん
垢版 |
2008/02/01(金) 18:50:51ID:???
2004年って・・・・・・・
0216nobodyさん
垢版 |
2008/02/02(土) 07:42:39ID:???
PHPでね、イベントドリブンなWEBフレームワークとか自作してみるといいかも。

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

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

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

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

でも、学ぶ時は、既存のモジュールを使って早くやるのよりも、モジュール
なしの状態で、モジュールを作ってみる方がいいので、とりあえず今は
PHPでOOPです。
0218nobodyさん
垢版 |
2008/02/02(土) 09:56:37ID:???
>>217
多分、その違和感のある概念がOOPの本質だと思うよ。
そしてその概念は、洗礼された実装に触れることでしか
身につかないとも思うんだ。

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

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

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

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

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

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

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

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

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

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

●Pharon
http://pharon.lolipop.jp/
>最大の特徴は、wizard によりイベントドリブン型のスケルトンを自動作成することです。
02231 ◆SWtzLesEmM
垢版 |
2008/02/02(土) 17:00:36ID:???
インターネット越しにイベント処理をさせるのが、WEBプログラミングの特徴ですね。
イベントドリブンは、PHPよりもむしろFlash/Flexとかで使われる仕組みなのでしょうか?

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

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

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

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

http://bitmap.dyndns.org/blog/archives/001215.html
>イベントドリブンモデルには、主に以下の 4 つのオブジェクトが登場する。
02241 ◆SWtzLesEmM
垢版 |
2008/02/02(土) 17:05:16ID:???
>>220
>・Control クラスのメソッド内で、Model クラスと View クラスのインスタンスを生成する。
こっちの方が、Controlにまとまっている分だけスッキリしており、分かりやすいコードになるんじゃないでしょうか?
0225nobodyさん
垢版 |
2008/02/02(土) 17:24:12ID:???
>>224
レスありがとうございます。
1番目の方にすると、Modelクラスから取得したデータを
Viewクラスに渡すことになるので、その分余計にメモリや
CPUを消費してしまうのでは、と心配になって聞いてみましたが、
考えてみると、コードの見易さなどを優先するのがOOPですので、
そちらの方がいいですね。

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

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

コンクリートとして実装
data_model.php
index_view.php
output_view.php
0227nobodyさん
垢版 |
2008/02/02(土) 17:38:02ID:???
[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();
?>
0228nobodyさん
垢版 |
2008/02/02(土) 17:39:03ID:???
[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);
}
}
?>
0229nobodyさん
垢版 |
2008/02/02(土) 17:39:58ID:???
[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);
}
}
?>
0230nobodyさん
垢版 |
2008/02/02(土) 17:40:48ID:???
[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;
}
}
?>
0231nobodyさん
垢版 |
2008/02/02(土) 17:41:48ID:???
[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>";
}
}
?>
0232nobodyさん
垢版 |
2008/02/02(土) 17:42:29ID:???
[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>';
}
}
?>
0233◆lKs5QMUHoA
垢版 |
2008/02/02(土) 19:04:13ID:???
>>226-232
サンプルソースありがとうございます。
抽象クラスの書き方に慣れてますね。私はこのあたりを
しっかりとやってなかったのでちょっと苦手です。
ま、しっかりと勉強していきたいと思います。(^^;

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

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

function _OnExecute($param) // 仮想メソッド
{
trigger_error('オーバーライドしてね。', E_USER_ERROR);
}
0234◆lKs5QMUHoA
垢版 |
2008/02/02(土) 19:24:37ID:???
>>218
レスありがとうございます。
イベントドリブンそのものは、VBでWindowsアプリを組んでやったことがあるので
すぐに入れたのですが、Webアプリを作る際、イベントドリブンでしかやった事が
無いというのは致命的だと思ったので、PerlやPHPでやってみています。
(ASP.NETは、便利ではあるが、IISを使えとか、.NET Frameworkを使えとか
非常に限定される。)

構造化プログラミングで、あまり命名規則を考えずにプログラムをしていると、
グローバル変数や関数が多くなった時、その把握が出来なくなったりする
わけなのですが、そういう苦労する体験をした後、OOPを習うと、その便利な部分が
見えてくるわけです。OOPは経験による結論的な理論だな、と理解できるわけです。
その理解のために、とりあえず、苦労をする方法(PHP で 0 から OOP)で
やってみているのです。
今は、このように考えています。
0235nobodyさん
垢版 |
2008/02/02(土) 19:59:40ID:???
人間て暖かいにゃぁ
ポカ・ポカ テンキュー
0236nobodyさん
垢版 |
2008/02/02(土) 21:30:36ID:???
>>233
PHP4では全てパブリックだけど例えばC#では以下の実装になるんだ
public object Execute(object parpam)
protected virtual object _OnExecute(object parpam)

CFControlから_OnExecuteメソッドを隠蔽する意図なんだよ。
_OnExecuteはCFViewやCFModelのサブクラスにだけ見えれば十分なんだ。
0238◆lKs5QMUHoA
垢版 |
2008/02/03(日) 14:47:56ID:???
ソースを読んでいて気になった点がありますので、質問させていただきます。
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の構成ということでよろしいのでしょうか。
0239◆lKs5QMUHoA
垢版 |
2008/02/03(日) 14:50:55ID:???
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");
0240nobodyさん
垢版 |
2008/02/03(日) 15:27:26ID:???
MVC?な俺にはここが一番わかりやすかった
実例コードが載ってるのがいい

PHPでMVC第1回:前編
ttp://www.stackasterisk.jp/tech/php/phpMvc01_01.jsp
0243◆lKs5QMUHoA
垢版 |
2008/02/03(日) 19:47:22ID:???
ソースコードをちょっとだけ改変したものを作ってみた。
メモとかを残していく都合もあると思ったから、HP解説してみた。
ttp://www.geocities.jp/narutobakijp2/
本当は、>>1さんがソースの管理とかもしてくれたりしたら、うれしいw
0244nobodyさん
垢版 |
2008/02/04(月) 01:44:33ID:???

いちいちzipを解凍する気にならない
0245nobodyさん
垢版 |
2008/02/04(月) 09:02:58ID:???
>>243
CFViewクラスに具体的な実装をしちゃダメなんだよ。
そもそもHTMLのフォーム処理とかは、あとでPEARとか使えばいい。

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

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

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

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

となると、html表示は(PEARを使わないのであれば、)htmlタグの
記述を行うCF_HTMLクラスを作り、Viewの具象クラス内で
インスタンスを生成ということですよね?
0249nobodyさん
垢版 |
2008/02/05(火) 08:55:19ID:???
>>248
HTML処理のヘルパクラス作成はあまりOOPの勉強にならないとも思うんだ。
もう既に頭の中で実装出来ているだろうし、引数を関数で処理するだけでしょ?

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

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

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

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

第6回 階層の頂点に立つクラス
http://www.atmarkit.co.jp/fdotnet/basics/oop06/oop06_01.html
0251nobodyさん
垢版 |
2008/02/05(火) 11:52:25ID:???
>>250
PHPのプログラマにも非常に参考になると思いますよ。

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

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

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

プロテクテッドメソッドの概念とかIDEがないと、なんでそうするのか
なかなか理解出来ないとも思いますしね。
0252nobodyさん
垢版 |
2008/02/05(火) 11:56:50ID:???
いくらかのデータを登録し、その内容を検索するWebシステムで使用する
クラス構成で、Viewに絞った構成を考えてみた。

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

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

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

[Output View]
├[メニュー]
├[検索指定]
├[検索結果]
0253nobodyさん
垢版 |
2008/02/05(火) 12:16:06ID:???
>>252
[View]
├[LoginView]
├[InsertView]
├[MenuView]
├[SelectView]
├[ResultView]

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

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

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

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

概ね以下のような感じにしたいと思ってるんだけどね。
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; // データベースを格納。
0257nobodyさん
垢版 |
2008/02/05(火) 20:33:23ID:???
>>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のアプリ作成に必要な要求仕様作ってよ。
0258◆lKs5QMUHoA
垢版 |
2008/02/05(火) 23:02:08ID:???
>>257
要求仕様案

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

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

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

これは、プログラムの規模が大きくなりすぎるようであれば、
もちろん内容を変えてもいいです。「顧客の情報を登録し、
それを検索する」という流れだと、勉強用サンプルとして非常に
良いのでは、と思いました。
0259◆lKs5QMUHoA
垢版 |
2008/02/05(火) 23:21:24ID:???
[データの入力例]
氏名:茂名
フリガナ:モナー
性別:男性
生年月日:H1/3/3
住所:東京都・・・
コメント:ふちなしタイプを希望している。

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

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


顧客のデータ1件に、眼鏡の購入日がつながり、さらに、メンテナンス履歴が
つながる構成になるけれど、今回は勉強用なので、「顧客のデータ1件=眼鏡の購入日1件」
としてもいいかもね。
再度購入したら、顧客の個人情報を0から入力しなおすみたいな。
0260◆lKs5QMUHoA
垢版 |
2008/02/06(水) 01:36:05ID:???
View の Debug メソッドの仕様もどうするかで迷っている。
Execute($param)したあと、Debugとか、もしくは、
Debugの中でExecute($param)を呼び出す処理だと、
<html>タグのそとに確認データが出力されてしまう。

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

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

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

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

あれほどインタフェイスだけで実装するんだと(ry
それよりコントローラの実装仕様どうするの?
0263nobodyさん
垢版 |
2008/02/06(水) 11:45:05ID:???
>>262
非常に乙です。m(_ _)m

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

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

ShiftJISだったりとか、スペース2個というのは標準じゃないとかは
気づいてたのですが、そこまで治していただいて申し訳ないです。
0267nobodyさん
垢版 |
2008/02/06(水) 17:31:55ID:???
>>266
別にわかんなくったって、やってけるから大丈夫。
無理に背伸びする必要は無い。
0269nobodyさん
垢版 |
2008/02/07(木) 10:03:39ID:???
>>261
> OOPに対する基本的概念への理解があまりにも無さ過ぎると思うんだ。
> >>255にしても、Executeメソッドに呼ばれる仕組み作ってんのに、
> なんで新しいメソッド実装して直接呼びたがるんだろう?

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

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

俺はこれから勉強していくところなので理解がないのは認めるが、
このあたりはどういう見解なのかを教えて欲しい。
今回作るMVCフレームワークは、学習用なのでもっと簡潔な
レベルなのを想定しているとか、ちいたん作っている人がOOPに
関する理解が無いだけだとか。
0270nobodyさん
垢版 |
2008/02/07(木) 10:24:36ID:???
>>269
フレームワーク実装に正解も不正解も無いと思うけどね・・

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

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

学習用だからこそ『呼ばれる仕組み』で実装しようとしているんだよ。
0271nobodyさん
垢版 |
2008/02/07(木) 10:55:50ID:???
>>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);
}
}
0272nobodyさん
垢版 |
2008/02/07(木) 11:32:07ID:???
じゃ、用件仕様はこんな感じで良いのか?

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

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

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

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

[検索結果]
→・条件に一致するデータを一覧で出す。
 ・個人情報を修正したい場合は、ここから[個人情報入力]へ移動する。
 ・個人情報を削除したい場合は、ここで削除ボタンを押す。
0273nobodyさん
垢版 |
2008/02/07(木) 12:35:22ID:???
>>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];
}
}
?>
0274nobodyさん
垢版 |
2008/02/07(木) 12:36:19ID:???
[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);
}
}
0275nobodyさん
垢版 |
2008/02/07(木) 12:37:26ID:???
[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;
}
}
?>
0276nobodyさん
垢版 |
2008/02/07(木) 13:59:04ID:???
細かい指摘になるけれど、継承関係の勉強中なので質問で書き込みします。

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

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

■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に書き込む。
0279nobodyさん
垢版 |
2008/02/07(木) 23:22:51ID:???
>>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
0281◆lKs5QMUHoA
垢版 |
2008/02/08(金) 08:04:01ID:???
せっかくプログラムを作っていただいたのだから、みんなでその説明文章をまとめるといいかもね。
例えば、こんな感じで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
0282nobodyさん
垢版 |
2008/02/08(金) 08:10:57ID:???
>>281
>>279ですがphpDocumentorで今作っているのでちょっと待っててね。
0283nobodyさん
垢版 |
2008/02/08(金) 08:52:15ID:???
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を実装したつもりです・・・
有名なハリウッドの法則です。

[カプセル化]は良いとして、やはり[継承]と[ポリモーフィズム]を
うまく使うのは最初難しいかもしれない・・
これらの実装もデザパタとしてライブラリ化されたものに過ぎないけどね。
0284nobodyさん
垢版 |
2008/02/08(金) 09:26:17ID:???
ファイルが見れん・・・
0285nobodyさん
垢版 |
2008/02/08(金) 11:03:39ID:???
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が反映されてませんでした。
0287nobodyさん
垢版 |
2008/02/08(金) 11:51:38ID:???
全体構成の把握はまだ出来てないけれど、只今、ソース解析中・・・
いちゃもんつけるつもりじゃないけれど、気になった点を2つ。

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

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

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

オブジェクトにexecute以外のパブリックメソッドを
実装しないのが目標です・・(※アクセサ以外)
0289nobodyさん
垢版 |
2008/02/08(金) 13:12:48ID:???
クラスの継承関係が結構複雑になってますね。
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; // 書き込むファイル名
0290nobodyさん
垢版 |
2008/02/08(金) 13:15:33ID:???
■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() →現在未実装。
0291nobodyさん
垢版 |
2008/02/08(金) 13:32:42ID:???
こうやってみてみると、クラスを継承する際の設計思想が見えてくるな。
どの段階で実装を替えるかを考えた場合、どのクラスを置き換えれば良いかも分かる。

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

例えば、Model(抽象)クラスの $src_file_name を別のものにする場合、
それ以降のクラスが全部影響するかの確認が必要なわけだから、
Model(抽象)クラス以降のものをすべて一つのクラスにまとめて書いても
同じなんじゃないかと思えてしまう。
こういうのとは別な場面で、継承しているメリットがあるってことかな?
0293nobodyさん
垢版 |
2008/02/08(金) 15:31:59ID:???
Control の & _onExecute(&\$param, \$e) で
\$this->_view_calss = \$view_calss;
というコードがあるけれど、右辺の \$view_calss って、
何処でも定義されてないですよね?
このまま動かすと、nullが入るだけのように思えるんだけど。
0294nobodyさん
垢版 |
2008/02/08(金) 16:04:40ID:???
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出力する。テキストボックスと送信ボタン
0295nobodyさん
垢版 |
2008/02/08(金) 16:20:36ID:???
>>293
1行上のフックハンドラ実行の結果を渡している。
0296nobodyさん
垢版 |
2008/02/08(金) 16:41:04ID:???
ロードメソッド[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
0299nobodyさん
垢版 |
2008/02/08(金) 19:33:52ID:???
>>298 見れるはずですが・・以下はどうですか?
Eclipceでのデバッグ画面です
ttp://proxy.f3.ymdb.yahoofs.jp/bc/4525b767_dfac/bc/452a/OOPFW_DEBUG.jpg?BC3YDrHBI.a6ljXl
0300nobodyさん
垢版 |
2008/02/08(金) 22:21:47ID:???
>>298どうでしょうか?
ttp://briefcase.yahoo.co.jp/bc/oopfw
0301nobodyさん
垢版 |
2008/02/08(金) 22:24:55ID:???
なんでPHP4文法でやってんの?
0303◆lKs5QMUHoA
垢版 |
2008/02/09(土) 01:49:09ID:???
これは、>>1さんのサイトでは、「入力フォームを作ってみる」とは
別で、「フレームワークを作ってみる」の演習という位置づけにした
方がいいかもしれないね。

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

このフレームワークは、MFCみたく、あらかじめ準備された
クラスのメソッド中に書き加えていくスタイルなのかな?
それとも、VBみたいにそういうソースコードを全部隠蔽
してしまう方向でいくのかな?ちょっと気になった。
0304◆lKs5QMUHoA
垢版 |
2008/02/09(土) 02:12:22ID:???
こうやってソースを読んでみると、これまで抽象的に聞いていた
フレームワークを使ったプログラミングのメリットとデメリットが実感できるね。

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

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

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

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

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

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

>>303
MFCもVB6もフックハンドラに処理を記述していく方式なので
それを参考にしています、サンプルFWも自由にいじってもらって
参考にしてもらえたら良いと思います。
>>305クラスライブラリ方式もいいかもしれないですね。
0307nobodyさん
垢版 |
2008/02/09(土) 10:20:45ID:???
フレームワークのメリットとデメリットにおいて、なるべく具体例を書いた形でまとめてみた。

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

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

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

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

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

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

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

フレームワークの開発というのは、そもそもが環境が固定されていないので
そういう場合にはなおさらフレームワークを使ったほうが良い。
0316nobodyさん
垢版 |
2008/02/09(土) 15:29:20ID:???
理解と記憶は別物だと思うけどな。
0317nobodyさん
垢版 |
2008/02/09(土) 16:52:42ID:???
>>315
> 全体構成を隅々まで把握してなんの意味があるのだろうか?
> どうせ数日たったら忘れるんだし。
じゃ、この項目は消しておきます。


> PHP4、PHP5両対応のフレームワークもあるし、
> いろんなデータベースに対応している場合もある。
> フレームワークの開発というのは、そもそもが環境が固定されていないので
> そういう場合にはなおさらフレームワークを使ったほうが良い。
PHPスレで言うのもなんだけど、ASP.NETなども含めた総論という考えだったんだけどね。
Windowsサーバなのかなどを気にするとか、PHP5のみ対応のフレームワークで
開発していて、PHP4しか対応していないサーバで動かすことになる場合を
という意味で、環境が固定されない書きました。
0318nobodyさん
垢版 |
2008/02/09(土) 17:04:40ID:???
修正案

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

Q:フレームワークがあまり向かない場合は?
・個人で小規模アプリを組む時。(一度組んで終わりの場合など)
・サーバの移植を想定しなければならないなど、環境があまり固定出来ない場合
 このような状況の場合は、クラスライブラリの使用を検討すると良い。
0319nobodyさん
垢版 |
2008/02/09(土) 22:32:17ID:???
あえてPHP4の構文でやってるのは、PHP4との互換性を保つため?
PHP5でやっちゃうと、PHP4の環境で動かなくなるから。
03211 ◆SWtzLesEmM
垢版 |
2008/02/10(日) 18:45:04ID:???
>>300
>ttp://briefcase.yahoo.co.jp/bc/oopfw
ソースコードを見てビックリ!(・∀・)
コメントが丁寧に書いてあり、OOPを学習する上でとても助かります!
貴重なサンプルを提供していただき、どうもありがとうございました。m(_~_)m

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

>>281
http://ssurl.net/cp7a
ちょっとずつ読んでますが、全部はまだ理解できないです。(´;ω;`)
レスも参考にしてみます。
(=分からないことでも、検索で調べるときのヒント・手掛かりになるので)
0322nobodyさん
垢版 |
2008/02/10(日) 22:19:07ID:???
>>321
乙です。m(_ _)m
>>306ですが今後は
・認証の仕組み
・ロギングの仕組み
・エラーハンドリングの仕組み
・バリデイトの仕組み
・トークンの仕組み
・リダイレクトの仕組み
・入力→確認→完了の仕組み
・コアオブジェクトの実行権限の仕組み
など実装していく予定です・・

でも、こればっかりやってるわけにいかないので
気長に見守ってやって下さい。
0323◆lKs5QMUHoA
垢版 |
2008/02/11(月) 02:31:35ID:???
>>321
乙です。分かりやすくまとまっていますね。
私も少しずつ読んでいって理解しようと思っています。
他のものに比べ、コメントが多いのが助かりますよね。


>>322
読むほうも時間がかかると思いますので、
一気にやらなくていいと思います。(^^;
0324◆lKs5QMUHoA
垢版 |
2008/02/11(月) 02:35:18ID:???
MVCフレームワークを作っていただいてる流れとはおもいっきり違う事をいうけれど。

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

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

http://www.geocities.jp/narutobakijp2/
OOPの勉強として、簡易なBBSを作ってみました。
BBS Version1(2008.2.11)
0325◆lKs5QMUHoA
垢版 |
2008/02/11(月) 08:27:05ID:???
クラス間のデータのやり取りにおいて、Listクラスを使う設計にしたけれど、
PHPの場合はハッシュでよかったような気がする件。
まだまだ未熟だな・・・

今後は、これを構造化指向へ変換したプログラムを作り、うpする予定です。
この両方のプログラムを見比べてみることで、OOPのメリットとデメリットが
見えてくるかもしれません。
0326nobodyさん
垢版 |
2008/02/11(月) 10:26:11ID:???
OOPの継承やポリモーフィズムについての概念やそのコードの書き方に
ついては分かったけれど、その設計方法のノウハウの文章はぐぐっても
なかなか見当たらない。
「設計というのはそれぞれで目的次第」といってしまえばそうだけど、
hiroxpepeさんのソースや、.NET Framework や java の各クラスの
継承関係の設計を見ていると、何か共通したものを感じる。
その具体的な方針と、それを取る理由がはっきりとは分からない・・・

何か良い文章を見かけた、もしくは知っている方は、お願いします。
0327nobodyさん
垢版 |
2008/02/11(月) 10:50:14ID:???
◎「メンテナンスを行う場合」の比較

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

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

【注意】
構造化プログラミングであっても、関数やグローバル変数の名前の付け方を工夫すれば、
もちろん対応は可能である。そのため、メンテナンスを想定する場合は、
オブジェクト指向でなければならないわけでもない。
オブジェクト指向は、構造化指向に比べて特別に「これが出来る」というものではなく、
構造化指向で不便に感じる部分の便利機能である。
0328nobodyさん
垢版 |
2008/02/11(月) 10:57:47ID:???
>>324,325
なかなか参考になりました、ありがとう。
326さんのおっしゃる通り、"設計"は経験なんかも必要になってくるので、
考えるよりも手を動かして、簡単なスクリプトを組んでみるのが最良でしょうか。
0329nobodyさん
垢版 |
2008/02/11(月) 12:43:38ID:???
>>326
・リファクタリング―プログラムの体質改善テクニック
マーチン ファウラー著

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

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

あなたのプログラムにswitch構文がありますか?
その部分はポリモーフィズムで置き換えられますよ。
0330nobodyさん
垢版 |
2008/02/11(月) 12:53:28ID:???
>同様にOOPではswitch構文を使用しません。
>ここの部分をポリモーフィズムで実装するのです。

これは言いすぎ。
OOの基本はモデリングであって、コーディングのスタイルじゃない。
0331nobodyさん
垢版 |
2008/02/11(月) 13:07:00ID:???
>>329
情報ありがとうございます。
> 構造化プログラミングではGOTO構文を使うのはNGだけど
> 同様にOOPではswitch構文を使用しません。
> ここの部分をポリモーフィズムで実装するのです。

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

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


>>330
「言いすぎ」というご指摘もごもっともだと思います。
しかし、OOPは、構造化指向に比べてダントツで良い所があるわけでも
ないので、(このため、すべてがOOPに移項してはいない。)
良いところを説明する際は、多少は強調した感じで言わざるを
得ないところがあると思っています。
0332nobodyさん
垢版 |
2008/02/11(月) 13:39:48ID:???
>>330
そうですね、確かに言い過ぎました・・

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

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

もちろんGOTO構文もswitch構文もコーディングには必要です。
0333nobodyさん
垢版 |
2008/02/11(月) 15:01:11ID:???
switchがいらないということは、
if文もいらないな。

それともswitchを使わずに、
if文で書けばいいのかw
0334◆lKs5QMUHoA
垢版 |
2008/02/11(月) 18:07:43ID:???
>>328
(なんか、自分語りみたいなレスになっているけれど、
OOPの勉強方法についての意見交換にもなるかと思ったので書いておきます。)

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

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

過去に表計算をするプログラムを構造化指向で組むと、処理を関数に分けていく方法が
身についたなと思いました。なので、今度は、構造化指向で苦労をするプログラミングを
してみると、OOPの良さが見えてくるのでは、と思っています。
0335◆lKs5QMUHoA
垢版 |
2008/02/11(月) 18:16:42ID:???
BBSの構造化バージョンをうpしました。

ttp://www.geocities.jp/narutobakijp2/index.html
OOPの勉強として、簡易なBBSを作ってみました。
BBS Version2(2008.2.11)入力したデータで改行に対応してなかったので、その部分を修正。
BBS Version2の構造化Ver(2008.2.11)上記プログラムの構造化バージョンです。
0336nobodyさん
垢版 |
2008/02/12(火) 04:15:37ID:E8FcAvF5
そもそも起動したら即終了するようなPHPプログラミングにOOを使う必要性が感じられない。
0337nobodyさん
垢版 |
2008/02/12(火) 09:16:19ID:???
ここは必要性を語るスレじゃないですよ
0338nobodyさん
垢版 |
2008/02/12(火) 10:36:27ID:???
>>336
なんで実行時間とOOの必要性に関連があるの?

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

Booch先生も、「永続性」に対して、「有用ではあるがオブジェクトモデルにとって
なくてはならない要素というわけではない」 って言ってるし。
(もう絶版だけど、Booch法第2版 2.2節より)
0341nobodyさん
垢版 |
2008/02/12(火) 13:17:09ID:???
>>336だけどphpはプロセスを生成してから破棄するまでに処理を1度しか行わない関数?が多いし、
イベントが非同期で発生したりするわけでもないからOOを使うのはどうかなー?って気がする。
だいたいフローチャートで処理書けちゃうしね。

あとデータベースなりファイルなりからデータを読み込んでそれをオブジェクトの形に整形して・・・・
って処理が無駄な気がする。
実際に行う処理よりもその整形処理が長かったりするとなんか本末転倒なような。
0342nobodyさん
垢版 |
2008/02/12(火) 13:23:42ID:???
>>341
>あとデータベースなりファイルなりからデータを読み込んでそれをオブジェクトの形に整形して・・・・
>って処理が無駄な気がする。

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

フレームワークでもなんでも、整理してるつもりで回りくどいだけってのは多い気がする。
話に付き合ってくれて、どうもありがと。
0343nobodyさん
垢版 |
2008/02/12(火) 14:28:33ID:???
> いわゆるロジック的なものがほとんどない Webアプリってのは存在するし。(っていうか大半かも)
どう考えても少数だろw

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

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

> あとデータベースなりファイルなりからデータを読み込んでそれをオブジェクトの形に整形して・・・・
> って処理が無駄な気がする。
> 実際に行う処理よりもその整形処理が長かったりするとなんか本末転倒なような。
だからフレームワーク使うんじゃん。
0345nobodyさん
垢版 |
2008/02/12(火) 14:42:23ID:???
>>343
単純に、SQLにパラメータ設定して、実行して、検索結果をエスケープしてHTML/XMLのタグつけて
返してるだけで出来てるWebアプリって多そうだけどな。ロジックというほどのもんでもないでしょ。

>>344
ムダなのは実装時間じゃなくて、CPU時間でしょ。
フレームワークで解決する問題じゃないと思うが。
0346nobodyさん
垢版 |
2008/02/12(火) 14:50:23ID:???
>>345 訂正
「本末転倒」って言葉からすると、実装量なのかな。
取り消します。
0347◆lKs5QMUHoA
垢版 |
2008/02/12(火) 18:36:45ID:???
>>341
> あとデータベースなりファイルなりからデータを読み込んでそれをオブジェクトの形に整形して・・・・
> って処理が無駄な気がする。
> 実際に行う処理よりもその整形処理が長かったりするとなんか本末転倒なような。
これはもともとOOPの特性じゃない?
再利用性や保守性を高めるために、他の処理とを完全に切り分ける代わりに、
構造化指向よりも、コード量が多く、動作が重くなるというのは。
これは、個人で組む小規模プログラムでは無駄でしかないが、チームで組んだり、
改変がある場合には威力を発揮する、という類のことでしょ。
0348◆lKs5QMUHoA
垢版 |
2008/02/12(火) 18:50:13ID:???
確かに私もWebアプリの世界ではOOPの意味は少ないと思う。
指摘にあるように、フローチャートがかけるような処理しかしていないので、
主にPerlやPHPで構造化指向でコーディングするスタイルが流行っているのだと思う。
(PerlやPHPのOOP対応は未だに不十分なところがある)
また、ネットにあるサンプルアプリは構造化指向のものが非常に多い事からも、
構造化指向で十分に組めることを意味しているのだと感じる。

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

最近は、どうも(Webアプリの世界では)OOPの有用性を見るよりも、
各種フレームワークの有用性を確認した方が良いのでは、と感じている。
0349nobodyさん
垢版 |
2008/02/12(火) 19:23:14ID:???
> 確かに私もWebアプリの世界ではOOPの意味は少ないと思う。
> 指摘にあるように、フローチャートがかけるような処理しかしていないので、

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

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

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

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

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

各種フレームワークは、すべて(といって問題ないレベルで)OOPで
作られていることを知らないの?
0350nobodyさん
垢版 |
2008/02/12(火) 19:40:22ID:???
>>349
別にOO的なモデリングをしなくても複雑さが増大しないのであれば、OOを選択するのは技術的な理由ではないでしょ。
前提がおかしいと主張するなら、どうおかしいのか言わないと、それこそ意味がない。
0351nobodyさん
垢版 |
2008/02/12(火) 19:58:37ID:???
>>349
じゃあ貴方がOOPを教えてあげたら?
0353nobodyさん
垢版 |
2008/02/12(火) 22:43:18ID:???
クラスを使ってるだけで、オブジェクト指向でも何でもないよ。ウェブフレームワークは。
オブジェクト指向を謳うなら、オブジェクトをシリアライズしてDBやセッションに保存するくらいはしないと。
そんなフレームワークがどれだけある?
0354nobodyさん
垢版 |
2008/02/12(火) 22:58:38ID:???
なんで永続性に拘るんだろ。
0355nobodyさん
垢版 |
2008/02/12(火) 23:01:04ID:???
なんでオブジェクトに拘るのかってこと。
0356nobodyさん
垢版 |
2008/02/12(火) 23:08:25ID:???
ウェブアプリで扱うデータのほとんどはRDBMSだけど、RDBMS自体はフラットなデータ構造でまったくオブジェクト指向ではない。
だから、RDBMSからオブジェクトにいったん変換するんだけど、最終的にはHTMLというやはりフラットな構造に戻さないと行けない。
例えばgmailみたいに非常に複雑な処理が要求されるサイトなら、いったんオブジェクトにするのは有効と思うけど、gmailみたいなサイトは例外的。
ほとんどのウェブサイトは、ただDBに入った値を表示するだけでいい。
0357nobodyさん
垢版 |
2008/02/12(火) 23:14:02ID:???
>>356 あっそ、じゃおまえがオブジェクト使わずに書けばいいだけじゃね?
0358nobodyさん
垢版 |
2008/02/12(火) 23:19:02ID:???
OOプログラミングってのは、OO的にモデリングしたものをプログラミングすることであって、
オブジェクトを使ってプログラミングすることではないでしょ。

これを区別しないのは 「VC++で作ったからオブジェクト指向だ」って言うのと同じ。
0359nobodyさん
垢版 |
2008/02/12(火) 23:28:46ID:???
>>358
概念じゃなく具体的なコードで説明して下さいお願いします。
0360nobodyさん
垢版 |
2008/02/12(火) 23:37:53ID:???
そんなんムリ( ゚Д゚) 本でも読んで勉強して。

今まで読んだ本でOOに関して一番良かったのは Booch法:オブジェクト指向分析と設計 なんだけど、
いくら Booch法自体が古いとは言え、こうした本が絶版になってしまっているというのは、なんとも悲しい。
0361nobodyさん
垢版 |
2008/02/12(火) 23:59:12ID:???
勉強したい人が集まってるんだから、必要・不必要で論争しなくても……。
0362nobodyさん
垢版 |
2008/02/13(水) 00:22:08ID:???
>>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);

みたいな感じになるけど
0363nobodyさん
垢版 |
2008/02/13(水) 00:22:41ID:???

Webプログラミングだと

$buf = DataRead();

$player = new Player();

$player->SetData($buf);

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

$buf = $player->GetData();

DataWrite($buf);

exit(0);

みたいなのになりがちじゃん。
0364nobodyさん
垢版 |
2008/02/13(水) 00:23:37ID:???
それなら

DataRead();

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

DataWrite();

exit(0);

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

まぁひとえに俺のプログラミング力不足だと思うけど。
0365nobodyさん
垢版 |
2008/02/13(水) 00:42:03ID:???
また Booch法から引用すると 「ハンマーを手にする者には世界中の全てのものが釘に
見えるように、オブジェクト指向の考えに染まった開発者は世界中の全てのものがオブジェクトで
あると考え出す。この観点は少々無邪気すぎる。」だそうで、若干感情的な議論を呼びやすい
テーマではあると思う。

そういえば、同じ様なことが フラクタルとか 1/fゆらぎの本にも書いてあったな。
人間なんてそんなもんだ。
0366nobodyさん
垢版 |
2008/02/13(水) 09:32:28ID:???
>>360
・構造化プログラミング三要素
STEP01 順次進行
STEP02 条件分岐
STEP03 繰り返し

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

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

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

モデリング云々とかそんなの関係ないんだよ。
そもそもここは>>1でしょ?
0367nobodyさん
垢版 |
2008/02/13(水) 11:21:35ID:???
>モデリング云々とかそんなの関係ないんだよ。

思考を止めてるのは誰だよ。
0368nobodyさん
垢版 |
2008/02/13(水) 11:29:38ID:???
モデリング無しにOOPで書けるんですか?
0369nobodyさん
垢版 |
2008/02/13(水) 11:42:59ID:???
>>367>>368
じゃあモデリング房が設計について判りやすく教えたら?

OOPの概念すら理解出来ない初心者に上流から教えるんですか?
ぐだぐだ言ってないで初心者に判りやすく為になる発言したらどう?
0370nobodyさん
垢版 |
2008/02/13(水) 11:50:58ID:???
モデリングが重要かもしれないっていう情報を教えてもらったんだから、それで満足しろよ。
あとは自分で本でも読め。
0371nobodyさん
垢版 |
2008/02/13(水) 11:52:02ID:???
この基地外まだいるのか
0372nobodyさん
垢版 |
2008/02/13(水) 12:09:17ID:???
>>370
あれれ?モデリングを判りやすく教えてくれるんじゃないんだ?
さては本当は自分も理解して(ry
0373nobodyさん
垢版 |
2008/02/13(水) 12:27:30ID:???
OOP有用性の議論にDBの実装の話がこびり付いている。
純粋な議論ではないと思う。
0374nobodyさん
垢版 |
2008/02/13(水) 13:28:08ID:???
熱意ある奴がケーススタディとして『やってみて』いるんだからさ
酸いも甘いも知ってる方はOOPで作るべきっていう良いお題を
出してあげたら盛り上がるんじゃないか
0375nobodyさん
垢版 |
2008/02/13(水) 15:14:37ID:???
PHPでOOPの議論すること自体おかしい
オブジェクト指向が有用だからこそ
java,c++.c#,ruby最近の言語は全てOOPになってる
大規模なものをつくるのにOOPじゃないと非効率すぎる
0376nobodyさん
垢版 |
2008/02/13(水) 15:17:14ID:???
簡単にいうと
規模が小さいほどOOPの必要性が無くなり
規模が大きいほどOOPの必要性がでる
0377nobodyさん
垢版 |
2008/02/13(水) 15:18:55ID:???
規模が小さいならスパゲッティコードが最強てこと
大きいならOOPじゃないとはなしにならない
0378nobodyさん
垢版 |
2008/02/13(水) 15:21:38ID:???
OOを議論するのにPHPをベースにするのはどうかと思うが、PHPにおけるOOを議論することは良いんじゃないの。
あと、規模というよりは複雑さだろうな。
0379nobodyさん
垢版 |
2008/02/13(水) 15:35:17ID:???
OOPの話は荒れる元だな・・・よし、



〜〜〜〜〜〜〜〜〜ここからOOPネタ禁止〜〜〜〜〜〜〜〜〜〜〜〜〜〜
0380nobodyさん
垢版 |
2008/02/13(水) 16:30:31ID:???
(OO)P

マスコット(笑)

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

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

そんな落ち目のオッピー君と一緒にオブジェクト指向の真髄を極めよう!
0382nobodyさん
垢版 |
2008/02/13(水) 20:00:42ID:???
どうして荒らしが粘着し始めたのだろう。
0383nobodyさん
垢版 |
2008/02/13(水) 23:26:03ID:yj0olWG5
思い切って質問してみる。

テーブルAの操作をするクラスA、テーブルBの操作をするクラスBを作った。
両方のクラスで個別に接続するより、1番最初に接続して、その接続IDを使って処理させたほうがいいのかな?
0384◆lKs5QMUHoA
垢版 |
2008/02/13(水) 23:56:35ID:???
>>383
取得するテーブルの数ごとに別々に接続はしない方がいいよ。
DBの処理負荷が大きくなるから。

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

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

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

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

// 個人情報の更新をするクラス。
// 以下の更新メソッドを持つ
// ・主キーを指定し、個人情報を更新する。
// ・新しい主キーを設定し、個人情報を新規追加する。
// このクラスのメンバに上記2つのどちらかのDBクラスを持たせる。
class CUpdate_Personal
0385383
垢版 |
2008/02/14(木) 00:16:52ID:nkc61sHT
コードまで丁寧にありがとう。

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

> このクラスのメンバに上記2つのどちらかのDBクラスを持たせる。
申し訳ないんだけど、「メンバにクラスを持たせる」の意味が理解できない。
少し補足してもらえるとありがたいんだけど、ダメかな?
0386nobodyさん
垢版 |
2008/02/14(木) 03:29:07ID:???
規模と言うか、どれだけ複雑なロジックがあるかだよね。2ちゃんねるは物凄く規模が大きいけど、ロジックはごく単純。ただの掲示板だもん。
0387nobodyさん
垢版 |
2008/02/14(木) 03:30:36ID:???
テーブルAを操作するモデルクラスAとは行かない場合もあるよ。リレーションがある場合。
0388nobodyさん
垢版 |
2008/02/14(木) 05:53:07ID:???
テーブルクラスはDBクラスと分けて
テーブルの中からgetConnection()するのが普通だよ
コネクション管理とテーブルを切り離す
0389◆lKs5QMUHoA
垢版 |
2008/02/14(木) 08:04:05ID:???
>>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);
// ここで、データをうけとり、返す。
}
}
0390◆lKs5QMUHoA
垢版 |
2008/02/14(木) 08:07:28ID:???
どうしてもテーブル単位でクラスを作る場合は、こんな感じになるのかな。

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

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

// TableBの操作を管理するクラス。
class CDB_TableB extend CDB_PostgreSQL_Connection
0391◆lKs5QMUHoA
垢版 |
2008/02/14(木) 08:26:42ID:???
OOPの設計をする場合は、処理を文章で書き表して、
その中から名詞や役割を抽出していけばいいと聞いたことがある。
その単位を1つのオブジェクトとして設計する。
1つのオブジェクトを、1つのクラスとしてコーディングする。
0392nobodyさん
垢版 |
2008/02/14(木) 08:57:14ID:???
>>390
CDB_PostgreSQL_Connectionを拡張してCDB_TableAにするのはまずい
子クラスと親クラスはis_a関係にしないといけない
言い換えると子クラスは親クラスの範疇に含まれていないといけない
テーブルがコネクションの一部でないことは明らか
0393nobodyさん
垢版 |
2008/02/14(木) 10:58:27ID:???
異論はあるだろうけど、SQLに関しては、パフォーマンスの都合上実装の仕方が限定されるから、
モデルに合わせて考えるのではなくて、SQLを考えてから、それに会うモデル(クラス構造)を考えた
方が良いと思う。
0395nobodyさん
垢版 |
2008/02/14(木) 11:09:12ID:???
具体的に聞かれないと、答えようがない。
0396nobodyさん
垢版 |
2008/02/14(木) 11:30:06ID:???
>>393
テーブル構造が複雑な場合、そういうのもアリだと思うけど
それはオブジェクト指向じゃないよね
0397nobodyさん
垢版 |
2008/02/14(木) 12:00:13ID:???
微妙だけど、抽象化のレベルが低い(計算機寄りな)だけで、OOではあると思ってる。

ただDBアクセスについて、パフォーマンスを保ったまま、高い抽象化ができない・やりにくい
というのは、OOが本質的にDB向きではないということだと考えてる。
0398nobodyさん
垢版 |
2008/02/14(木) 12:33:45ID:???
とりあえずDBアクセスはPDOでいい。
各操作系に保持させるならプリペアドステートメントを。

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

どうでもいいがクラスってのは抽象データ型なので関数と比べるなんてしてるとハマる。
0399nobodyさん
垢版 |
2008/02/14(木) 12:59:49ID:???
UMLモデリングツールでPHP書いている人いる?
具体的には「Umbrello」を業務で使っている人
0401nobodyさん
垢版 |
2008/02/14(木) 14:54:28ID:???
>>397
> というのは、OOが本質的にDB向きではないということだと考えてる。
逆逆、リレーショナルデータベースが、OO向きじゃない。
0402nobodyさん
垢版 |
2008/02/14(木) 15:00:26ID:???
>>398
> 各操作系に保持させるならプリペアドステートメントを。
プリペアドステートメントは条件の数を変えにくいという
大きな欠点があるからなぁ。

> 個人的には各テーブルってよりも各テーブルのレコードクラスを作るかなー。
一般に言われている、ActiveRecordパターンですね。
Ruby on RailsやCakePHPで採用されている奴です。
0403nobodyさん
垢版 |
2008/02/14(木) 15:08:57ID:???
>>383
> テーブルAの操作をするクラスA、テーブルBの操作をするクラスBを作った。
> 両方のクラスで個別に接続するより、1番最初に接続して、その接続IDを使って処理させたほうがいいのかな?

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

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

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

これを実現する為に同じ接続から見える状態と、違う接続からみえる状態で
違うことがある。
0404nobodyさん
垢版 |
2008/02/14(木) 15:18:21ID:???
PHPやWebアプリに限らないけど、OOPってのはフレームワークを作るためにある。
ここで言うフレームワークには、汎用の名前があるフレームワークだけじゃなく
たとえばあるゲームの独自の基本システムなんていったものも含む。

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

だからといって、システム全体がOOPになっていないとは思わないけどね。
システム全体の一部。つまりクラスの中のメソッドだけを見て
非OOPというのはおかしいでしょ?
0406nobodyさん
垢版 |
2008/02/14(木) 15:35:44ID:???
誰に言ってるのかも気になるが、そんなこと誰が言ってるのかも気になる。
OOPがフレームワークのためにあるという主張は初めて聞いた。
0407nobodyさん
垢版 |
2008/02/14(木) 15:36:31ID:???
>>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() {}
}
0408nobodyさん
垢版 |
2008/02/14(木) 15:41:23ID:???
>>407
概ね同じ意見だけど、Cpersonalを実体化する必要ってあんまりなさそうだから、
自分はメソッドを staticにすることが多い。

あと、connection をオブジェクト内部にもってしまうと、そのオブジェクトはいつでも
SQLを実行できてしまうので、引数で渡すようにしてる。
(まぁ、staticにしたら引数で渡すしかないけど)
0409nobodyさん
垢版 |
2008/02/14(木) 15:45:33ID:???
>>408 に補足
必要性がないというより、CTable (のサブクラス)のインスタンスをnewするということは、
意味論的には、そのテーブル自体を新規に生成するということだから、ちょっと気持ち悪い。
0410nobodyさん
垢版 |
2008/02/14(木) 15:48:44ID:???
>>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を一切修正しないですむ。
0411nobodyさん
垢版 |
2008/02/14(木) 15:49:17ID:???
>>404は、「バージョン6までのVBって構文は構造化だけど、
内部的にはクラスが動いているんだよ」といってるのと
同じ意味のように思える。
誰に何を伝えたいのかは良く分からないが。
0412nobodyさん
垢版 |
2008/02/14(木) 15:51:40ID:???
>>408-409

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

0413nobodyさん
垢版 |
2008/02/14(木) 15:53:27ID:???
>>411
一応突っ込み。VBにはクラスがある。(少なくとも5以上)
もちろんnewでインスタンスも生成できる。
0414nobodyさん
垢版 |
2008/02/14(木) 16:01:23ID:???
>>412
これですかね。
http://www.martinfowler.com/eaaCatalog/activeRecord.html

細かいけど、
>そのインスタンスはテーブルのレコードという扱いになる。
なら、searchメソッドは、staticなり外部に置くのではないかと思う。
確かに updateはこの場合 staticにすべきものではないですね。失礼。
0415412
垢版 |
2008/02/14(木) 16:03:01ID:???
>>408
> あと、connection をオブジェクト内部にもってしまうと、そのオブジェクトはいつでも
> SQLを実行できてしまうので、引数で渡すようにしてる。
なんで「そのオブジェクトはいつでも SQLを実行できてしまう」のが悪いのかわからないけど、

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

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

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

getInstance()関数内のstatic変数に配列[0]にで確保(なぜ?)した後
各メソッドの初めで$_this = getInstance() して$_thisで参照するという・・・
まあ見たほうが早い(?)
0416nobodyさん
垢版 |
2008/02/14(木) 16:13:08ID:???
>>415
>なんで「そのオブジェクトはいつでも SQLを実行できてしまう」のが悪いのかわからないけど、

DBなんて巨大なグローバル変数の固まりみたいなものだし、アクセスもメモリと比べて遅いし、
トランザクションの都合からもある範囲でDBアクセスしている可能性がないかが
簡単に見分けられないのは怖いと思うけど。
0417412
垢版 |
2008/02/14(木) 16:13:24ID:???
>>414
> なら、searchメソッドは、staticなり外部に置くのではないかと思う。
あー。staticでいいです。単に個人的な環境の理由から
PHP4を使っていて忘れていただけです。
0418412
垢版 |
2008/02/14(木) 16:17:15ID:???
>>416
でもどっちみちデータベースに操作を出来るところなら、
コネクション知っているわけで、結局同じことでしょ?

それにクラスの変数はグローバル変数じゃないからw
0419nobodyさん
垢版 |
2008/02/14(木) 16:33:55ID:???
>>418
必要なメソッドにしか connection を渡さず、オブジェクト内に保存しないことで、
「データベースに操作できるところ」を限定するという話。

connection をDBアクセスする権限と見るならば、その権限は処理に対して与えるべきで、
オブジェクトに対して与えるべきではないだろうということ。
0420nobodyさん
垢版 |
2008/02/14(木) 17:56:06ID:???
DB周りはZendFrameworkの実装でなんら不満ないなあ。

0421412
垢版 |
2008/02/14(木) 18:14:31ID:???
>>419
しかし、テーブルに関するクラスでデータベースを操作しないメソッドって
あまりないからなぁ。まあ別にいいけどね。
0422nobodyさん
垢版 |
2008/02/14(木) 18:51:49ID:???
>>421
例えば Personテーブルに depart_codeがあるとして、$person->getDepartName() としたときに、
暗黙のうちにdepart_codeをキーとしてDepartテーブルから検索する SQLが実行されたら嫌だし、
setPersonNameされたときに、そのタイミングでupdateが実行されていないか疑わなきゃいけないのも嫌。
0423nobodyさん
垢版 |
2008/02/14(木) 19:13:43ID:???
>>422
メソッドの実装がどうなってようが呼んだ方の知ったこっちゃないだろ。
そのどっちの例もそのクラスの仕様なんだから。
それを外側から知ろうとか制御しようだなんておかしな話だ。
0424nobodyさん
垢版 |
2008/02/14(木) 19:41:54ID:???
そもそもstaticも存在しないPHP4で機能をまとめたようなクラス(CDB_PostgreSQLクラスみたいなの)
を作ろうとしてるのが気持ち悪い。

しかもOOPなんてデータベースの各要素に関数をくっつけたようなもんなんだから既存のデータを単体でしか扱わない
データベースと相性が悪いのは分かりきったことだろう。
0425nobodyさん
垢版 |
2008/02/14(木) 19:54:36ID:???
OOPはデータベースの各要素に関数をくっつけたようなもの?
既存のデータベースはデータを単体でしか扱わない?
だからOOPとデータベースと相性が悪い?

( ゚Д゚) ワカラナイ
0426412
垢版 |
2008/02/14(木) 20:04:12ID:???
>>424
staticはあくまでstaticだよと明示しているだけで
本質的には必要なものとは思えないけど。便利だけどね。

それと、CDB_PostgreSQLは「機能をまとめたクラス」ではないよ。
たとえば一つのアプリでサーバー負荷分散などで、
複数の接続を使用するときとか、複数のインスタンスが出来る。
0427nobodyさん
垢版 |
2008/02/15(金) 07:09:54ID:???
PHPでもメンバポインタとかつかえれば
インスタンスに縛られない柔軟なOOPができるのにな
0428nobodyさん
垢版 |
2008/02/15(金) 17:51:58ID:???
少しだけど、クラス分割のコツが掲載されてたのではっておきます。
VBプログラマ向けの情報だと、OOPの考え方の情報が結構ありそうです。

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

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

(パフォーマンスを考慮し、)
> 可能な限りクラスのインスタンス化が必要ない静的メソッド(Sharedプロシージャ)で
> 作成したステートレスな設計にすることをお勧めする。
0429nobodyさん
垢版 |
2008/02/15(金) 20:19:56ID:???
たまに昔のサイト触ったりすると非OOPなんてもうやってらんねーと思う
DRYになってないから直すの大変
0430nobodyさん
垢版 |
2008/02/15(金) 22:23:07ID:???
OOPってのは設計的な考え方ってのが含まれるんだけど、
そういう考え方は別として、単にコーディング技法として便利だよ。
0431nobodyさん
垢版 |
2008/02/15(金) 22:36:39ID:???
>>272
プリミティブだけど実装してみました・・
もはやQuickFormとSmartyがないと動きませんが・・
ttp://briefcase.yahoo.co.jp/bc/oopfw
0432◆lKs5QMUHoA
垢版 |
2008/02/15(金) 23:49:43ID:???
風邪をひいてしまい、最近頭が回らないです。レスも遅れてしまってます。。。

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

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

>>410
> 接続オブジェクト(CDB_PostgreSQL)はCSearch_Personalクラス外部から与える。
この発想は思いつきませんでした。
確かに言われてみるとそうです。CSearch_Personalを一切修正しないで済むようになります。
0433◆lKs5QMUHoA
垢版 |
2008/02/15(金) 23:50:26ID:???
>>431
サンプルありがとうございます。
あとでソースを読んでみます。
0434383
垢版 |
2008/02/16(土) 00:15:26ID:???
質問しておきながら、反応かなり遅れてしまってごめんなさい。

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

ありがとうございました。
0435nobodyさん
垢版 |
2008/02/16(土) 11:47:29ID:???
フレームワークの利点などの検証の参考となるかと思ったので書いておきます。

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

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

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

話はずれるが、Accessで開発してる時、各種コントロールやウィザードの組み合わせでは
対応出来ないと感じたのを思い出した。ウィザードが準備する通りの物が目的ならば良いのだが、
それにちょっと変更を加えたい場合はどうしたらよいのかという感じ。各種プロパティーの
値を変更してみても変な方向に変わっていくだけ。
自分の意図するようにカスタマイズしたい場合は、非連結のテキストボックスを貼り付けて
VBAで制御するスタイルでやってたな。
0436nobodyさん
垢版 |
2008/02/16(土) 12:59:37ID:???
Accessではグリッドが無いけれど、サブフォームで代用する方法はある。
しかし、そのカスタマイズ度は低い。(確か、クリックしたセルの場所を
取るとか、一つのセルだけ色を変更するとかがかなり苦手だったような。)
サブフォームで代用できない場合は、フォーム上にグリッドを貼り付けるような
モジュールは無いので、DBへのアクセス手段が手軽なものを捨ててでも
VBで0から作り直すのが一般的な選択方法となる。

Webアプリのフレームワークでもこのような状況になる事ってあるのかなぁ?
0437383
垢版 |
2008/02/16(土) 17:18:06ID:???
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オブジェクト格納変数を渡す
}
0438438
垢版 |
2008/02/16(土) 17:21:28ID:???
スクリプト先頭で、DBConnectをnewして、PDO格納オブジェクトを受け取ってから、
それを引数にCtrlAをnewする感じ……。
一応動きはするけど……全然ダメだな……。
0439nobodyさん
垢版 |
2008/02/16(土) 17:46:45ID:???
>>438
なんでもいいけど、既存のフレームワークがどうなっているか見てみろ。

見たら自分で作るきなくなるけどなw
0440438
垢版 |
2008/02/17(日) 16:53:21ID:???
>>439
返信ありがとう。

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

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

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

フレームワーク自作なんて、自分にとってはとんでもない話しですよ……。
0441nobodyさん
垢版 |
2008/02/17(日) 19:14:54ID:???
お前の下らない御託はいいから見ろっつの
0442nobodyさん
垢版 |
2008/02/17(日) 20:01:12ID:???
>>441
ごめん、無視してたわけじゃないんだ。
とりあえず、軽い「ちいたん」とやらを見てきます。

スレ汚し、ごめんなさい。自重します。
0443nobodyさん
垢版 |
2008/02/17(日) 20:03:55ID:???
なぜちいたんを選ぶか・・・
0444nobodyさん
垢版 |
2008/02/17(日) 20:08:23ID:???
( ゚д゚)ポカーン
0445nobodyさん
垢版 |
2008/02/17(日) 20:22:12ID:???
救いようが無いな。
0446nobodyさん
垢版 |
2008/02/17(日) 21:40:51ID:???
スレのレベルを下げちゃってごめんなさい……。

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

スレのレベルを余計に下げるだけなのでROMします。
度重なるスレ汚し、失礼しました。
0448nobodyさん
垢版 |
2008/02/22(金) 09:37:11ID:???
フレームワークをみてみろとアドバイスをしてくださってる方は、
もう少し具体的なアドバイスを出して欲しい。
具体的に、どんなフレームワークの構造を見て、どんなことを
学んだのかなどをあわせて出してくれたら、勉強もしやすいと
思うのですが。
0449nobodyさん
垢版 |
2008/02/22(金) 09:52:27ID:???
お前は人に逐一指示されないと何にもできないんだな
0450nobodyさん
垢版 |
2008/02/22(金) 09:59:49ID:???
フレームワークはどこに行けば手に入りますか?
0452nobodyさん
垢版 |
2008/02/22(金) 11:21:05ID:???
>>451
そのくらい自分で探せよという意味なのですが
0453nobodyさん
垢版 |
2008/02/22(金) 11:36:33ID:???
>>451
自分でDBの抽象化を考えてみて、クラスの定義だけでも書いてみろ。
その後にZFのZend_DBを見て、自分のとどう違うか、なぜそうなっているのかを考えろ。

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

0454nobodyさん
垢版 |
2008/02/22(金) 11:50:38ID:???
別に偉そうじゃないだろ。
むしろお前のほうが偉そうだ。
何被害妄想してるんだw
0455nobodyさん
垢版 |
2008/02/22(金) 12:50:26ID:???
本気でOOP勉強したい人はまずPHP止めないと・・
PHPの世界にOOPの参考になるものがどれほどある?
javaやらずOOP出来ましたってありえないでしょ。
0456nobodyさん
垢版 |
2008/02/22(金) 12:58:24ID:???
>>455
OOP勉強するなら、SmallTalkだな。
Javaとかアフォ?w
0457nobodyさん
垢版 |
2008/02/22(金) 13:04:24ID:???
本気でOOP勉強する為にPHPをやめる必要は無い。
PHP使いながら、OOP勉強すればいいだけ。

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

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

手段と目的を逆にしないようにね。
0458nobodyさん
垢版 |
2008/02/22(金) 13:04:45ID:???
その論争は、きりが無いから、マ板とかのOOPのスレでやって欲しい。
「スクリプトの世界ならRubyだろ。」とか、結論が見えてこないし、
このスレの趣旨とは違うと思う。
0459nobodyさん
垢版 |
2008/02/22(金) 13:06:38ID:???
>>457は非常にすばらしいことを言ったと思う。
0460nobodyさん
垢版 |
2008/02/22(金) 13:13:27ID:???
確かにPHPでOOPの解説をしている情報は非常に少ないので、
勉強の際はjavaやC#などの情報を読みながらやることになると思う。
しかし、PHPを辞めるまでする必要性は無いと思う。
言いたいのは「OOPの勉強するのなら、PHPに限定してはいけないよ。」
じゃないの?
0461nobodyさん
垢版 |
2008/02/22(金) 13:16:21ID:???
本気で勉強する為にPHPをやめた。
そしてOOPをマスターした。

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

OOPをマスターしたが、何も出来なくなった。 完。
0462nobodyさん
垢版 |
2008/02/22(金) 13:27:17ID:???
前から思ってたんだが、頭の悪い人間が粘着してるな。
自分がどんな風に思われてるかも分かってないんだろうなw
0463nobodyさん
垢版 |
2008/02/22(金) 13:58:48ID:???
>>457
> いくらsmalltalkでOOPをマスターしました!とかいっても
> それでウェブサービスを作ることはまずありえないんだから

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

http://www.ibm.com/developerworks/opensource/library/os-lightweight8/
http://www.ibm.com/developerworks/jp/java/library/j-cb07056/index.html
0464nobodyさん
垢版 |
2008/02/22(金) 14:19:47ID:???
PHPでOOPする為に別の言語でOOPの勉強をする。
自分の為に必要だからやるだけ。
0465nobodyさん
垢版 |
2008/02/22(金) 14:42:14ID:???
>>463
うん。だからさ勉強・研究の為の言語と
実用・開発の為の言語は別なの。
0466nobodyさん
垢版 |
2008/02/22(金) 17:56:13ID:???
このソースの解析をがんばればいろいろ見えてくるだろうけど、
一人じゃ到底無理だろうな。別スレでも立てて、解析して
ドキュメント作ろう!見たいなことやってみる?

Visual Studio 2008で見る.NET Frameworkのソースコード
http://www.atmarkit.co.jp/fdotnet/insiderseye/20080222sourcecode/sourcecode.html
> 公開されたソースコードには(もちろん英語だが)多くのコメントが入っており、
> ローカル変数名も元のままの“生”のソースコードである。
> そしてそれがVisual Studio 2008でシームレスにトレースできるようになる
0467nobodyさん
垢版 |
2008/02/23(土) 08:39:50ID:???
>>447
サンプル見たけど
Viewで変数が入らないとこで”を使ってる意味がわからない
”と’の使い方間違ってると思う
面倒な使いわけするならsprintfという手もある

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

0468nobodyさん
垢版 |
2008/02/23(土) 08:44:08ID:???
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>';
}

なんでダブルクォートやねん
0469nobodyさん
垢版 |
2008/02/23(土) 09:12:10ID:???
>>447

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

View_List
View_WriteFinish

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

コントローラは面倒でもOOP理解するには必要だ
理解しやすくするためにテンプレート化も必要
0470nobodyさん
垢版 |
2008/02/23(土) 09:19:29ID:???
>>447
本来コントローラとModelがやりとりする部分が
コントローラが無いために
Viewで処理されてる

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

0471nobodyさん
垢版 |
2008/02/23(土) 12:22:21ID:???
>>469
具体的にどうすればいいの?
条件分岐してないから切り分けは良さげに見えたんだが。
viewは機能ごとの静的HTML吐くのとは違うの?
0472nobodyさん
垢版 |
2008/02/23(土) 13:43:29ID:i4AYcehM
http://www.microsoft.com/japan/msdn/practices/type/Patterns/enterprise/DesMVC.aspx

これの

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

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

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

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

MSDNは書き方がやたらめんどいぜ
0473nobodyさん
垢版 |
2008/02/23(土) 13:56:50ID:i4AYcehM
コントローラがリクエスト解析

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

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

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

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

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

なんか間違ってますか>< 教えてください!><
0474nobodyさん
垢版 |
2008/02/23(土) 14:42:12ID:???
なんですでにあるフレームワークを参考にしない?
0475474
垢版 |
2008/02/23(土) 14:43:18ID:???
474は無視してくれ
0476474
垢版 |
2008/02/23(土) 15:11:03ID:???
>>472
それはようするに、株価データのようにユーザーが
ページを更新しなくてもデータが更新されるときの話。

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

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

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

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


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



あとは詳しい人に任せた。
0477nobodyさん
垢版 |
2008/02/23(土) 17:10:06ID:i4AYcehM
>>476
レスd

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

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

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

ちょっとCakePHPとかの資料ググってくるは
0478nobodyさん
垢版 |
2008/02/23(土) 17:50:55ID:???
そういう場合Comet使うんじゃね?
Cometすげえ!って大騒ぎになってたころ資料見ても俺には何がなんだか理解できなかったけど
0479nobodyさん
垢版 |
2008/02/23(土) 20:15:50ID:???
1を含めてコントローラの役割が全然わかってないんだよ!
MVモデルになってるんだよ!
CakePHP、symfonyのソースをよく解読してみろよ!
1のサンプルにはVIEWにコントローラで処理するコードかいてあるんだぜ!
0480nobodyさん
垢版 |
2008/02/23(土) 20:21:31ID:???
PHPでOOPを追求すると
結局はMVCモデルのフレームワークにテーマが行き着くんだよね
だったらPHPフレームワークのスレと同じじゃんて感じで
ここでOOPを議論するときは
MVCモデル以外を議論の対象にしたいよ
0481nobodyさん
垢版 |
2008/02/23(土) 20:27:22ID:???
>>478
ワロタ。目からうろこw
httpってのはクライアント(ブラウザ側)から聞くことしかできないんだ。
どうやってもサーバーから話しかけることはできない。

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

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

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

しかし、いまさらだけどhttpで無茶やりすぎだw
0484nobodyさん
垢版 |
2008/02/23(土) 20:35:35ID:???
>>480
> PHPでOOPを追求すると
> 結局はMVCモデルのフレームワークにテーマが行き着くんだよね

それはPHPに限らず。

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

通常のビジネスロジック部分は基本的に単純な命令の集まりになるので
OOPを使っているという感じは無くなる。
0485nobodyさん
垢版 |
2008/02/23(土) 20:43:56ID:???
>>484
だから結局フレームワークの議論になるんなら
このスレの意味が無いんだよ
0487nobodyさん
垢版 |
2008/02/23(土) 20:49:01ID:???
>>485
フレームワークスレは、フレームワークの比較などを話すスレ
OOPはフレームワークを題材に、OOPの話をするスレ

おk?
0488nobodyさん
垢版 |
2008/02/23(土) 20:53:31ID:???
>>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();
}
0489nobodyさん
垢版 |
2008/02/23(土) 20:54:28ID:???
//
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>";
}
}
この中のどこがコントローラで判断させるべき処理なんだ?
0490nobodyさん
垢版 |
2008/02/23(土) 20:57:01ID:???
>>487
OOPはフレームワークを題材に、OOPの話をするスレならプログラム板だろ?
初心者だらけの、ここよりも良レスが来ると思うんだが
PHPにこだわる理由がわからない
WEBでのフレームワークならどれも仕組みは同じだろうに
じゃあperlでOOP、rubyでOOPていうスレが無いのは何でなんだ?
0491nobodyさん
垢版 |
2008/02/23(土) 21:21:33ID:???
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;
}
0492nobodyさん
垢版 |
2008/02/23(土) 21:36:01ID:???
// データを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;
}

変数名の最後に数字使うのは初心者だろ?
もしコード拡張で数値計算が入ったら紛らわしい
0493nobodyさん
垢版 |
2008/02/23(土) 21:39:32ID:???
// データを最後に追記する。
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入れないの?
0494nobodyさん
垢版 |
2008/02/23(土) 21:47:30ID:???
$line2 = split($this->m_pause_chr, $line);

はこれの方がわかりやすいだろ?

list($name,$msg) = split($this->m_pause_chr, $line);
0495nobodyさん
垢版 |
2008/02/23(土) 21:52:46ID:???
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;
}
0496nobodyさん
垢版 |
2008/02/23(土) 21:55:49ID:???
変数にオブジェクトが入ってくるなら
初期化はこうだった

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;
}
0497nobodyさん
垢版 |
2008/02/23(土) 22:04:10ID:???
else{
$ans = "";
}

これ全部

$ans = null;
に初期化に変えて
elseとっぱらった方がいいよ

返り値はオブジェクトが入ってるか入ってないかという処理なのに
空文字を返すのよくないよ!
0498nobodyさん
垢版 |
2008/02/23(土) 22:44:30ID:???
まぁ空文字もnullも演算子によっては同様にfalse扱いできるという点がPHPの特徴なわけで
0499nobodyさん
垢版 |
2008/02/24(日) 05:50:47ID:???
>>490
> じゃあperlでOOP、rubyでOOPていうスレが無いのは何でなんだ?
人気が無い言語だからw
0500nobodyさん
垢版 |
2008/02/24(日) 11:09:06ID:???
プログラム初心者がPHPだけでOOPを習得するのはほぼ不可能に近いと思う。
OOP習得が目的ならあまりにも無謀だし、全くもって得策ではない。

フレームワークとか利用しても、ユーザが$_POSTとか直接呼べちゃうと
結局OOPの意味が無いんではないだろうか?むしろそれが出来てしまうPHPは
OOP理解には全く向いていない言語だとも思うのだ。

でも不完全ながら、PHPでOOPっぽくコーディングすること自体は楽しいと思う。
0501nobodyさん
垢版 |
2008/02/24(日) 11:31:24ID:???
>>500
> プログラム初心者がPHPだけでOOPを習得するのはほぼ不可能に近いと思う。
どんな言語でも当たり前。

> フレームワークとか利用しても、ユーザが$_POSTとか直接呼べちゃうと
> 結局OOPの意味が無いんではないだろうか?
まったく関係ない。
0502nobodyさん
垢版 |
2008/02/24(日) 14:04:04ID:???
PHPでOOPするには
初心者じゃ無理だよ
オブジェクトの設計は上手に出来ても
コーディングレベルで初心者ならではのミスが目立つ
0503nobodyさん
垢版 |
2008/02/24(日) 14:08:38ID:???
PHPでOOP勉強は適してないよ
JAVA,C#,rubyみたいに
OOPを前提として作られた言語じゃないからね
0504nobodyさん
垢版 |
2008/02/24(日) 15:14:16ID:???
「PHPでOOPは」みたいな話は何度も出てるのに、いつも具体的な話にならないのは何で?
0505nobodyさん
垢版 |
2008/02/24(日) 15:31:22ID:???
お前に知識がないから
0507nobodyさん
垢版 |
2008/02/24(日) 15:38:42ID:???
関係なくはないよ。グローバル変数として、どこからでも呼べちゃうんだから、カプセル化できてないってことになる。
だいたい$_REQUESTや$_SESSIONがオブジェクトじゃなくって、変数な時点で、PHPのウェブアプリでオブジェクトなんて使うなっていう、PHP開発者からのメッセージと理解すべき。
0508nobodyさん
垢版 |
2008/02/24(日) 15:44:11ID:???
グローバル変数が使えたら、カプセル化できない言語ってことになるのか。
そりゃすごい。
0509nobodyさん
垢版 |
2008/02/24(日) 16:03:09ID:???
俺も、>>469に書いてる、コントローラで判断させるべき処理の具体的な
コードを教えて欲しい。
このコードの話が質問されても出ていないのはなぜ?フレームワークを
使わないと、理論を完全に実現できないとかそういう話だから?
0510nobodyさん
垢版 |
2008/02/24(日) 16:19:48ID:???
>>479=486も結局答えられてないしな。
だめだだめだと言うものの、何故だめなのか、どう書けばいいのかということには答えられない低レベル批判厨なのさ
0511nobodyさん
垢版 |
2008/02/24(日) 19:08:42ID:???
また見えなくすることをカプセル化と勘違いしてる高レベルプログラマさんのお出ましだ
05121 ◆SWtzLesEmM
垢版 |
2008/02/24(日) 19:49:37ID:???
>>1 ◆SWtzLesEmM :2007/02/23(金) 13:35:52

このスレも1周年を迎えてましたね!
…時間が経つのは早いなー。><

1年前からあまり進歩してないのは気のせい?(・∀・)
05131 ◆SWtzLesEmM
垢版 |
2008/02/24(日) 19:50:55ID:???
>>487
PHPでOOPを勉強するとき、フレームワークは良い見本になりますね!

>>490
>PHPにこだわる理由がわからない
ホームページ作成でPHPの勉強を始めました。
プログラミングの勉強をしていたら、手続き型以外にOOPという方法があることを知り、使えるようになりたいと思いました。

>>502
Zendが積極的に音頭を取って、初心者向けの情報提供をやってくれたらいいですね。><
http://www.zend.co.jp/tech/
Zendの代わりに、PHPプロというサイトがPHP初心者のニーズをカバーしてくれているでしょうか?(・∀・)
http://www.phppro.jp/

>>503
Javaもちょっと勉強してみました。^^
…今使っているレンタルサーバだとJavaが動かない><

>>507
自分で作ったクラスに関しては、クラス内に変数を封じ込めておけるので、スコープ(変数が操作できる領域)をコントロールできるのではないでしょうか?
PHPが最初から用意してくれているグローバル変数($_REQUES等T)のデメリットがよく分からないのですが、いつでもアクセスできるのでこれはこれで便利だと思います。

とりあえず、PHPでOOPが使えるようになりたいです。
PHP以外の言語も使ってみて、必要に応じて使い分けができるようになれればイイですね!(´∀`)
05141 ◆SWtzLesEmM
垢版 |
2008/02/24(日) 20:01:23ID:???
フレームワークに関して情報提供どうもありがとうございます。

>>479
MVモデル…(ノ∀`) アチャー
以前作った掲示板を、MVCフレームワークの形で作り直してみました。(^^)v

http://ssurl.net/ryol
0515nobodyさん
垢版 |
2008/02/24(日) 20:34:16ID:???
結局1のやりたいことは
アマゾンのアフィリエイトの誘導らしいwww
05161 ◆SWtzLesEmM
垢版 |
2008/02/24(日) 22:49:51ID:???
>>515
PukiWikiPlusでamazonプラグインをデフォルトのまま使うと、プラグイン作者さん?のアフィリエイトコードが付くようですね。><
ttp://cafelounge.net/dev/?PukiWiki%20Plus!%2FPlng-in%20Customize#a5aa9e2a
>amazonアカウントを設定します。
>define('AMAZON_AID','mikoscafeterr-22');

アフィリエイトはやってませんが、とりあえず本の情報をまとめるのに便利なのでamazonプラグインを使ってみます。^^
0517nobodyさん
垢版 |
2008/02/25(月) 07:27:51ID:???
>>516
本の情報とかいらんよ
あと、valueclickのアフィリエイトも出てるし
あとTOPページいくとgoogle広告も出てる
結局こういうことかいな
最悪やなお前
0518nobodyさん
垢版 |
2008/02/25(月) 11:09:54ID:???
具体的な本の紹介をサイトに掲載することは俺は賛成だけどな。
でも、単に羅列してるだけよりも、読んでみてどう思ったのかという
レビューをだして、その人なりの評価を出して欲しいとは思った。
羅列しているだけだと、そのサイト特有の色を感じない。
0519nobodyさん
垢版 |
2008/02/25(月) 11:36:58ID:???
どう考えても本の紹介を書くのおかしいだろう?
ここだけじゃないけど
技術的なサイトに広告とかマジうざい!!!!



0520nobodyさん
垢版 |
2008/02/25(月) 11:41:53ID:???
「OOPやるのならば、PHPを辞めた方がいい」といっている人は、
それをいいたいのならば、もっと具体的に言って欲しい。
「RubyはもともとOOPとして設計されている」とか抽象論で終わってるから
何も話が進まず、同じことの繰り返しが続いているんだと思う。
「$_POSTなど、グローバル変数があるからオブジェクト指向的な考えには
ならない」とかそういう話をしてもらえれば、勉強する人はそれを
それぞれに解釈して学んでいけるのではと思う。
「じゃ、辞めようか」と思う人もいれば、「じゃ、その部分だけ気を
つけていけばPHPでもOOPがやれるんだな」と思う人もいるわけで。
0521nobodyさん
垢版 |
2008/02/25(月) 11:44:37ID:???
1は誤解を招くことは面倒だからやめた方がいいよ

0522nobodyさん
垢版 |
2008/02/25(月) 11:44:58ID:???
>>519
そこまでいいきるのなら、じゃ、みなけりゃいいじゃんとか思うけどな。

あからさまなCMじゃなければいいと思うけどな。俺はこの本をつかって
こういう勉強をして、こういう役に立ったとか、いいじゃん。
このスレは勉強しようっていうスレなんだから。
0524nobodyさん
垢版 |
2008/02/25(月) 11:47:54ID:???
特に2ちゃんはスレ利用して
最終的に宣伝目的にするやつが多いからな
リンク先に広告があるかどうかだけはシビアに見てる奴が多いよ
0525nobodyさん
垢版 |
2008/02/25(月) 11:51:48ID:???
100歩譲って本を紹介しても、それは構わないけど
それがアフィリエイトになってるのがおかしいよ
0526nobodyさん
垢版 |
2008/02/25(月) 11:54:29ID:???
以前、面白いレスを自分のサイトに集めて、面白かったと思う
投稿も受け付けたりしていて、そのサイトに広告を出して儲けてた
人がいて、叩かれたことがあったからな。
あと、のまねこ。
そういう事件があったから、2ちゃんねるをつかって管理者が
儲けようとする目的で広告が掲載されていることにはぴりぴりと
している傾向はあると思うな。

2ちゃんねるを通じて何か企画をするのには賛成だけど、やるのなら
GPLライセンスでやるみたいな意識でやらないとだめなんじゃないかな。
0527nobodyさん
垢版 |
2008/02/25(月) 11:59:06ID:???
書籍の紹介は良いと思う。そうしないと、@ITの紹介もだめになるわけで、
本当に内容の無いことしかかけなくなってしまう。
情報をまとめていることで、便利だというものもあるしね。
だけど、「アフィリエイトはダメだ」という意見には賛成だ。
0528nobodyさん
垢版 |
2008/02/25(月) 12:02:29ID:???
1がアフィリエイトするのは構わないけど
2ちゃんを利用するというのが問題あり
0529nobodyさん
垢版 |
2008/02/25(月) 12:06:47ID:???
2ちゃんねるのスレのまとめサイトであるにもかかわらず、
アフィリエイトされていると、それがどこかで告知されて、
大きく騒がれると思う。このスレに厨を沢山呼ぶことにも
なりかねない。
記念パピコとかが大量に来るので、1は早急にアフィリエイトは
辞めるべきだと思う。
0530nobodyさん
垢版 |
2008/02/25(月) 12:07:12ID:???
嫌いだと思う事と否定すべき事は分けるものだと思うが、ここでのOOPの議論を見れば
それができないのも仕方がない。
0532nobodyさん
垢版 |
2008/02/25(月) 12:34:45ID:???
2ちゃん利用して金儲けはよくないし
まとめサイトで書籍紹介するのも始めてみて正直びびった
05331 ◆SWtzLesEmM
垢版 |
2008/02/25(月) 12:50:47ID:???
ご意見どうもありがとうございます。もう少し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
勉強するとき、本を読む人っていますよね?
本は読まない人もいると思いますが、本の情報も調べたのでついでにまとめました。
0534nobodyさん
垢版 |
2008/02/25(月) 12:58:27ID:???
1の目的がよくわらん。
1がコテハン使ってスレをリードするのおかしいやろ?
まとめサイトも1が作るのちゃうやろ
名無しがやることやろ
0535nobodyさん
垢版 |
2008/02/25(月) 13:00:22ID:???
1がスレをリードせんといて
長くレスが続くなら
それは本当に需要のあるスレであって
1が作り上げたスレになってるやん
0536nobodyさん
垢版 |
2008/02/25(月) 13:14:26ID:???
>>533
1(個人)に利益が出てたら、必ず騒ぐ人が出てくる。
しかし、利益が出てなければ、その旨を断っておけば、
騒いでいる意見は無視しておけば、しばらくすれば蒸発
すると思う。
0537nobodyさん
垢版 |
2008/02/25(月) 13:18:05ID:???
>>534
俺は1ではないが。

> 1の目的がよくわらん。
スレタイの通り。PHPでOOPを勉強する。

> 1がコテハン使ってスレをリードするのおかしいやろ?
何がおかしいのかがわからん。
こうあるべきだとかいうガイドラインでもあるわけ?

> まとめサイトも1が作るのちゃうやろ
> 名無しがやることやろ
お前のローカルルールを押し付けるな。
1がまとめサイトやめたら変わりにお前がやるのか?
0538nobodyさん
垢版 |
2008/02/25(月) 13:21:26ID:???
>>535
お前のやりたいことの方が分からん。
変な哲学押し付けるな。
0539nobodyさん
垢版 |
2008/02/25(月) 13:27:10ID:???
スレ主がまとめサイト作ってるスレてあるの?
広告目的以外に見たことないんだけどwww
0540nobodyさん
垢版 |
2008/02/25(月) 13:30:31ID:???
なんで事例が必要なの?
0541nobodyさん
垢版 |
2008/02/25(月) 13:35:02ID:???
>>539
だったら君が利用しなきゃいいだけでは?
0542nobodyさん
垢版 |
2008/02/25(月) 13:35:25ID:???
WebProg板で
スレ主がまとめサイト作ってるスレどこにあるんだよ?
0543nobodyさん
垢版 |
2008/02/25(月) 13:36:07ID:???
2ちゃんにふさわしくない行動は見て見ぬふりは出来んよ
0544nobodyさん
垢版 |
2008/02/25(月) 13:39:24ID:???
1は需要のないスレを無理に上げるのやめて欲しいよ
自分の存在を認められたいだけのオナニスレだよ
0545nobodyさん
垢版 |
2008/02/25(月) 13:44:21ID:???
アフィリエイト見てオナニスレてことに確信がもてたよ
このスレは1の自己満足以外に何も生まれないよ結果としてね
0546nobodyさん
垢版 |
2008/02/25(月) 13:45:42ID:nYfgU4lL
>>543-544
何で君はスルーができないの?
誰も書き込まなければそのまま消えていくんじゃないの?
0547nobodyさん
垢版 |
2008/02/25(月) 13:46:57ID:???
コテハン使って自慢げにソースコード公開するやつは
よほど腕に自信がある奴か
初心者相手に自己満足したい奴かのどっちか
0548nobodyさん
垢版 |
2008/02/25(月) 13:47:30ID:???
>>545
君の語りを見てオナニレスてことに確信がもてたよ
これらのレスは君の自己満足以外に何も生まれないよ結果としてね
0549nobodyさん
垢版 |
2008/02/25(月) 13:49:30ID:???
>>547
ああ、そうか。だったら君はもう来るな。
0550nobodyさん
垢版 |
2008/02/25(月) 13:52:02ID:???
1が名無しとなって言い訳してるくさいな
0551nobodyさん
垢版 |
2008/02/25(月) 13:54:58ID:???
>>550
俺は1じゃないんだけどな。言い返せなくてそれしかいえないんだな。
それにお前がここに常駐する意味はないよな。
0553nobodyさん
垢版 |
2008/02/25(月) 14:52:48ID:???
コマツも軍需だよね
0554nobodyさん
垢版 |
2008/02/25(月) 17:26:59ID:???
さ あ 、 も り あ が っ
                  て
                     ま
                       い
                         り
                          ま
                           し
                           た
0555nobodyさん
垢版 |
2008/02/26(火) 10:28:32ID:???
1が書き込みしないと
恐ろしいほどさびれてんねw
1だけがPHPでOOPに興味があって
その興味を無理矢理に広めようとしてる
このスレの落胆ぶり見ればよくわかるwww
0556nobodyさん
垢版 |
2008/02/26(火) 12:06:28ID:???
PHPにかぎらず、「オブジェクト指向」が一般化したと言っても、実際にはライブラリ(フレームワークを含む)が
クラス化されて、プログラマはそれを使ってるという程度の話でしかないから、OOPそのものの話が盛り
上がらないのは、当然といえば当然。
0557nobodyさん
垢版 |
2008/02/26(火) 14:01:10ID:???
WebProgで勢いあるのなんてくだすれぐらいだろ
0558nobodyさん
垢版 |
2008/02/27(水) 22:15:02ID:???
何度も1のこと前向きにとらえようとしたけど
やはり1が何をしたいのかよくわからん
0559nobodyさん
垢版 |
2008/02/28(木) 00:08:29ID:???
OOPの勉強じゃないの?
0560nobodyさん
垢版 |
2008/03/01(土) 01:04:42ID:???
自称非営利団体の運営を本業に転換する難しさのバーチャル体験学習。
乗せられたボランティアからの不満が噴出。
ありがち。そして解散。ありがち。
0561nobodyさん
垢版 |
2008/03/02(日) 15:48:10ID:???
私も1が必死にスレ継続させてる意味が???
営利団体なら意味はわかりますが
0562nobodyさん
垢版 |
2008/03/02(日) 16:50:51ID:???
このスレ1年以上在るのに、 1 ◆SWtzLesEmM が書き込んだことがある日数って 16日だよ。
必死どころか、やる気があるのかと言いたい。

2007
02/23 02/24 02/27 02/28 05/12
06/12 07/06 07/11 07/26

2008
01/29 02/02 02/06 02/10 02/17
02/24 02/25
0564nobodyさん
垢版 |
2008/03/02(日) 23:43:21ID:???
まー、ここで勉強するな、とは言わないけど、本気でやろうと思ってる人は、まず自分で本買うなりして勉強すると思うよ。

別に興味ないやつはスルーでも何でもしときゃいいと思う。
0568nobodyさん
垢版 |
2008/03/28(金) 02:04:42ID:???
このスレで、今日から貴方もOOP!!!\(^o^)/

>>1
オッパッピーの間違いですよね
0571nobodyさん
垢版 |
2008/06/16(月) 13:47:07ID:???
難解も、難解も、オブジェクト指向
0572nobodyさん
垢版 |
2008/06/17(火) 12:52:46ID:???
スレタイの主旨からずれるけど、
やはりC言語は、一度は学んでいた方が良いな。

Javaからプログラムに入ったから、PHPのOOPでアロー演算子使うのにとても違和感あったのだけど、
Cの構造体を知って、ドットシンタックスよりアロー演算子の方が正統派と思えるようになった。
0576nobodyさん
垢版 |
2008/07/27(日) 23:15:55ID:???
諸事情により、Web系のプログラミングから離れていたけれど、
また時間がとれたら舞い戻ってきます。よろしくw
0577nobodyさん
垢版 |
2008/08/09(土) 20:52:22ID:???
PHPに触る機会が・・・なんで、VBばっかりなんだ・・・
05801 ◆SWtzLesEmM
垢版 |
2008/09/02(火) 15:51:27ID:w90kCMMO
クラスの作り方(設計)について、考え方が参考になる本がありました。

http://www.amazon.co.jp/dp/4798110558/
モデルとプロセスをめぐる冒険

「モデリング」ということについて調べてみると、いろいろノウハウがあるようです。
0584yodobashi
垢版 |
2008/10/26(日) 01:15:24ID:???
大手ECサイトのヨドバシドットコムが、サイトリニューアルから大規模な障害を3日間...
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail.php?qid=1220150877

506 :目のつけ所が名無しさん:2008/10/26(日) 00:47:20
大手ECサイトで、ここまで派手なリリース失敗は初めて見た。
エンジニア向けIT情報誌や関連サイトは、ぜひ取材して原因を明かして欲し
いは。
0587nobodyさん
垢版 |
2008/11/15(土) 09:19:30ID:???
定期的に保守してるの誰?
糞スレに対してその執念が怖いんだが。。。
0588nobodyさん
垢版 |
2008/11/23(日) 22:46:31ID:???
お前の粘着質の方が怖い
0589nobodyさん
垢版 |
2008/11/29(土) 11:22:40ID:???
PHP でオブジェクト指向の設計をするための 7 つの良い習慣を身につける
http://www.ibm.com/developerworks/jp/opensource/library/os-php-7oohabits/

PHP での適切な OO の習慣を身につけることによって、より安定していて、保守が容易で、拡張も容易にできるアプリケーションを作成することができます。そのためには、次のことを忘れないでください。

* 控え目である
* 良き隣人である
* メドゥーサを見ないようにする
* 結びつきを極力弱くする
* 結束性を高める
* 家族の一員として扱う
* パターンで考える

こうした習慣を身につけ、使いこなせるようになると、皆さんはきっとアプリケーションの品質が変わったことに驚くはずです。
0590nobodyさん
垢版 |
2008/11/30(日) 22:51:36ID:???
内容は否定しないが、その書き方はどうかなと思うな。
英語の翻訳だからなのかな。
「メドゥーサを見ないようにする」なんて飛躍した比喩表現では
イメージつかないだろw
0592nobodyさん
垢版 |
2008/12/01(月) 12:13:27ID:YUzphIUV
>>589
メデューサの項目でインタフェースを使う意義って何?
ファクトリーパターンの利点しか説明してないような気がするんだが
0593nobodyさん
垢版 |
2008/12/02(火) 01:29:02ID:???
>>591
広告の方が多いってどうなんだよ
1:4で広告じゃねーか
0594nobodyさん
垢版 |
2008/12/04(木) 18:30:24ID:???
DIコンテナとかどうなのか
0595nobodyさん
垢版 |
2008/12/14(日) 06:43:35ID:???
オブジェクト指向のカンタンな例

<?php
class A
{
function foo()
{

echo 'hello <br>';


}
}



$a = new A();
$a->foo();

$b=new A();
$b->foo();



?>
0596nobodyさん
垢版 |
2008/12/15(月) 02:03:44ID:???
簡易なMVCモデルのサンプルってないのかなぁ。
フレームワークを作るとか、フレームワークを使うとかじゃなくてさ。
考え方を学ぶためにみてみたいんだけど。
過去ログにあるように、つい、MVモデルになってしまうもんで。
0597nobodyさん
垢版 |
2008/12/15(月) 03:35:20ID:???
巷に星の数ほどあるだろ
0598nobodyさん
垢版 |
2008/12/15(月) 12:27:44ID:???
Googleで、

簡易なMVCモデル

と検索させる

ttp://www.google.com/search?client=safari&rls=ja-jp&q=簡易なMVCモデル&ie=UTF-8&oe=UTF-8

ドゾ...
0599nobodyさん
垢版 |
2008/12/16(火) 10:49:27ID:???
結構前の話だけど、>>488-489へのレスってついてるのかな?
過去ログ読み直してみても、何処が批判されているのかが分からん。
Viewはこれでいいと思うのだが。
0601nobodyさん
垢版 |
2008/12/16(火) 11:17:25ID:???
はい?批判ってどれ?
0602nobodyさん
垢版 |
2008/12/16(火) 12:52:53ID:???
>>601
批判している書込みは>>479です。
「に」のサンプルが、(コーディングにかかわるルール以外で)
MVCの設計はこれで良いのかがあいまいなまま終わってる気がします。
0603nobodyさん
垢版 |
2008/12/16(火) 13:03:16ID:???
気になってる批判は>>469もだな。そして>>471となっているが、そのレスが
無くておわってないかい?
0604nobodyさん
垢版 |
2008/12/16(火) 19:38:24ID:???
よくわかんないんだけど、OOPとMVCって両立できるの?
0605nobodyさん
垢版 |
2008/12/16(火) 19:50:24ID:???
MVCをOOPで実現するんだろw
0606nobodyさん
垢版 |
2008/12/17(水) 01:23:14ID:???
これどうなの?

ttp://www13.plala.or.jp/naka_jima/php/chapter12.html
0608nobodyさん
垢版 |
2008/12/17(水) 03:42:22ID:???
MVCだと必ずフレームワークを使わなければならないわけでもないよね。ちがうの?
それとも、非常に単純なクラス構成でMVCを実現しようという考えが間違いとか?
0610nobodyさん
垢版 |
2008/12/17(水) 10:09:45ID:???
>>606見たんだけど、MVCってこんななの?
View や Model 1つに対して1ファイルみたいだけど、ファイル量半端ないことになりそう。
0611nobodyさん
垢版 |
2008/12/17(水) 14:15:45ID:???
DBの形式や最終的な見せ方によって、ファイル数は変わるんじゃないの?

でも、MVCってわりとファイル多めだよな!

1ファイルのコード量、大して多くないけど
0612nobodyさん
垢版 |
2008/12/17(水) 15:06:27ID:???
ファイルが多めなのが嫌なら1ファイル内に複数書けばいいじゃない
0613nobodyさん
垢版 |
2008/12/17(水) 17:53:39ID:???
OOPそのものをやろうとするとクラスやファイル量が多くなるからね。
汎用性を考えて作ろうとするとなおさらだ。それはしかたがないのかも。

そこをあえて、フレームワークや外部のモジュールなどを使わずに
非常にクラス数を少なくしてやってみたいなと思うんだけどね。
MVCの理解の一環として。
0614nobodyさん
垢版 |
2008/12/17(水) 20:20:24ID:???
やってみればいいのでは?
0615nobodyさん
垢版 |
2008/12/18(木) 01:34:16ID:???
<?php
class Framework{
    // コントローラー
    public function controller(array $inp){
         $model = $this->model($this->di('Action', $this->di('Action_Mapper',$inp));
         $this->view($model);
    }
    // モデル
    protected function model(Action $actions){
        return $action->do();
    }
    // ビュー
    protected function view($model){
        print ($this->di('View_Helper', array($model));
    }
    // DIコンテナ
    protected function di($class, $options){
       return new  $class($options);
    }
}
class HelloWorld extends Frameworkd{}
App::controller($_GET);
0618nobodyさん
垢版 |
2008/12/18(木) 08:21:41ID:???
せめてクラスは3つ以上にするべきだろ。
最低限といっても、ファイルを読み込んで表示とか、書き込みとかの処理まで
出来る機能を持ったほうがコントローラとビューの違いが明確に分かりやすく
なると思うんだけど。
0619nobodyさん
垢版 |
2008/12/18(木) 10:48:40ID:???
これはMVCどこがやるのが妥当か?
ってところで迷う。
時々、曖昧なのが出てきちゃう。
0620nobodyさん
垢版 |
2008/12/18(木) 11:48:41ID:???
>>619
ここで事例を通じて具体的な意見を交わしていけばどうかな?」

例えば・・・
掲示板
■コントローラ:処理の内容を判断するクラス
・プログラムが実行された時、一番最初に実行される
・POSTの値をみて、以下の処理にてどれに該当するかを判断する
 ・データを表示する
 ・データを書込む
 ・編集用のフォームを表示する

■ビュー:htmlのレイアウト表示を担当するクラス
・以下のメソッドを持つ
 ・データをhtmlで表示する
 ・データ編集用htmlを表記する

■モデル:データファイルを管理するクラス
・ファイルの読み込み、書込みをする
・外部とは1件分のデータはBBSLineクラスでやりとりする
0621nobodyさん
垢版 |
2008/12/18(木) 12:24:15ID:???
>>620

『■コントローラ:処理の内容を判断するクラス 』の
>  ・データを表示する
>  ・データを書込む


『 ■モデル:データファイルを管理するクラス 』の
> ・ファイルの読み込み、書込みをする


って、意味が重複しているような感じがするのですが...


ならば、
■コントローラ:処理の内容を判断するクラス
  ・モデルからデータを受け取る
  ・モデルにデータを渡す

とかでは、おかしいですか?
0622nobodyさん
垢版 |
2008/12/18(木) 12:52:00ID:???
>>621
>>620じゃないけど。
・データを表示する
・データを書込む
・編集用のフォームを表示する
実際に上記の作業をするのは View と Model だよ。Controllerがするわけじゃない。
コントローラーはどれがリクエストされたかを判断して、適切な Model と View を呼び出す。
0623nobodyさん
垢版 |
2008/12/18(木) 16:39:54ID:???
>>469は具体的に何処のコードを批判しているのかが分からないので
どなたか解説を頼みます。
0624nobodyさん
垢版 |
2008/12/18(木) 20:10:31ID:???
MVCモデルでM同士で連携することってあり?
それとも必ずC経由?

C経由の場合、Mをなるべく疎結合になるように細分化してると、
Cの各Actionに書くロジック量が半端なく多くなってくるんだよね。
(Aデータを取ってきてBデータを取ってきてBをCバリデータに通してAとBを基にDを作成して・・・みたいな)
一つのAction内にロジックが増えるのもどうかと思うし、それって新しいモデルじゃんという気もしてこないでもない。
0625nobodyさん
垢版 |
2008/12/18(木) 20:23:33ID:???
>>624
俺はM同士で連携するかたちでも良いと思うけどね。
CからMを見た場合、あるまとまった処理単位でメソッドを呼び出す形であることが
重要だと思うから。
CがMを使うときは必ずメソッドA呼び出してメソッドB、メソッドCを実行しなければならない。
さらに、そういう3連呼び出しがCの中に何箇所か書かれているなんていうのは再利用性などが
悪くなると思うから。
0626nobodyさん
垢版 |
2008/12/19(金) 16:35:55ID:???
試しに掲示板をMVCでやったら、なんかやっとそれっぽくなった。
0628nobodyさん
垢版 |
2008/12/20(土) 14:28:47ID:???
>624
変化する内部状態を持つモデル同士で連携させると見通しが悪くなる。
生成してから、(観察される)内部状態が変化しないようなモデルはどこから呼んでもそれほど大きな問題はない。
オブジェクトの生成期間中に(観察される)内部状態が変化するようなモデルは、C直轄にしといた方がいい。
0629nobodyさん
垢版 |
2008/12/20(土) 14:34:18ID:???
生成期間→生存期間
なんか寝ぼけてた。

要は変化する「状態」を持っているもの全てはCの管理下に置いておいた方がいいってこった。
「状態」が無いもの(生成時にファイルからデータをロードしてそれっきり、とか)はどこにあったって構わない。
インスタンスの生成を行なうクラスは自分ルールでもいいからある程度絞っておかないと混乱すると思うけどな。
0630nobodyさん
垢版 |
2008/12/20(土) 15:34:43ID:???
変な質問だけど、OOP での Validator ってのがよくわかんねえ。
is_numeric(); とかをModel内にべた書きしないで、Validatorオブジェクトを通じて、変数の内容を確認すればいいの?

$str = 'string';
$valid =& new Validator();
$valid->isStr($string);

みたいな感じで。
BaseValidator みたいな基本的なチェックをするクラスを作って、継承した先で複雑なチェック用のメソッドを実装させればいいのかな。
0631630
垢版 |
2008/12/20(土) 15:37:54ID:???
引数間違えてる。最後の行。

$valid->isStr($str);

ね。まぁ、別に問題ないが。
0632nobodyさん
垢版 |
2008/12/20(土) 15:54:47ID:???
問題はありまくりだろ
0633nobodyさん
垢版 |
2008/12/20(土) 16:42:14ID:???
>630
ttp://gist.github.com/38261

俺はValidatorクラスはコントローラ単位で実装してる。「入力値の検証」なのだから、コントローラの責任。
Validatorだけ独立させるのはコードの見通しを良くするためであり、責任はあくまでコントローラにある。
ただ、実際にそっからコールするのはModelのメソッド。何が許可されるかを知ってるのはだいたいModelだからな。
たとえば受け付ける値が日付なら、そっから日付クラスのvalidateメソッドを呼び出す(MyDate::validate($string))。

POSTされる中に列挙型(<select>から送られるような、選択肢が限られているもの)とかがあった場合にこの構成は滅茶苦茶強い。
<select>のためのデータ生成とか、送られたvalueから画面表示用の文字列(「〜モード」とか)への変換を一箇所に集められる。
あと、文字列が決まったフォーマットになっているか調べる場合とかな。

is_strとかctype_stringとかstrlenだけで検証が終わるものはvalidatorクラス内に直書きする。
validateNumericとかvalidateStrとか書くよりその方が分かりやすい。
0634nobodyさん
垢版 |
2008/12/20(土) 17:07:58ID:???
>>633
ものすごく丁寧にありがとう。
まだぼんやりとしかわからないけど、サンプルコードを読み解いて、いろいろ試してみる。
0635nobodyさん
垢版 |
2008/12/20(土) 17:13:17ID:???
>>633

>「入力値の検証」なのだから、コントローラの責任。

「検証する」んじゃなく「検証させる」のが仕事じゃないの?
ここでいう入力値の検証って例えばどんなこと言ってる?

3行目で
>何が許可されるかを知ってるのはだいたいModelだからな。

って書いてるってことは、なにか、Modelに関係ないものを想定してると思うんだけど。
0636nobodyさん
垢版 |
2008/12/20(土) 18:07:36ID:???
>635
大雑把に言うと、処理を始める前に可能なパラメータの検証全般。
純粋に入力値だけを見て判定できるものだな。システムや環境の状態を見なくとも判定できるエラーを出す役割。

処理を始めないと分からないもの(DBに指定されたエントリーがあるかとか)は、バリデーションでは扱わない。
DBにこの値があった場合はクッキーにこれが無いといけない…みたいなのも対象外。

日付として「'9999-12-31'」が指定されてもバリデーションでは引っ掛けない。これは有効な入力。
「'2008-13-45'」はバリデーションでエラーとして引っ掛ける。この日付が有効になる事はあり得ないから。
メールアドレスが正しいフォーマットかをチェックするのはバリデーションで、それが有効なメールアドレスかをチェックするのはモデル。
ユーザーIDとして正しいフォーマットならばバリデーションは通るが、当該ユーザーがいない場合モデルがエラーを出す。
0637nobodyさん
垢版 |
2008/12/21(日) 00:53:43ID:???
>>636

なんとなく分かるけど、
例えばそれだと「2008-13-45は日付(のつもり)」ってことを
コントローラが知っとかないといけないってことだよね?

あと、日付が必要なくなった、とかいうときは
コントローラーを変更しないといけないってことにならない?


なんか拘ってるようでアレだけどお勉強スレってことで許してw
0638nobodyさん
垢版 |
2008/12/21(日) 00:57:41ID:???
って、もしかして、リクエストとして渡ってくるものを想定してるのかな。

hoge.php?date=20081231

とか。
0639nobodyさん
垢版 |
2008/12/21(日) 12:32:43ID:???
>637
「コントローラ」の指している範囲が俺と違う気がする。

俺はディスパッチャ(処理の振り分け)部分じゃなくて、そこから振り分けられる先のコントローラを指している。
ぐぐったが、「アクション」としてクラスにして丸ごとコントローラから切り離す文化圏もあるようだな。
「日付のつもりで送られてくる文字列がある」という事実は、ディスパッチャは(たいていの場合)知らない。
が、コントローラ(アクション)は知っている。だって知らないと日付具象モデルに処理を引き渡しようがないからな。

Cにはどの道変更が入る。リクエストをモデルに引き渡すのが仕事だからな。
「日付がどこからどう渡ってくるか」はCの管轄であってMじゃない。Mはそれを知っていてはいけない。
Mは「日付を渡されたらどうする」だけ知っていればよく、実際問題どこに日付があるかはCが隠蔽すべき。

たとえば、日付指定でDBからレコードを取っていたのを、「無指定時は今日と見なす」と変更したとする。
この場合は、Cを「日付省略時は現在の日付でMを呼び出す」ように変更し、Mには触れないのが正しい。
「省略時は日付を無視して過去のレコードを全取得する」という場合は、データ取得ロジックが変更なのでまずMは変わる。
制御の構造、呼び出しインターフェイスも変わるのでCも変わる。
0640nobodyさん
垢版 |
2008/12/21(日) 12:37:44ID:???
まあ実際は、日付省略時のMの挙動を変えるだろうけどな。

>638
入力値以外のもの(DB内の値とか処理結果)の検証は当然モデル。
というか、そういうのは一般にはバリデーションとは言わずアサーションと呼ぶ。
0641nobodyさん
垢版 |
2008/12/21(日) 13:45:12ID:???
>>639
Cは振り分けだけが仕事だと思ってたんだけど。
その先にさらに C があることなんてあるのか。

サブコントローラーみたいな感じ?
0642nobodyさん
垢版 |
2008/12/21(日) 14:51:26ID:???
>641
やっぱ、そこか。
例えばブログの場合、エントリー群を司るモデルや、タグクラウドを司るモデルができる。これは自明だな。
で、データを受け取って画面を表示するだけの、ごく単純なビューがいる。これも自明。
で、それら呼び出してページのデータを作る、という「データの統合」を司るクラスが必要になる。
これをMVCのうち、MとCのどっちに置くかの問題。

MVC、MVCって言ってるけど、本質的には4層なんだよ。
処理の振り分けに1層を割くならば、4層なくてはならない。
処理の振り分け=呼び出すCの決定(ディスパッチャ)→どのMを呼び出すかを制御する(コントロール)
 →データを実際に扱う(モデル)→表示(ビュー)、となる。

実際のフレームワークだと、RailsやZendはDispatcherが振り分けを担当し、制御はコントローラが執っている。
(だから、おまいの目から見れば、コントローラは仕事をやりすぎに見えるはず)
SymfonyやCakeだとControllerがディスパッチを担当し、制御はActionが執っている。
CodeIgniterだとディスパッチは単一のエントリポイント(リクエストを受けるphpファイル)であるindex.phpが行なって、制御はCが行なっている。
0643nobodyさん
垢版 |
2008/12/21(日) 15:35:51ID:???
>>642
>たとえば、日付指定でDBからレコードを取っていたのを、「無指定時は今日と見なす」と変更したとする。
>この場合は、Cを「日付省略時は現在の日付でMを呼び出す」ように変更し、Mには触れないのが正しい。
これって制御じゃなくてロジックだからモデル的仕事じゃねぇの?
0644nobodyさん
垢版 |
2008/12/21(日) 16:01:38ID:???
>>642
横槍で質問してすまんかった。
すげーわかりやすい。
勉強になった。ありがとう。
0646nobodyさん
垢版 |
2008/12/23(火) 01:41:15ID:???
>>645
あなたの顔に死相が出ていますよ。4層だけに。
0647nobodyさん
垢版 |
2008/12/24(水) 12:54:19ID:???
考え方としてディスパッチとコントロールは分けるべきだが、
実装するときは、コントロールで括るよな?
0648642
垢版 |
2008/12/24(水) 22:47:37ID:???
>647
M・V・Cで分けるならCってのは同意。いちおう
> 処理の振り分けに1層を割くならば
と予防線は張ってあるわけだが。
俺はControllerの親クラスとかControllerFactoryでディスパッチする事が多い。
0649nobodyさん
垢版 |
2008/12/25(木) 12:55:55ID:???
>>648

> Controllerの親クラスとかControllerFactoryでディスパッチする事が多い

ディスパッチャーのインターフェースを作って、コントローラクラスでインプリメンツするってのは駄目なの?
0652nobodyさん
垢版 |
2009/01/18(日) 01:35:36ID:???
手始めに、サイトのリニューアルついでにSmarty入れてCMS'っぽく'してみる。
0654nobodyさん
垢版 |
2009/02/02(月) 14:37:18ID:JcAer1H1
勉強すればするだけフレームワーク使えば手っ取り早いことがわかった。

自作のモチベ下がっちまったい。
0655nobodyさん
垢版 |
2009/02/02(月) 14:46:20ID:???
自作する理由は楽するためじゃないだろう
0656nobodyさん
垢版 |
2009/02/02(月) 14:54:00ID:???
もっと手っ取り早く使えるフレームワークをつくるために勉強すればいい
0657nobodyさん
垢版 |
2009/02/02(月) 15:06:11ID:???
元々目的としては自サイトで使うための軽量フレームワークを作るために勉強してたの。

で、既存のフレームワークのマニュアルとかソースを参考にしながら作ってたんだけど、取り込むつもりが逆に呑まれた形。
0658nobodyさん
垢版 |
2009/02/02(月) 20:06:44ID:???
凄く難解なソースを引き継ぎさせられて、途方にくれかかった。
で、市販のモジュールを使うなどして0から作り直すなどの方法を
模索したが、結局は引継ぎしたソースを解読して手を加えるのが
楽で、早い道であることが分かった。みたいな話かな?w
PHPではないが、俺はちょうどこんな感じの体験をしたことがあるw
0659nobodyさん
垢版 |
2009/02/03(火) 00:06:52ID:???
まぁ、たぶんそんな感じ。
要するにフレームワークの魅力に気付いたわけですよ。
0660nobodyさん
垢版 |
2009/02/03(火) 01:52:40ID:???
先に気づいてからやれば良かったな
0661nobodyさん
垢版 |
2009/02/04(水) 08:03:26ID:???
そういうのは簡単に気づけないだろう。
プログラムは体感して分かっていくものなのだから。
0662nobodyさん
垢版 |
2009/02/04(水) 21:38:41ID:???
俺としては魅力に気付けただけでも大きな進歩だ。

自作云々は別にして。
0663nobodyさん
垢版 |
2009/02/05(木) 22:29:31ID:6GWaaOT6
あけおめ
0664nobodyさん
垢版 |
2009/02/06(金) 07:54:15ID:???
では、その気づいた魅力的な部分をここなどで紹介してみるというのはどうよ?
PHPでOOPのスレの趣旨に添ってると思うし、他の人の意見を聞いて
参考になる部分もあると思うのだが。
0666nobodyさん
垢版 |
2009/02/09(月) 20:26:45ID:???
えらく昔の書き込みにレスしてるな。
0667nobodyさん
垢版 |
2009/02/12(木) 07:33:22ID:???
フレームワークの魅力についてまとめてみるか?
0669nobodyさん
垢版 |
2009/02/12(木) 15:59:22ID:???
>>667
wikiにしてもらえるなら俺も手伝う
0670nobodyさん
垢版 |
2009/02/12(木) 20:11:52ID:???
いや、俺はそんなに文章がかけるほど知識は無い。申し訳ないが、サポートに回る
0671nobodyさん
垢版 |
2009/02/12(木) 20:25:45ID:???
なぜにフレームワークの魅力をまとめようと?
0672662
垢版 |
2009/02/12(木) 20:56:21ID:???
>>662>>667
だからね。
俺は人に語れるほどまだ理解してないから。
0675nobodyさん
垢版 |
2009/02/12(木) 22:00:11ID:???
サポートするといってるんだから、教えてじゃないだろw
0676nobodyさん
垢版 |
2009/02/13(金) 20:54:05ID:???
ttp://q.hatena.ne.jp/1188498291
0677nobodyさん
垢版 |
2009/02/15(日) 23:40:26ID:???
>>676を読んでみて、PHPに限らず、ASP.NETを体感してみると、フレームワークの
メリットやデメリットがみえてくるんじゃなかと感じた。
あれは、ポストバックとか独自の理論があって、それを学ばないと使えるようになれない。
しかし、ページをまたがってデータの受け渡しをする際は、非常に便利な機能であり、
使いこなせるようになると、生産性が向上する。
0678nobodyさん
垢版 |
2009/02/16(月) 00:05:47ID:???
一問一答形式でwikiでも作るか
0679nobodyさん
垢版 |
2009/02/16(月) 00:44:15ID:???
visualstudioが優秀すぐる
0680nobodyさん
垢版 |
2009/02/16(月) 11:09:32ID:IOY0ae9e
Java とか C#やったほうが飲み込みは早くなるのかな。
でも両者とも動かせるサーバって高いからなぁ。
Web以外にも用途はあるけど。
0681nobodyさん
垢版 |
2009/02/16(月) 19:31:23ID:???
>>680
いろいろな言語に触れてみると、その分視野は広くなることだろう。
共通して実装している機能を見ることで、OOPの概念をつかんだり
出来るはずだし。
しかし、広く浅くにとどまっていると、何も作れないで終わるので、
物を作る際は、一つの言語に絞り込んでいた方が良い。

なので、java や C# においてはローカルで稼動させるのにとどまらせて
おいたらどうかな?ASP.NET だと、Webアプリでもローカルでテスト動作
させる環境が Express にもついてるし。
0682nobodyさん
垢版 |
2009/02/16(月) 23:33:26ID:???
ウェブアプリの範囲なら、どの言語のどのフレームワークでも大差ないよ。
ASP.NETは、デスクトップアプリケーションからのアプローチなんで、これだけちょっと勝手が違うけど。
プログラミングを仕事にするなら、最初は型ありの言語をやった方がいいと思う。
JavaとかC#が理解出来れば、PHPやPerlはすぐに分かる。
0683nobodyさん
垢版 |
2009/02/17(火) 12:38:03ID:???
でも、perlってすぐ忘れちゃうよな...
0684nobodyさん
垢版 |
2009/02/17(火) 20:53:57ID:???
>>683
それはそれで良いのではないかと思っている。
perlのモットーがあわないのであれば、PHPを使うで良いと思うし。
0685nobodyさん
垢版 |
2009/02/23(月) 20:40:12ID:???
PHP では OOP を学べないという意見があるが、結論だけ
いうのではなく、その理由の部分を述べていくといいかもね。
0686nobodyさん
垢版 |
2009/02/23(月) 21:35:23ID:???
別に学べるのでは?
0687nobodyさん
垢版 |
2009/02/23(月) 22:27:49ID:???
ん、どこかにPHPでは学べないと書いてあるのかな?

個人的には、純粋にOOPを学びたいのであれば別の言語がいいかなーとは思う。
理由は、Webは身近だし使い慣れてると言えるかもしれないが
PHP以外のHTMLやらJSやらHTTPプロトコル等知らなければいけない知識が多くあるから。
その辺を知っていれば問題はないと思うけどね。
0688nobodyさん
垢版 |
2009/02/23(月) 23:55:46ID:???
オブジェクト指向を本格的に勉強したければ、GUIのプログラムを書いた方がいい。ウェブアプリじゃオブジェクト指向が出る幕はない。
0689nobodyさん
垢版 |
2009/02/24(火) 02:09:17ID:???
出る幕はあると思うが、最終的にフレームワークを構築することになると思う。

いきなりWEBフレームワークを作ることは難しいので、
実際に存在するフレームワークのソースを追いかけ、参考にしながら、
オレ的フレームワークを組み上げることで、様々な知見を得ることができると思う。

また、これらのフレームワークはたいてい、何らかのデザインパターンやアークテクチャパターンが使われているため、併せてこれらも学習する必要があると思う。
0690nobodyさん
垢版 |
2009/02/24(火) 12:23:13ID:???
WEBアプリでもActionScript3なら、バリバリOOPだYO!
0691nobodyさん
垢版 |
2009/02/24(火) 12:40:12ID:???
まあ、いつかはサーバサイドはAPIを提供するだけで、クライアントのUIはFlashとかJavaScriptに任せるような時代がくるのかも。
0692nobodyさん
垢版 |
2009/02/24(火) 19:41:39ID:???
>>691
エンタープライズならそんなケースいくらでもあるだろw
0693nobodyさん
垢版 |
2009/02/24(火) 20:31:42ID:???
>>689
俺的フレームワークなんて作らないほうがいい。
自己主張ばかり強い勘違いになりがちだし、遠回り。
良い先人の手本を眺めるほうがよっぽど効率的だわ。
0694nobodyさん
垢版 |
2009/02/24(火) 20:35:16ID:???
>>693
ホントにそうだとしたらとっくに淘汰されて現状のフレームワークの乱立状態にはならないと思うが
0695nobodyさん
垢版 |
2009/02/25(水) 06:21:18ID:???
>>692
聞いたことないな。そんなことするぐらいなら、Windowsアプリケーションなり、Accessなりで直接DBを参照するから。
0696nobodyさん
垢版 |
2009/02/26(木) 22:25:57ID:???
クライアントマシンの性能がこれだけアップしているのに、
クライアントマシンの性能を利用しないなんて
どれだけ無駄なんだかw
0697nobodyさん
垢版 |
2009/02/26(木) 23:57:14ID:???
ぶっちゃけサーバサイドのフレームワークは制作の効率のためであって
性能うんぬんは考えてないんだよな
0698nobodyさん
垢版 |
2009/02/27(金) 00:54:42ID:???
勉強不足で申し訳ないんだが、制作の効率より性能うんぬんを優先したフレームワークを教えて欲しい
0699nobodyさん
垢版 |
2009/02/27(金) 05:45:51ID:???
つーか開発効率は性能に含まれるだろう
0701nobodyさん
垢版 |
2009/02/27(金) 13:31:01ID:???
699 名前:nobodyさん[sage] 投稿日:2009/02/27(金) 05:45:51 ID:???
つーか開発効率は性能に含まれるだろう
699 名前:nobodyさん[sage] 投稿日:2009/02/27(金) 05:45:51 ID:???
つーか開発効率は性能に含まれるだろう
699 名前:nobodyさん[sage] 投稿日:2009/02/27(金) 05:45:51 ID:???
つーか開発効率は性能に含まれるだろう
699 名前:nobodyさん[sage] 投稿日:2009/02/27(金) 05:45:51 ID:???
つーか開発効率は性能に含まれるだろう
699 名前:nobodyさん[sage] 投稿日:2009/02/27(金) 05:45:51 ID:???
つーか開発効率は性能に含まれるだろう
699 名前:nobodyさん[sage] 投稿日:2009/02/27(金) 05:45:51 ID:???
つーか開発効率は性能に含まれるだろう
0702nobodyさん
垢版 |
2009/02/27(金) 13:31:44ID:???
>>698
性能を求めるならフレームワークなんて使うなって話
0703nobodyさん
垢版 |
2009/02/27(金) 19:50:17ID:???
>>698が言ってる「性能」って何?
これは釣りなのか?
0704nobodyさん
垢版 |
2009/02/27(金) 20:00:15ID:???
「やあ、とりあえず性能の一番いいやつを一つくれないか。」
「今日はCakePHPがお勧めとなっております。」
「じゃあ、そいつをくれ。」
「かしこまりました。」
0705nobodyさん
垢版 |
2009/02/27(金) 20:35:39ID:???
>>703
なんで俺に絡むんだよ。
たった1個上のレスも読めないのか?
釣りなのか?
0706nobodyさん
垢版 |
2009/02/28(土) 01:39:57ID:???
>>705
何言ってるんだ?
1個上のレスを読んでるから性能って何って話だよな
0707nobodyさん
垢版 |
2009/02/28(土) 02:02:53ID:???
>>697に聞いてくれよ
俺は知らんよ。
使われた言葉返しただけなのにw
0708nobodyさん
垢版 |
2009/02/28(土) 04:26:33ID:???
1ファイルにphp+html+css+jsべた書きが催促
0709nobodyさん
垢版 |
2009/02/28(土) 08:03:49ID:???
SEO的に最悪だな
0710nobodyさん
垢版 |
2009/02/28(土) 08:44:26ID:???
出力されるHTMLがSEOに合ったものなら、途中経過は関係ない。
0711nobodyさん
垢版 |
2009/03/04(水) 21:56:11ID:vdYaMRth
PHPでMVCってModel, View, Controllerの3クラスに
それぞれ適当な補助クラスをコンポジる感じでok?
0713nobodyさん
垢版 |
2009/03/04(水) 22:51:16ID:???
検索するとViewは普通にHTML部分にしてクラスにしない奴が多いが…
それはどうだろう…
0714nobodyさん
垢版 |
2009/03/04(水) 23:44:42ID:???
>>713
別にありじゃない?
PHPTALってのもあるし
厳密には、TALに値渡す必要があるので、Viewが純粋なHTMLのみという訳ではないけど
0715nobodyさん
垢版 |
2009/03/05(木) 10:13:09ID:???
未だにコントローラが何者なのかわからねえw
コンポーネントってのもよくわからんし。
0716nobodyさん
垢版 |
2009/03/05(木) 11:05:22ID:???
基礎中の基礎すぎるだろ
0717nobodyさん
垢版 |
2009/03/05(木) 12:25:35ID:???
コントローラの役割そのものがわからないというよりも『どこまでがコントローラがやるべきことなのか?』ってことかな。

ビューとコントローラで迷うことはないけど、モデルとコントローラのどっちに書くべきかな、って言うのが多い。


まぁ、経験で補うもんだろうね。
0718nobodyさん
垢版 |
2009/03/05(木) 17:40:27ID:???
100%中の100%!!!!!!!!!!

byとぐろ兄弟
0719nobodyさん
垢版 |
2009/03/06(金) 04:31:52ID:???
ってか3つに分けようとするから分からないんじゃない?
0724nobodyさん
垢版 |
2009/04/06(月) 09:51:43ID:???
保守要らない板だから・・
0725nobodyさん
垢版 |
2009/04/08(水) 23:43:02ID:???
PHP研究所って全然PHP関係の書籍ださねーな。
社内だけで技術囲ってんじゃねーぞ。
0726nobodyさん
垢版 |
2009/04/08(水) 23:49:40ID:???
全然おもしろくない
0727nobodyさん
垢版 |
2009/04/10(金) 03:54:17ID:4A05Vd6N
オブジェクト指向で、MVCのMとCがいまいちつかめない
処理はModel、ViewとModelを制御するController
ってある。
例えば、ある条件を満たしたときに、データファイルからデータ一覧をリスト形式にしたくて、
・データ1
・データ2

みたいにずらーと繰り返しして表示するとき、
modelには、ある条件を満たしたしたかどうかを判断する処理を、
viewには<div>やら<ul><li>を、
controllerには繰り返しのwhileを?
って迷ってしまう。
でもwhileて処理になるからmodelに書いた方がいいんじゃあいの?、と・・
でもmodelにwhileの処理かくと、同時に<br>やらもmodelに書いて
viewには何を?・・ってなってしまって先にすすめない・・

つづく
0728727
垢版 |
2009/04/10(金) 03:59:45ID:4A05Vd6N
ごめん、やっぱりつづかない。
非常にわかりにくいかもしれないけど
こういうときって、素直にcontrollerにwhile処理いれとけばいいのかな。
でも、controllerに制限させるものが二、三個ならいいけど
もっとwhile処理するものが多くなれば、
処理がかぶってくるんだけど、
それが気持ち悪くて・・
なにか上手い回避方法を教えてください
0729nobodyさん
垢版 |
2009/04/10(金) 04:08:52ID:4A05Vd6N
で、一応考えたのが、
viewにはhtmlタグだけを、
modelには条件処理とwhile処理を、
このwhile処理の中にviewで書いたhtmlタグを
放り込んで繰り返し処理。
controllerで、このmodelに引数入れてやれば
このmodelの変数には、
条件処理された結果と、
htmlタグつきのデータ一覧が格納されて、
表示される。
みたいにしたんだけど、これでいいのかな。
wikiのまとめサイトみるとmodelにwhileかかずに
controllerに書いてたから、何か意図があってやってるのかなと
0730nobodyさん
垢版 |
2009/04/10(金) 04:22:59ID:???
MVCまだ早いんでないかな
0731nobodyさん
垢版 |
2009/04/10(金) 09:37:55ID:???
Model はデータをどこからともなく持ってくる。

View にはテンプレートエンジン使って View の中でループさせる。

Controller は Model に「データ持ってこい」と頼んで、受け取ったデータを今度は View に渡して「表示しろ」と頼む。
View は渡されたデータをぶん回して表示する。
「頼む」ってのは メソッドを呼び出すことを指す。


嘘教えてたら許して
0732nobodyさん
垢版 |
2009/04/10(金) 10:04:35ID:???
>>731
というとつまり、もしも動的にデータを一覧表示させたいときなんかは、
”データ持ってこいとModelに頼む→Viewに渡して表示させる”
という一回の表示を、whileなりなんなりを使って何回も繰り返す操作を
Controllerがやるってことでいいのか。
0733nobodyさん
垢版 |
2009/04/10(金) 10:51:33ID:???
date.txtにdate1,date2,date3,date4ていうデータが入ってたとき、

"2"という条件を与えたときに、
date1<br>
date2<br>
"4"という条件を与えたときに、
date1<br>
date2<br>
date3<br>
date4<br>
という一覧を行いたい場合。

Modelには、指定されるデータを一つ引き出せるメソッドを、
Viewには、Controllerから受け取ったModelの一つのデータの後ろに、<br>を加えてechoするメソッドを、
そしてControllerで、Modelのメソッドを実行して、得られたデータをViewのメソッドへ渡し、一つデータを表示させる、
この操作を条件分繰り返すwhileもControllerに書いておく。
で、いいのけ

超基本的な場合、イメージ的には、
・Viewは、htmlしか知らない人でも、(phpの変数以外は)htmlタグ部分がはっきりしてるので弄ろうと思えば弄れる作り
・Modelは、処理されたデータを与える
・Controllerは、初期条件をMVに与えたり、MVにあるいろいろなメソッドの中から、
 必要なものを選んで、データを得たり、表示させたり(MをVに渡して表示させたり)、
 MVを組み合わせて完成したものを表示させる
みたいな感じ
だけで基本的名ことがまだまだ全然わからん
0734nobodyさん
垢版 |
2009/04/10(金) 12:01:58ID:???
>>732
まあ作り方によるんだろうけど……

ループでViewを何回も呼び出すよりも、例えば配列でデータを一度に全部渡しちゃって、Viewにループしてもらったほうがスッキリしない?
Viewの中にPHPの生のコードが入るのを避けたいなら、先に挙げたテンプレートエンジン使うとかすればいいし。
0735nobodyさん
垢版 |
2009/04/10(金) 12:17:29ID:???
>>734
たしかにそうか
ループするデータ表示のデザインて単純なものが多いだろうし
デザイン変更するときも、viewにphpのコードが入っててもそこまで苦にはならないか。
テンプレートエンジンどれがいいか決めれないし、
controllerにphpコードの種類がいっぱい入ってくると見にくいし長くなりそうだから
とりあえずはviewでループさせる方法にしてみるわ
あんがと
0736nobodyさん
垢版 |
2009/04/10(金) 12:48:47ID:???
>>727

レス全部読んでないから、的外れになるかもしれないけど、
MVCの基本コンセプトは『プログラムの着火点(エントリーポイント)は、URLである』
という考え方が中心になっているらしいよ
つまり、どんなWEBアプリもそのプログラムにアクセスしないと何も起こらないという発想。
そこから更に考えを発展させて、URLの一部にメソッドを含めよたのがMVCのポイント。

この、メソッドを含んだURLを処理する枠組みをコントローラにした訳。

だから、コントローラを中心にデータをサーバに貯めるならModelに、
データをユーザに表示するならViewにと処理系を分けた。

一般的にビジネスロジックはModelにとか言われるけど、
このビジネスロジックとはデータに正規表現をかけて別の形に置き換えるとか、
特定の数値を暗号化したりとか、殆どの処理の処理を指す。

だから、ロジックの中心はModelで処理され、コントローラはただMやVにデータを振り分けるだけに徹するのが
正しいMVC設計と言われてる。

実際のコード量もControllerが異様に肥大しているMVCは、悪いMVCとされている。
迷ったらMにロジック書いて、Cから呼出すようにする。
どうしても呼出せないロジックだけCで処理しよう。
0737nobodyさん
垢版 |
2009/04/10(金) 13:22:45ID:???
>>736
なるほど
完全に思い込みで、
Vには、phpコードでの処理に関連するものはほとんど無くしてhtml表示メインが良い
みたいになぜか考えてしまっていて、なかなか進めなかった。

>メソッドを含んだURLを処理する枠組みをコントローラにした訳。
>だから、コントローラを中心にデータをサーバに貯めるならModelに、
>データをユーザに表示するならViewにと処理系を分けた。
これで、C、M、Vにはそれぞれこれをしようっていう考えが固まってきて
踏ん切りがついて先にすすめそうだ
とんクス
0738nobodyさん
垢版 |
2009/04/11(土) 01:35:03ID:???
ループして全部表示させるっていうのはVの仕様って気がするんだよねー。

最初の1件とか最初から100件とか、或いは全部っていうのはVの都合なわけで、
変更したいって思ったときはVだけ触ればよくしたい。

ってことで、
無駄とかなんとかは気にせずに、純粋な感じでいうと
Cの人は全部もらって、そのままVの人に渡す
っていうのがMVCぽいかな、って思う。

0739nobodyさん
垢版 |
2009/04/11(土) 07:42:37ID:???
>>738
俺は、Vの役割は「もらったデータを表示する」だと思ってるから、
ループする処理とかはCの役割だと思うけどな。
Vは、大量データ表示用のフォーマットや、1件詳細表示用のフォーマットを
持っているという形。
Cは、指定された件数のデータを表示させる機能を持っている、という形。
0740nobodyさん
垢版 |
2009/04/11(土) 07:47:58ID:???
抽象論も大事だけど、具体的にコードを書いていきながら進めると分かりやすくなるかもしれないね。
質問者さんは、自分の思う発想でコードを書いてさらしてみたらどうかな。
それに対していろいろな人がレビューをすると何か見えてくるかもしれない。
0742nobodyさん
垢版 |
2009/05/07(木) 16:51:10ID:???
OOPの理論って奥が深いな。
デザインパターンなども学んで理論に忠実に沿った理想的な
プログラミングをしてみたいなとも思ったけれど、つきつめると
ケースバイケースってことに落ち着くから、こういう、忠実さを
追いかけるのは無駄な考え方のような気もしている。
この考えで合ってるよね?w
0743nobodyさん
垢版 |
2009/05/07(木) 16:54:10ID:???
結論出ちゃったじゃないか
0744nobodyさん
垢版 |
2009/05/07(木) 20:10:16ID:???
それ、ASP.NETに新しく導入された「ASP.NET MVC」ってフレームワークの記事なんだよ。
そもそもASP.NETはイベントドリブンなフレームワークで、本来の意味でのMVCを採用してたんだけど、StrutsとかRoRとかがウェブで流行ったから、MSも似たようなフレームワークを作ったわけ。
だからのこれまでのASP.NETの方が本来的なMVCに近い。「ASP.NET MVC」は「ASP.NET ウェブMVC」とかって名前にすれば良かったのに。
0745nobodyさん
垢版 |
2009/05/07(木) 20:53:37ID:???
M$って、紛らわしい名前つけるのが好きだよね。
ASP.NETにおいてMVCに関する詳しい記事かなと思ったけれど、
実際に読んでみると、まったく別なフレームワークってことだった。
違いについて理解するのがひとつ面倒になったなぁ。
0746nobodyさん
垢版 |
2009/05/07(木) 23:05:13ID:???
stackoverflowを作ったヤツね。
0748nobodyさん
垢版 |
2009/06/18(木) 20:12:33ID:???
なんでカソってんだー
0749nobodyさん
垢版 |
2009/07/02(木) 08:55:14ID:SGa5I59I
PHPにおけるOOPは100mを自動車で走るようなもの
自転車を使え
走れ
歩いてもいいぞ
0750nobodyさん
垢版 |
2009/07/02(木) 09:07:04ID:???
OOPを使いまくる必要はないけど
必要な機能をモジュール化したいときにOOPをいいとこ取りすれば便利
0752nobodyさん
垢版 |
2009/08/27(木) 07:51:29ID:???
>>748
最初に設定していた目標が概ね達成出来たからじゃね?w
っていうか、このスレに求めているものを書いていけば
盛り上がりを戻す可能性もあると思うよ。
質問するとか、何かソースを提供するとか。
0753nobodyさん
垢版 |
2009/10/25(日) 21:56:08ID:???
一応保守しておきます。
0754nobodyさん
垢版 |
2009/10/30(金) 22:56:19ID:???
OOPのしっかりしてるFWどれ
0755nobodyさん
垢版 |
2009/11/13(金) 21:51:59ID:???
FWは、その開発目的によるので、結論は出ない。
いや、あおりとかじゃなくて。
0756nobodyさん
垢版 |
2009/11/19(木) 15:33:07ID:???
コードの参考になるのはどれかと
07571 ◆SWtzLesEmM
垢版 |
2009/12/17(木) 22:30:30ID:???
PHPのフレームワークでMVCのタイプを使ってみました。
同じ機能を作るのに、コードを書く量が少なくて済むと楽ですね!

ただ、MVCだとスクリプトのファイル数が多くなると、ゴチャゴチャして見づらいと思いました。
MVC以外のフレームワークでオススメのものはありますか?

http://www.slideshare.net/NetPenguin/mvc-2659370
・PAC
・RecursiveMVC(HMVC)
・MMVC
・Doc/View
という仕組みが紹介されていました。
07591 ◆SWtzLesEmM
垢版 |
2009/12/17(木) 22:48:51ID:???
>>754
ttp://d.hatena.ne.jp/sotarok/20091126/modern_php_programming_at_pfi
↑このスライド資料の72ページ目に、PHPフレームワークの評価が紹介されていました。

・CakePHP
 世界でも日本でも大流行り。当然日本語での情報量も多い。
 Modelが使いやすい。それ以外は嫌いだけど。
 Cake3が別フレームワークにfork

・ZendFramework
 世界的にシェアNo.1?
 書く量の減らないドMフレームワーク
  というかいわゆるライブラリ群

・symfony
 これも利用者多い
 大規模向け。がっちりしてる。

・Ethna
 グリーはこれで動いている!(古いバージョンだけど)

・rhaco2
 大本命の超変態フレームワーク
 すごい

Ruby(RoR)っぽいFW → CakePHP / Lithium
Java(Struts)っぽいFW → symfony
Python(Django)っぽいFW → rhaco
というかんじでしょうか?
07601 ◆SWtzLesEmM
垢版 |
2009/12/17(木) 22:56:44ID:???
>>756
ttp://d.hatena.ne.jp/kagigotonet/20091215/1260851032
>PHPはWeb特化言語という特性上他の言語では見られない強力な仕組みがあります。
>その特徴は他の言語では参照で取り回すところを文字列で取り回すところである、と言えるでしょう。
>可変関数
>PHPのフレームワークは、これを基本としています。ライブラリ、モジュールを動的にロードするのが非常に容易
>可変変数
>このように可変変数や可変引数を組み合わせるだけでも、少ないコード量でかなり複雑なことが可能になります。

各フレームワークのディスパッチ(処理の割当て)の仕組みを見ると、参考になりますね。
07611 ◆SWtzLesEmM
垢版 |
2009/12/17(木) 23:07:31ID:???
>>750
「名前空間」を活用すると、たくさんモジュールを作っても分類が楽になりますね!
ttp://d.hatena.ne.jp/Fivestar/20091215
ttp://prezi.com/0-vyhjdkslih/
0762nobodyさん
垢版 |
2009/12/17(木) 23:10:38ID:???
人の書いた文章を全文コピペするのはどうかと思うよ
07641 ◆SWtzLesEmM
垢版 |
2009/12/17(木) 23:43:57ID:???
>>734
>Viewにループしてもらったほうがスッキリ
そうですね。
データをループ表示させるのは、ビューの役割。

ビューの部分には
・テンプレート(HTMLファイル)
・テンプレートエンジン(HTMLファイルに文字列を当てはめるパーサー)
の二つが含まれている形にすれば、
表示に関するロジック(繰返し表示の処理など)はビューの中に置けばOK
=表示に関する機能を修正する場合、ビューの中を探せばOK
07651 ◆SWtzLesEmM
垢版 |
2009/12/18(金) 00:45:09ID:???
>>727
MVCのモデルはどんなふうに作るか?という話で、
・トランザクションスクリプト
・ドメインモデル
という二つのスタイルがあるそうです。

ttp://pc11.2ch.net/test/read.cgi/php/1241341332/
ttp://proshile.blog.drecom.jp/archive/616
・トランザクションスクリプト
 →古きよきC言語時代の関数が主体の書き方
・ドメインオブジェクト
 →オブジェクト毎に内包する値と役割の責務を明確にしたOOPライクな書き方

MVCのモデルの部分は2層に分けて、
(1)ビジネスロジックコンポーネント
(2)デーアクセスロジックコンポーネント(O/Rマッパーを含む)
と分類する考え方があるそうです。

ttp://satoshi.blogs.com/life/2009/10/rails_mvc.html
ttp://d.hatena.ne.jp/p4life/20091014/1255532618
>Skinny Controller, Fat Model
・コントローラーはシンプルにする
・モデルに処理を集約する → 上記(1)ビジネスロジック=データの加工を担当
・モデルはデータの整合性を保証する → 上記(2)データアクセスロジック=データの読み書きを担当

ttp://www.virtual-tech.net/blog/2008/10/reflex-restful.html
ttp://www.virtual-tech.net/blog/uploaded_images/designold-722880.PNG
↑この図だと、モデルの部分が2層に分かれていて、
サービス層=上記(1)
ドメイン層=上記(2)
という形になるかと思います。
07661 ◆SWtzLesEmM
垢版 |
2009/12/18(金) 00:55:44ID:???
>>728
C側に書いてあるコードを、なるべくM側の方に移動した方がスッキリするかも?
CとMの間のデータ受け渡しについて、こんな記事がありました。

ttp://q.hatena.ne.jp/1242894491
>個々のSetterをオーバーライド出来るところが
>symfonyの便利な部分じゃないでしょうか。
>これが出来ないと個々のコントローラでデータを加工するハメになります・・。
>「MVCとして洗練されている」というのは
>「MVCに忠実に機能している」というのと同義かと思います。

一口にOOPと言っても、各フレームワークでちょっとずつ使い方に違いがありますね。
07671 ◆SWtzLesEmM
垢版 |
2009/12/18(金) 01:20:21ID:???
>>89
フレームワークを使ってみて、OOPの使い方の理解が深まりました。
皆さん、たくさんのアドバイスをいただき、どうもありがとうございました。
分からないことがあっても、検索したり質問して1個ずつ埋めていけば、確実に進歩できると思います。

どんなプロフェッショナルな人でも、最初は素人だった…
これからPHPの勉強を始める方がいましたら、焦らずに頑張ってくださいね!(*^o^*)/
0768nobodyさん
垢版 |
2010/01/16(土) 21:42:43ID:???
どのフレームワーク?
0770nobodyさん
垢版 |
2010/04/20(火) 14:58:53ID:???
オブジェクト指向ってrequire文とinclude文みたいな考えと同じかな?
必要なときにどこからでも呼び出せるプログラムみたいなものだよね。
0772nobodyさん
垢版 |
2010/04/21(水) 02:32:40ID:???
OOPの説明で一番わかりやすかったのがプレーヤーの例

プレーヤーを継承した CDプレーヤー,MP3プレーヤー がある
それぞれに 再生,停止,早送り,巻き戻し,次トラック,前トラック という機能(メソッド)がある

具体的な処理はそれぞれが行うので,使う人はプレーヤーの処理している内容を
理解している必要はなく,再生したいときに再生ボタンを押すという事だけ
分かっていればいい。(カプセル化)

つまり考え方であって,そういう意味では間違ってないのかもしれない。
0773nobodyさん
垢版 |
2010/04/21(水) 23:48:02ID:???
それぞれにあるのではなく、プレイヤーという抽象クラスにあるのでは?
0774nobodyさん
垢版 |
2010/04/22(木) 01:28:13ID:???
>>773
ダックタイピングなら、それぞれにあってもいいよね
0775nobodyさん
垢版 |
2010/04/22(木) 20:41:56ID:???
OOPの説明でダックタイピングの例出すの?
0776772
垢版 |
2010/04/22(木) 23:04:57ID:???
>>773
そうなんだけど,具体的な実装がそれぞれ違うという意味で
ああいう書き方にした。
0777nobodyさん
垢版 |
2010/04/23(金) 00:43:27ID:???
>>775
PHPは型にしばられない(しばられなさすぎて困る)スクリプト言語だからね。

逆に、静的言語のように型を意識しすぎると、スクリプト言語のメリットが少なくなると思う。

「じゃぁ、お前、クラス階層つかわねーのか?」と言われればノー
コンポーネント(レイヤ)の中では、型を意識し、拡張する場合は継承も使用する。
コンポーネント間の接続は型ではなくメッセージ(メソッド)に束縛させるように意識している。

でも最近は、interface作って、抽象クラス作ってというのがおっくうになってきたので、可能ならメソッドポインタによるコールバックで済ませちゃうこともしばしば。
0779nobodyさん
垢版 |
2010/05/22(土) 17:38:18ID:???
保守しておきます。
0780nobodyさん
垢版 |
2010/05/24(月) 00:43:02ID:???

javaや.NETはたまたPythonあたりの純血PGが書けばOOPっぽいソースになると思うよ。
PerlとかPHPから始めました、ってのはだめだな。
0781nobodyさん
垢版 |
2010/06/09(水) 18:32:35ID:uqJikGsn
PHP6のオブジェクト指向ってなにか大きな変化ある?
0782nobodyさん
垢版 |
2010/06/09(水) 21:02:23ID:???
遅延静的束縛とか
名前空間とか
0784nobodyさん
垢版 |
2010/06/09(水) 22:50:19ID:???
遅延静的束縛もですが
0785nobodyさん
垢版 |
2010/06/11(金) 20:18:27ID:???
機能追加がほとんどか。
じゃあ、PHP5のコードをPHP6に移植しても問題なく動くってことでいい?
PHP4→PHP5のときは大変みたいだったけど。
同じ思いをしたくない。
0786nobodyさん
垢版 |
2010/06/12(土) 05:01:32ID:???
互換性見れば分かるだろ
0787nobodyさん
垢版 |
2010/06/13(日) 07:15:58ID:???
逆に互換性なんかいいから関数の無茶苦茶な命名規則とか直して欲しい
0788nobodyさん
垢版 |
2010/06/20(日) 11:50:01ID:???
関数はもうほうっておいて、
公式にオブジェクト指向ライブラリを提供すればよい
0790nobodyさん
垢版 |
2010/06/21(月) 16:09:23ID:L/6UXzEf
質問するのが怖いんだけど、自分はフォームのパーツを呼び出すのに
オブジェクト指向(クラス)を使ってるつもりなんだけど正しいのか自信がない

クラスformPartsの中で各プルダウンやラジオボタンの要素(nameとvalue)を
外部ファイルから読み込んどいて
$fp = new formParts();
$pref = $fp->callPullDown('prefecture',$val);
$job = $fp->callPullDown('job',$val);
$sex = $fp->callRadioButton('sex',$val);

こんな感じでメソッドでパーツの種類を指定しつつ(ラジオボタンかプルダウンか)
そのパーツの要素(都道府県とか職業とか)と既定値($val)を投げて呼び出してる。
プルダウン要素とかは各メソッド内部で引数によって外部ファイルから読みこんでる。

クラスってこんな使い方でいいの? 継承とかはさっぱりわからない、どういう状況で使うんだか。
あと1さん凄いね、ガッツがあるなぁ。。
0792nobodyさん
垢版 |
2010/06/22(火) 02:53:02ID:???
分からないなら普通に勉強しろよ・・・
0793nobodyさん
垢版 |
2010/06/26(土) 22:03:26ID:lGwy0O8s
ツールの勉強する前に基本を勉強しろ
0794nobodyさん
垢版 |
2010/06/28(月) 10:27:12ID:PXXo1bnr
oopってさ
PHP最大の武器であるHTMLとの親和性の高さを殺してるよね
0796nobodyさん
垢版 |
2010/06/28(月) 22:25:44ID:???
いまの流行はテンプレートだから
PHPのHTML埋め込みなんてもう古い
0797nobodyさん
垢版 |
2010/06/29(火) 01:12:38ID:???
そんな流行もあったねぇ。今は違うよ。
0799nobodyさん
垢版 |
2010/06/30(水) 18:24:45ID:???
テンプレートってどんな利点があるの?
そもそもPHP自体テンプレートみたな言語じゃん。

index.php
 <?php
 $title = "hoge";
 $hello = "hello world";
 include "template.php";
 ?>

template.php
 <html>
 <head><title><?php echo $title ?></title><head>
 <body>
 <h1><?php echo $hello ?></h1>
 </body>
 </html>

こういうのとは違うの?
0800nobodyさん
垢版 |
2010/07/01(木) 00:39:53ID:???
ほとんどの言語は、HTMLの中で
コードを動かすという発想で作られていない。
コードーの中でHTMLを出力するという発想。

そういう言語ではテンプレートが重要。
PHPでテンプレートの意味が薄いのは確か

ただテンプレートの意味がまったくないかというと、そうではなく
分業作業。つまりプログラマとデザイナに分かれて開発するときは便利。
デザイナはphpコードはまったく知らない。だからなるべくシンプルな
記号レベルの書き方であってほしい。しかもDreamweaverのような
HTMLエディタで見たときに不具合無く表示されるものの方がいい。
0801nobodyさん
垢版 |
2010/07/01(木) 14:26:10ID:ksuFUfiJ
デザイナーでもHTMLとPHPの繋がりぐらいは分かる
いや、分かるようにPHPを書かなければならいと思う
それがPHP
0802nobodyさん
垢版 |
2010/07/01(木) 19:54:20ID:???
デザイナーって馬鹿だな
まで読んだ
0803nobodyさん
垢版 |
2010/07/07(水) 17:20:53ID:???
ここで議論してる奴らは世に影響力のないカスばかりだから参考にしなくて良い
0805nobodyさん
垢版 |
2010/08/20(金) 14:43:19ID:???
852 忍者Perl ◆M5ZWRnXOj6 [] 2010/08/20(金) 13:30:09 ID: Be:
    マルチしてんじゃないですよクソゴミww(笑)wwww(笑)wwww(笑)wwww(笑)ww
    ww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)ww
    ww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)ww
    ww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)ww
    ww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)ww
    ww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)ww
    ww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)wwww(笑)ww
    ww(笑)wwww(笑)ww
    PHPやってるやつノウタリンばっかりwwwwwwww
0806nobodyさん
垢版 |
2011/10/15(土) 11:25:55.76ID:???
PHPでOOPやると重いと感じませんか?
0807nobodyさん
垢版 |
2011/10/17(月) 12:28:57.35ID:???
いいんです!
コーディングが楽だから、OOPで良いんです!!
0808nobodyさん
垢版 |
2011/12/16(金) 08:42:12.54ID:???
逆だろ
OOPだからボトルネックが把握しやすくてメンテナンスや新実装がしやすくなる
0809nobodyさん
垢版 |
2011/12/18(日) 18:35:23.31ID:XDa3NN+N
しかし、実行速度遅くなるね
0810nobodyさん
垢版 |
2011/12/18(日) 21:04:34.89ID:???
遅くなるって体感でわかるほど遅くなるのか?
だったら書き方おかしいよ
0811nobodyさん
垢版 |
2011/12/19(月) 12:14:00.72ID:8JBaGfsG
>>810
体感できないとは幸せだね。
0813nobodyさん
垢版 |
2012/01/12(木) 17:20:16.63ID:???
>>736
コントローラを肥大させてはならないという概念ではわかりにくい。
もっと具体的に境界線を引くべきだと思う。以下俺の意見なんだけど、

MVCってユニットテストために
ユニットテストを難しくする汚染要素を隔離するためにあるのだと思う。

具体的に言うとこんな感じ。
View(GUI, xml, html, json)
Controller(Session, Request, Form, 画面遷移などWeb独自のデータ)
Model(RDB, KVS)

MとCが分離されることでMはWebスコープから分離され、CはSQLから分離される。
でもこの理屈だとVとCの関係がおかしくなっちゃうね。
CがVにデータを渡すときはリクエストスコープを経由しないで
直に関数の引数で整数や文字列、オブジェクトを渡すべきって話になるから。
0814nobodyさん
垢版 |
2012/01/12(木) 19:14:14.99ID:???
>>813
ゴバクしただけあって、センス悪いな。
0815nobodyさん
垢版 |
2012/01/13(金) 12:44:55.80ID:???
>>813

> MVCってユニットテストために
> ユニットテストを難しくする汚染要素を隔離するためにあるのだと思う。

正しいが、これは現場的な視点の1つの考え方。

MVCは、スケーラブルなサイト構築のためのパラダイムという方が、しっくりくると思うが...
0816nobodyさん
垢版 |
2012/01/13(金) 14:14:37.80ID:???
新米PGに教える方法としては良いかもしれん
0817nobodyさん
垢版 |
2012/03/25(日) 15:09:36.84ID:AY6baIQV
PHPのOOPフレームワークを教えて下さい。
イメージとしてはJavaのStrutsのようなものです。
0818nobodyさん
垢版 |
2012/03/26(月) 23:05:27.26ID:???
JavaStrutsはさておき、おすすめはYIIだな。PHPの中では美しい。
0819nobodyさん
垢版 |
2012/03/28(水) 01:58:44.02ID:???
>>818
YII以外では無いのでしょうか?
YIIはOOPフレームワークとしては不完全です。
0821nobodyさん
垢版 |
2012/03/28(水) 10:27:45.07ID:???
>>820
オブジェクト指向言語であればオブジェクトを使用するところで、
配列を使用する点。
0822nobodyさん
垢版 |
2012/03/28(水) 19:46:43.02ID:???
>>821
なんでOOPフレームワークを使いたいの?
0823nobodyさん
垢版 |
2012/03/29(木) 00:32:40.17ID:???
>>822
OOPに慣れてるからです。
オブジェクトとして定義するところで
phpの場合、配列になるのでいらいらします。
たとえばCakePHP。ModelがModelになっていない。
やはり後付けでOOP機能が加わった言語では無理があるのですね。
0824nobodyさん
垢版 |
2012/03/29(木) 00:43:24.51ID:???
>>823
ModelがModelになってないというのは具体的にどういうこと?
0825nobodyさん
垢版 |
2012/03/29(木) 08:52:29.82ID:???
>>824
どのオブジェクト指向言語を経験しましたか?
それにあわせて話をします。
0826nobodyさん
垢版 |
2012/03/29(木) 09:19:41.82ID:???
>>823
phpで本格的なオブジェクト指向ははじめから無理だよ。
0827nobodyさん
垢版 |
2012/03/29(木) 12:36:50.80ID:???
PHPのOOP自体、後付けだし...
0829nobodyさん
垢版 |
2012/03/30(金) 00:15:47.79ID:???
>>828
ぜひStrutsの話を聞きたいですね。
たとえばCakePHPやsymphonyとどう違いますか?
0830sage
垢版 |
2012/03/31(土) 00:44:25.15ID:5Y7rPOtM
PHPのOOP関連機能が中途半端なのは当たり前。
実行速度が遅いPHPではそもそも向いていない。
0831nobodyさん
垢版 |
2012/03/31(土) 17:53:30.17ID:???
>>829
話をすると言って聞くばかりなのはなんでだ?
0832nobodyさん
垢版 |
2012/03/31(土) 21:49:54.25ID:???
>>831
Javaのフレームワークのことを教えてください
0833nobodyさん
垢版 |
2012/04/02(月) 08:52:20.20ID:???
>>832
ModelがModelになってないというのは具体的にどういうこと?
0834nobodyさん
垢版 |
2012/04/02(月) 10:00:58.63ID:???
>>833
Javaのフレームワークの比較で語りましから、あなたが今までにどのJavaフレームワークを使ってきたのか教えてください
0836nobodyさん
垢版 |
2012/04/03(火) 02:25:26.03ID:???
>>835
無知の自慢するべきではない。
あなたは一生、PHPでOOPの真似やってた方がよい。
08371
垢版 |
2012/04/03(火) 05:28:27.27ID:???
語りまし?
いやです
0838sage
垢版 |
2012/04/03(火) 09:03:36.19ID:s3V9thNo
phpでOOPはダメぽ
0840nobodyさん
垢版 |
2012/04/03(火) 13:09:50.72ID:???
完全にoopオリエンテッドな言語でしかoopしないって主張が、かなりダメぽ
0841nobodyさん
垢版 |
2012/04/03(火) 13:40:01.23ID:???
phpは継ぎ接ぎだからoopに向いてない
速度の面でも不利
0842nobodyさん
垢版 |
2012/04/03(火) 14:48:23.63ID:???
ダメな理由は遅いから。
0843nobodyさん
垢版 |
2012/04/03(火) 16:36:45.23ID:???
>>834
答えられないなら最初から言うな見栄っ張りw
0844nobodyさん
垢版 |
2012/04/03(火) 17:04:24.93ID:???
>>843
JavaのOOPについて語ってください。
話はそれからです。
0845nobodyさん
垢版 |
2012/04/04(水) 00:03:58.45ID:???
質問者がJavaのどのフレームワークを使ったことがあるか書くべき
回答者がそのフレームワークとCakePHPを比較すべき
0846nobodyさん
垢版 |
2012/04/04(水) 02:04:42.62ID:???
そんな比較はどうでもいい。
phpのOOP機能は単なるおもちゃ。
0847nobodyさん
垢版 |
2012/04/04(水) 19:20:23.84ID:???
ttp://kameleon.s241.xrea.com/wiki/index.php?%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B
すいません
ここのフレームワークのソースをダウンロードしたいんですが、ダウンロードできません。
どこかで入手できないでしょうか
0848nobodyさん
垢版 |
2012/04/04(水) 21:46:53.59ID:???
ログインできませんでした。
10分ほどしてから再度お試しください。
0849nobodyさん
垢版 |
2012/04/21(土) 07:48:42.18ID:???
PHPでOOPやるとかアフォだろ
PHP自体カス以下だし
0850nobodyさん
垢版 |
2012/04/25(水) 22:43:11.22ID:???
ほらほら、釣り釣り。
参加者募集中
0851nobodyさん
垢版 |
2012/04/25(水) 23:12:37.13ID:???
関数のオーバーロード
0853nobodyさん
垢版 |
2012/04/26(木) 00:11:07.09ID:???
phpの標準関数はどのクラスに属するのですか?
0854nobodyさん
垢版 |
2012/04/26(木) 03:03:15.10ID:???
PHPはC++と同じで、クラスに属さない
関数があるんだよ。
0855nobodyさん
垢版 |
2012/04/29(日) 05:23:36.37ID:???
クラスに属さない関数が多すぎ

そして、関数名が長くて、使いたいときに思い出しにくく覚えにくい。命名法が統一されてない。
0856uy
垢版 |
2012/06/25(月) 19:13:52.21ID:???
PHPでOOPやるとかwwww
笑わせるなよwwww
0857nobodyさん
垢版 |
2012/06/26(火) 12:21:43.29ID:???
黙れ、情弱!
便所に行ったら手ぐらい洗え

つttp://sociorocketnews.files.wordpress.com/2012/06/after-toilet-wash-your-hands-japan01.jpg
ttp://sociorocketnews.files.wordpress.com/2012/06/after-toilet-wash-your-hands-japan02.jpg
ttp://sociorocketnews.files.wordpress.com/2012/06/after-toilet-wash-your-hands-japan05.jpg
0858uy
垢版 |
2012/06/26(火) 12:34:02.34ID:???
俺はゴミカスだがエリートゴミカスだ
お前らのような下級ゴミカスとは格が違う
0859nobodyさん
垢版 |
2012/06/26(火) 12:39:35.58ID:???
『オレは本当はスゴいんだ』病 www
0860nobodyさん
垢版 |
2012/06/26(火) 14:05:10.76ID:???
>>857
逆に女子はトイレ行ったら手を洗うの禁止な。
0861nobodyさん
垢版 |
2012/06/28(木) 00:47:58.97ID:???
phpでOOPとは単なるアホ
0862nobodyさん
垢版 |
2012/06/28(木) 05:06:29.82ID:???
じゃあOOPでphpするよ。
0863nobodyさん
垢版 |
2012/06/28(木) 12:22:49.87ID:???

でも、よく言った!
0864nobodyさん
垢版 |
2012/06/29(金) 03:21:18.32ID:???
Java WicketとかPHP Piece Frameworkに流行ってほしいな。
平たく言えば何でもセッションに突っ込んでるだけなんだけどね。
0865nobodyさん
垢版 |
2012/07/14(土) 00:10:18.29ID:???
ここまでトレイトの話題無しかw
0866nobodyさん
垢版 |
2012/07/16(月) 19:14:45.27ID:???
実際トレイトって、あれば便利な気はするけどどこで使うのか思いつかん。
だれか使いこなせてるって人いますか?
0867nobodyさん
垢版 |
2012/07/17(火) 07:36:18.33ID:???
PHPはむしろトラッシュ
0868nobodyさん
垢版 |
2012/07/17(火) 15:16:40.35ID:???
まだ5.4使える環境に出会ったことが無いわ
0869nobodyさん
垢版 |
2012/07/18(水) 09:22:42.54ID:???
なんでもセッションでいいよな
PHPってそういうもんだろ
0870nobodyさん
垢版 |
2012/07/18(水) 12:20:26.18ID:???
セッションハイジャックの脆弱性を可能な限り排除できるなら、
セッション利用でOK。
0872nobodyさん
垢版 |
2012/07/22(日) 10:45:56.54ID:???
PHPでOOPなど愚の骨頂

PHPなど愚の骨頂
0873nobodyさん
垢版 |
2012/07/27(金) 20:37:24.49ID:???
3Pとか4Pがあるように00Pもあるのです
0876nobodyさん
垢版 |
2012/07/31(火) 11:18:22.44ID:???
PHPもOOPも時代遅れ
今はLOOP、すなわち論理オブジェクト指向プログラミングの時代
0878nobodyさん
垢版 |
2012/08/05(日) 00:31:48.84ID:???
PHPerがJavaのIDEなんか使ってんじゃないよ。
秀丸でちょちょいとやるのがオツってもんだ
0879nobodyさん
垢版 |
2012/09/27(木) 03:31:54.43ID:yKCGiKEV
>>866
>実際トレイトって、あれば便利な気はするけどどこで使うのか思いつかん。
>だれか使いこなせてるって人いますか?

traitは scala から持ってきた仕組み。
(もちろん scala も他の言語から影響を受けている)

trait とは:
- Mixin - Wikipedia http://ja.wikipedia.org/wiki/Mixin
- traitは実装を含めることができるinterface
- コードのコピペをfunctionalityにしただけ

利用シーンとしては、継承したくないけど、
ある実装を、このクラスだけでは使用したいという場合に
traitを作って、それを使います。(だから、コードのコピペと表現した↑)

AS3を書いてたときはmixinはイベント機能を追加する目的で
よく使ってた

以下PHPでの実例をどうぞ↓
0880nobodyさん
垢版 |
2012/09/27(木) 07:12:35.38ID:???
カス言語PHPには無理
0881nobodyさん
垢版 |
2012/10/06(土) 00:51:33.59ID:???
phpのオブジェクト指向機能はおもちゃ。
0882nobodyさん
垢版 |
2013/03/25(月) 12:45:02.49ID:???
おもちはおもちや
0884nobodyさん
垢版 |
2013/06/21(金) 04:07:35.21ID:v9NBCNRF
php
0886nobodyさん
垢版 |
2014/04/05(土) 00:55:43.80ID:???
メソッドを実行しなきゃどうってことはない
0887nobodyさん
垢版 |
2015/02/14(土) 01:11:16.07ID:???
Formのクラス作ったら500行になっちゃった
これって糞プログラムの部類なのかな・・・
シンプルに書きたいのに機能付け加えていくとどうしても肥大化してしまう
0888nobodyさん
垢版 |
2015/02/15(日) 02:10:36.84ID:???
美少女オブジェクトに排便しろというメッセージを飛ばすのか
胸が熱くなるな
0889nobodyさん
垢版 |
2015/06/17(水) 18:33:41.70ID:???
ガベージコレクションは自動で実行されるものなので我々が命令するものではない
0890nobodyさん
垢版 |
2016/09/08(木) 09:55:10.31ID:???
PHPでOOPなんてPOOP以外の何物でもない
0891nobodyさん
垢版 |
2017/12/30(土) 14:11:40.74ID:YhlYw6jg
誰でも簡単にネットで稼げる方法など
参考までに、
⇒ 『半藤のブブイウイウレレ』 というサイトで見ることができます。

グーグル検索⇒『半藤のブブイウイウレレ』

TVD73U3V71
0893nobodyさん
垢版 |
2023/08/26(土) 03:18:53.39ID:???
見ろ!人ごみに流されて変わってゆく私を
0894nobodyさん
垢版 |
2023/09/26(火) 22:41:15.16ID:???
もう少しで楽しい時間がやってくるかな?
レスを投稿する


ニューススポーツなんでも実況