おおおおおおおおおおおおお

鬼のように長文書いたのにタッチパッドの誤反応で「データの管理」のリンクを踏んだことになってしまって全部吹っ飛んだ!!
くっそおおおおおおおおおおおおおお.

ってのはいいとして…挫折したので…

#よっこいしょ

基本的には続けていっても平行線かなという感じなので,サケの席のヨタ話程度の軽さで読んでいただけるとという感じですが

さて、入社してすぐにまずは簡単な課題を与えられました。研修のようなものです。PHP4ではありますが、クラスを作って、一応ある程度MVCで組み立ててみたわけです。
そして、そのプログラムが完成したところで言われたことが件の「どんな人にも読みやすいように、あまりクラスは使っていないんだ。」ということでした。

「どんな人」という定義がありますよね.プログラムを組んだことがないとか,掲示板位なら作ったことがあるとか,お問い合わせフォームなら組んだことがあるとか,他言語で経験があるとか,組み込みなど他環境で経験があるとか.
私の中で「どんな人」ってのは「商用としてウェブアプリケーションを組む最低限の知識があるプログラマー」はこの辺を読んでおおむね理解できる人,ないし「1年位実務を経験したらおおむね理解できそうな人(つまり今すぐわかんなくても別にいい)」です.

この辺はずれてそうな気がしますね.

そういうわけで、クラスを使わずに書いてあるソースを最近はよく読んでいるのですが、上から下まで順に時系列でコードが並んでいるわけです。ただ、あちこちでincludeするのでファイルはいっぱいありますが。include方式(ここでは便宜的に)の良いと言われるところは、多分以下の3点なのかな。

1. コードが時系列で上から下へ順に流れること。
2. 基本的に全部グローバル変数なのでスコープについての理解がなくてもなんとか書けること。
3. オブジェクト指向に関する知識を学習する必要が無いこと。(クラスの使い方とか、文法的なことも含む)

ちょっと待ってね.1番を実現しようとしたら関数すら使えないんじゃないのかな.
どうしても行番号の概念から言うと流れはシーケンシャルじゃなくなりますよね.
また,2番もPHPの言語仕様としてクラスはグローバル変数を使えないという言語ではありません.つまり使えないようにしたのは「PHPスクリプトプログラマー」です.
3.はまーあると思いますが,「チャリンコは免許取りに行かないでいいしそこそこ速度出るし,まぁなんていうか何処いくにもチャリンコでいいよ」みたいに聞こえます.

関数でたんに実装するパターンとクラスの静的メソッドとして実装するパターンの違い

さすがに2回目は挫折気味なので(すみません はしょりますが,静的メソッドで書いてもいいわけです.
例えば下記の通り.

/**
 *  関数でデータベース操作ライブラリーを実装してみる
 */
function db_connect() {...}
function db_query($sql) {...}
function db_disconnect() {...}

/**
 *  実際に使ってみる
 */
db_connect();
$res = db_query('SELECT * FROM users;');
db_disconnect();
/**
 *  クラスでデータベース操作ライブラリーを実装してみる
 */
class db {
    function connect() {...}
    function query($sql) {...}
    function disconnect() {...}
}

/**
 *  実際に使ってみる
 */
db::connect();
$res = db::query('SELECT * FROM users;');
db::disconnect();

大して違いはありません.
しかしクラスにするだけで下記が楽に実現できます.

  • phpdocを利用したリファレンスを効果的に書く
  • メソッド名を忘れたらget_class_methods()でスグに引っ張り出すことができる.

下記はphpdocタグを適当に書いた例です.

/**
 *  クラスでデータベース操作ライブラリーを実装してみる
 */
class db {
    /**
     *  データベースへの接続を行う
     */
    function connect() {...}
    /**
     *  データベースへの問い合わせを行う
     */
    function query($sql) {...}
    /**
     *  データベースへの接続を切断する
     */
    function disconnect() {...}
}

これだけでパッケージとしてのデータベース操作ライブラリーのリファレンス,各メソッドのリファレンスが階層的に作成されます.
もし関数でこれをやろうとすると@packageなどを用いて分別しなければならず,面倒くさいです.

次にget_class_methods()を利用した例です.

$ php -r 'require_once "common.php"; var_dump(get_class_methods("db"));'
array(3) {
  [0]=>
  string(7) "connect"
  [1]=>
  string(5) "query"
  [2]=>
  string(10) "disconnect"
}

うお.なんかすごくね?(嘘ですごめんなさい

まとめ

さっきいろいろ書いていたんですがー.すみません挫折しました(苦笑
必要なところだけがんばって脳内から復元すると,新人の方のようですし会社に提案をするってのは勇気も体力も持てるものをいろいろ使ってしまうので中々気が進まないところもあるでしょう.KYとか思われるかもしれないし.
なのでそれはそれでそういう世界もあるってことでいいとも思います.
ただそれとは別に向上心は過去から現在も継続的におありの方のようなので,心折れずにがんばってもらえればなと思います.
あと結婚おめでとうございます.私は2月25日生まれなので親近感が(何

ってことで今度本当によければ飲みに行きましょう(違

追記

オブジェクト指向の実装をするというよりメンテナンスのしやすいコードでしょうか.
えてして「コードを書く」より「メンテナンスをする」方がプログラムのライフタイム的には多くの時間を割くわけで.
その中の一環にオブジェクト指向を採用されることが多いだけで,いかに「活きたドキュメントを残しやすい」,「テストをスムーズに行うことができる」コードを出し続けることができるかというのが「コードを書く」ときに大切なのかなと.