Upload
-
View
1.042
Download
3
Embed Size (px)
DESCRIPTION
Web技術勉強会第5回目の資料です。
Citation preview
1
WebWebWebWeb技術勉強会第技術勉強会第技術勉強会第技術勉強会第5555回回回回~~~~オブジェクトオブジェクトオブジェクトオブジェクト指向指向指向指向プログラミングプログラミングプログラミングプログラミング@PHP@PHP@PHP@PHP~~~~
Ryuichi TANAKAStudy:http://devel.de.c.dendai.ac.jp/study/Blog:http://blog.livedoor.jp/mapserver2007/
2
オブジェクト指向プログラミング
• オブジェクト指向プログラミング(OOP)の利点
– 再利用性が高い
– 機能やロジック単位で分離できる
– アクセス制御ができる などなど
• OOPに必要な技術・概念
– カプセル化(Bean)
– 継承(再利用性アップ)
– オーバーロード、オーバーライド
3
PHPにおけるOOPの可能性
• PHPでOOPができるか
– 結論:条件付で出来る
• PHPでOOPをやるメリット
– 手続き型からOOPへ移行できる
– OOPの代表言語であるJavaと似たコーディング• PHPをやるメリットの一つだと思う。PerlはOOPとしてもPHPより優れているかもしれない
が、あまりにも書き方が違いすぎるのと、利用する機会そのものが少ないので勉強するメリットが薄い。その点、PHPでOOPが出来ればJavaでも出来る可能性が高い。
• PHPでOOPをやるデメリット
– Javaに比べて貧弱
4
PHPでOOPをやるメリット
• 書式がJavaに似ている– PHPでOOPが出来れば、Java未経験でもすぐに習得できる(悲しいことに企業におけるJavaの浸透度は高いのが現実)
• 手続き型からの脱却– 手続き型は、規模が大きくなるほどきつくなってくる
• 再利用性向上– クラス、メソッド単位で処理を分離
– 使いまわし、共通化が容易
5
PHPでOOPをやるデメリット
• JavaのOOPより貧弱– あくまで「似ている」だけ。Javaほど強力ではない(反面、Javaよりも自由度が上がっているところもあるが)
– 例えば…
• PHPではオーバーロードが使えない
• 型がないのがある意味不便(特に参照型のチェック時)
• 例外処理が弱い– finallyがない(致命的)、Exceptionクラスが1個しかない(致命的)
• そもそもPHPでOOPをやるべきか– もともとOOPな言語ではない=やるべきではないという議論
– やるならJavaなりRubyなりでやるべきという議論
6
PHPで十分OOPは出来る
• PHPでOOPは可能– さっきの話は個人単位ではほとんど当てはまらない
• PHP5からはかなりまともにOOPが可能
• 中規模くらいまでならPHPで十分
• 擬似的なオーバーロード実現は可能、型を厳密にチェックなど実際ほとんどしない。
– JavaやRubyにだって弱みはある
• Javaはとにかく冗長になりやすい。Javaはそもそも個人での開発に
向いていない
• Rubyはそもそも資料と実績が少ない。PHPの方が個人では習得し
やすい環境にある
7
OOPのポイント
• アクセス制御をする(※1)– public : インスタンス化でクラス外からアクセス可能
– protected : 同一クラス内または全てのサブクラスからアクセス可能
– private : 同一クラス内からのみアクセス可能
• コンストラクタを使う– インスタンス化されたとき、初めに呼ばれるメソッド
– 継承していれば、スーパークラスのコンストラクタ、サブクラスのコンストラクタ両方を呼べる(※2)
※1:Javaはさらにパッケージが絡んだアクセス制御になる※2:PHPではスーパークラスのコンストラクタは明示的に呼ばないと呼ばれない。ちなみにJavaではスーパークラス→サブクラスの順に自動的にコンストラクタが呼ばれる
8
OOPのポイント
• メンバ変数とローカル変数の宣言
– メンバ変数• クラスの直下に宣言される変数
• 初期化は値が入るので不要(ただし参照型はnull)
– ローカル変数• メソッド内に宣言される変数
• 明示的に初期化するべき(というか、習慣付けるべき)(※3)
※3:またJavaの話しだが、こうしないと、NullPointerExceptionが大量にでる。「NULL」と「空文字」は別物だということは知っておくべき。
9
OOPのポイント
• 定数を宣言する– 定数は、書き換えが出来ない変数
– PHPではconstを使う(defineはグローバルなので使わない)
– Javaでいうところのstatic final修飾子
• Setter/Getterメソッドを利用する– JavaBeans方式
– Setter/Getterメソッドをpublicにし、他のメソッドはprivateかprotectedにすると、外部からのアクセスを最小限にすることがで
きる
– 冗長なコードにはなるが、セキュアで管理がしやすい
10
OOP化リファクタリング
• OOPベースなTMAP3
tmap_load.php
TMAP_Load_Validate
instance
TMAP_Coordinator
constracter
TMAP_Tile_Generator
constracter
instance
method
method
instance
method
TMAP_Draw_Validateconstracter
instance
method
base_data
TMAP_Draw
instance
method
nf_data
draw
json_encode generate
map_datamap_data
client
side map_json
$_GET
11
OOP化リファクタリング
• 大まかに次の処理別にクラスを生成– 座標計算+基準位置画像パラメータ生成クラス
(TMAP_Coordinator.php)
– 共通パラメータクラス(継承専用) (TMAP_Global.php)
– 画像生成パラメータバリデートクラス(TMAP_Draw_Validate.php)
– 画像生成クラス(TMAP_Draw.php)
– GETパラメータバリデートクラス(TMAP_Load_Validate.php)
– タイル情報生成クラス(TMAP_Tile_Generator.php)
• これらのクラスをmainから呼び出す– tmap_load.php
12
OOP化リファクタリング
• JSONPで呼び出す仕様
• クライアントサイドはjQuery
http://team2.de.c.dendai.ac.jp/study/05/php/tmap_load.php?call
back=jsonp1215924533217&_=1215924533316&lng=139.713155875&lat=
35.7570890842&ow=500&oh=400&w=300&h=200&s=8&conv=1
jsonp1215924533217([{"dx":198,"dy":140,"left":13500,"top":4600,"mid":"s25000t
4600l13500","format":".png"},{"dx":198,"dy":140,"left":13800,"top":4600,"mid"
:"s25000t4600l13800","format":".png"},{"dx":198,"dy":140,"left":14100,"top":4
600,"mid":"s25000t4600l14100","format":".png"},{"dx":198,"dy":140,"left":1350
0,"top":4800,"mid":"s25000t4800l13500","format":".png"},{"dx":198,"dy":140,"l
eft":13800,"top":4800,"mid":"s25000t4800l13800","format":".png"},{"dx":198,"d
y":140,"left":14100,"top":4800,"mid":"s25000t4800l14100","format":".png"},{"d
x":198,"dy":140,"left":13500,"top":5000,"mid":"s25000t5000l13500","format":".
png"},{"dx":198,"dy":140,"left":13800,"top":5000,"mid":"s25000t5000l13800","f
ormat":".png"},{"dx":198,"dy":140,"left":14100,"top":5000,"mid":"s25000t5000l
14100","format":".png"}])
13
OOP化リファクタリング
デモシステム
http://team2.de.c.dendai.ac.jp/study/05/
14
まとめ
• オブジェクト指向プログラミング– PHPでも十分に組むことが出来る
– 現在のプログラミングの主流なので、習得したほうが良い
– ただし、本気で勉強したいのならJavaのほうがお勧め
• TMAPリファクタリング– OOP化の成果物としてTMAPのリファクタリングを行った
– かなり可読性は上がったと思う
– 現在のPHP対JSソース量比• PHP : JS = 8 : 2
• 今のところ処理の大半をサーバサイドで処理している
• ただし今後5:5程度になる予定