第12回 Net_UserAgent_Mobile クラス - 携帯端末情報取得ライブラリ (3) - PEAR講座
くまっち先生のPEAR講座
Lecutures on PHP
第12回 Net_UserAgent_Mobile クラス - 携帯端末情報取得ライブラリ (3) (その1)
クラスオブジェクト生成に見られるある手法
前回の講座にて、必ず単一のクラスオブジェクトを使用することで初期処理にかかる負荷を省略するシングルトンというものを紹介しました。
Net_UserAgent_Mobileでそのシングルトンを実現するためのメソッドである「singleton」は以下のリスト1になりますが、実際にクラスオブジェクトを生成するためにnewを使うのではなく「factory」というメソッドを実行しているというのが、前回までのお話でした。
リスト1. singletonメソッド
function &singleton($stuff = null)
{
static $instance;
if (!isset($instance)) {
$instance = Net_UserAgent_Mobile::factory($stuff);
}
return $instance;
}
今回はこのfactoryについてのお話です。
この手法を使うに至るまで
factoryメソッドとは何か。なぜオブジェクト生成にnewではなく別メソッドを準備しているのか。それは前回のシングルトンと同じように、このライブラリが提供しようとする内容に理由があります。
今回はこのNet_UserAgent_Mobileに存在する機能、すなわち実装されているメソッドを実際に作ろうとするとどうなるか順に紹介していくことにしましょう。
Net_UserAgent_Mobileには、その端末がどこの携帯コンテンツのものであるか名称で返す「getName()」というメソッドがあります。DoCoMoならば「DoCoMo」とそのものズバリの名称が返ってきます。
このメソッドを実現するコードを書くとしたら、大よそ以下のリスト2のようなものになることでしょう。
リスト2. getNameメソッド例
function getName()
{
// DoCoMo端末であるか確認する処理を実施
if ($this->_isDoCoMo()) {
return 'DoCoMo';
}
// au (EZWeb) 端末であるか確認する処理を実施
if ($this->_isEZWeb()) {
return 'EZWeb';
}
// SoftBank 端末であるか確認する処理を実施
if ($this->_isSoftBank()) {
return 'SoftBank';
}
....
}
それぞれどの端末であるかを確認する処理として「$this->_isDoCoMo()」などといった具合にプライベートメソッドを実行するよう簡略化していますが、各ポイントの結果が正であった場合は、そのまま携帯コンテンツ名を返すことで処理を終了するようなコードとなっています。
早速シンプルなコードに仕上がってなかなか満足のいく内容でしょうか。
続いて端末がDoCoMo端末かどうかを確認し成否判定を返す「isDoCoMo()」というメソッドを実現するコードを考えてみましょう。先ほどのコードの続きということで、今回はリスト3のようになりました。
リスト3. isDoCoMoメソッド例
function isDoCoMo()
{
// DoCoMo端末であるか確認する処理を実施
if ($this->_isDoCoMo()) {
return true;
} else {
return false;
}
}
先ほどのgetNameメソッドで準備したプライベートメソッドの再利用も行うことができてあっさり完成しました。同じようにau用、SoftBank用にも同様のメソッドが同様のコードで作ることができることでしょう。
このまま、その端末がFOMA端末がどうかを確認する「isFOMA()」メソッドというものを作ることにしましょう。最近リリースされている端末はほぼFOMAですが、以前のムーバ端末を引き続き利用している方も当然いるはずです。先のコードと同じように、リスト4のようにしました。
リスト4. isFOMAメソッド例
function isFOMA()
{
// DoCoMo端末であるか確認する処理を実施
if ($this->_isDoCoMo()) {
// FOMAであるか確認する処理を実施
if ($this->_isFOMA()) {
return true;
} else {
return false;
}
} else {
return false;
}
}
と、この辺であることに気づきました。これまでのコードをよくよく見ると、必ずDoCoMo端末かどうかの確認する「$this->_isDoCoMo()」を実施しています。この調子でいくと、DoCoMoに関する情報を取り扱うメソッドの際には先頭で毎度実施することになりそうです。このことは、auに関する場合やSoftBankに関する場合それぞれでも同様のことがいえます。




ページのトップへ


今回のような実践的な経験がエンジニアのキャリアに繋がると思います。是非サービスを成功させて下さい!