14
1 Web Web Web Web技術勉強会第 技術勉強会第 技術勉強会第 技術勉強会第5 5 5回 ~オブジェクト オブジェクト オブジェクト オブジェクト指向 指向 指向 指向プログラミング プログラミング プログラミング プログラミング@PHP @PHP @PHP @PHP~ Ryuichi TANAKA Study:http://devel.de.c.dendai.ac.jp/study/ Blog:http://blog.livedoor.jp/mapserver2007/

Web技術勉強会5回目(Slide Share用)

  • Upload
    -

  • View
    1.042

  • Download
    3

Embed Size (px)

DESCRIPTION

Web技術勉強会第5回目の資料です。

Citation preview

Page 1: Web技術勉強会5回目(Slide Share用)

1

WebWebWebWeb技術勉強会第技術勉強会第技術勉強会第技術勉強会第5555回回回回~~~~オブジェクトオブジェクトオブジェクトオブジェクト指向指向指向指向プログラミングプログラミングプログラミングプログラミング@PHP@PHP@PHP@PHP~~~~

Ryuichi TANAKAStudy:http://devel.de.c.dendai.ac.jp/study/Blog:http://blog.livedoor.jp/mapserver2007/

Page 2: Web技術勉強会5回目(Slide Share用)

2

オブジェクト指向プログラミング

• オブジェクト指向プログラミング(OOP)の利点

– 再利用性が高い

– 機能やロジック単位で分離できる

– アクセス制御ができる などなど

• OOPに必要な技術・概念

– カプセル化(Bean)

– 継承(再利用性アップ)

– オーバーロード、オーバーライド

Page 3: Web技術勉強会5回目(Slide Share用)

3

PHPにおけるOOPの可能性

• PHPでOOPができるか

– 結論:条件付で出来る

• PHPでOOPをやるメリット

– 手続き型からOOPへ移行できる

– OOPの代表言語であるJavaと似たコーディング• PHPをやるメリットの一つだと思う。PerlはOOPとしてもPHPより優れているかもしれない

が、あまりにも書き方が違いすぎるのと、利用する機会そのものが少ないので勉強するメリットが薄い。その点、PHPでOOPが出来ればJavaでも出来る可能性が高い。

• PHPでOOPをやるデメリット

– Javaに比べて貧弱

Page 4: Web技術勉強会5回目(Slide Share用)

4

PHPでOOPをやるメリット

• 書式がJavaに似ている– PHPでOOPが出来れば、Java未経験でもすぐに習得できる(悲しいことに企業におけるJavaの浸透度は高いのが現実)

• 手続き型からの脱却– 手続き型は、規模が大きくなるほどきつくなってくる

• 再利用性向上– クラス、メソッド単位で処理を分離

– 使いまわし、共通化が容易

Page 5: Web技術勉強会5回目(Slide Share用)

5

PHPでOOPをやるデメリット

• JavaのOOPより貧弱– あくまで「似ている」だけ。Javaほど強力ではない(反面、Javaよりも自由度が上がっているところもあるが)

– 例えば…

• PHPではオーバーロードが使えない

• 型がないのがある意味不便(特に参照型のチェック時)

• 例外処理が弱い– finallyがない(致命的)、Exceptionクラスが1個しかない(致命的)

• そもそもPHPでOOPをやるべきか– もともとOOPな言語ではない=やるべきではないという議論

– やるならJavaなりRubyなりでやるべきという議論

Page 6: Web技術勉強会5回目(Slide Share用)

6

PHPで十分OOPは出来る

• PHPでOOPは可能– さっきの話は個人単位ではほとんど当てはまらない

• PHP5からはかなりまともにOOPが可能

• 中規模くらいまでならPHPで十分

• 擬似的なオーバーロード実現は可能、型を厳密にチェックなど実際ほとんどしない。

– JavaやRubyにだって弱みはある

• Javaはとにかく冗長になりやすい。Javaはそもそも個人での開発に

向いていない

• Rubyはそもそも資料と実績が少ない。PHPの方が個人では習得し

やすい環境にある

Page 7: Web技術勉強会5回目(Slide Share用)

7

OOPのポイント

• アクセス制御をする(※1)– public : インスタンス化でクラス外からアクセス可能

– protected : 同一クラス内または全てのサブクラスからアクセス可能

– private : 同一クラス内からのみアクセス可能

• コンストラクタを使う– インスタンス化されたとき、初めに呼ばれるメソッド

– 継承していれば、スーパークラスのコンストラクタ、サブクラスのコンストラクタ両方を呼べる(※2)

※1:Javaはさらにパッケージが絡んだアクセス制御になる※2:PHPではスーパークラスのコンストラクタは明示的に呼ばないと呼ばれない。ちなみにJavaではスーパークラス→サブクラスの順に自動的にコンストラクタが呼ばれる

Page 8: Web技術勉強会5回目(Slide Share用)

8

OOPのポイント

• メンバ変数とローカル変数の宣言

– メンバ変数• クラスの直下に宣言される変数

• 初期化は値が入るので不要(ただし参照型はnull)

– ローカル変数• メソッド内に宣言される変数

• 明示的に初期化するべき(というか、習慣付けるべき)(※3)

※3:またJavaの話しだが、こうしないと、NullPointerExceptionが大量にでる。「NULL」と「空文字」は別物だということは知っておくべき。

Page 9: Web技術勉強会5回目(Slide Share用)

9

OOPのポイント

• 定数を宣言する– 定数は、書き換えが出来ない変数

– PHPではconstを使う(defineはグローバルなので使わない)

– Javaでいうところのstatic final修飾子

• Setter/Getterメソッドを利用する– JavaBeans方式

– Setter/Getterメソッドをpublicにし、他のメソッドはprivateかprotectedにすると、外部からのアクセスを最小限にすることがで

きる

– 冗長なコードにはなるが、セキュアで管理がしやすい

Page 10: Web技術勉強会5回目(Slide Share用)

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

Page 11: Web技術勉強会5回目(Slide Share用)

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

Page 12: Web技術勉強会5回目(Slide Share用)

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"}])

Page 13: Web技術勉強会5回目(Slide Share用)

13

OOP化リファクタリング

デモシステム

http://team2.de.c.dendai.ac.jp/study/05/

Page 14: Web技術勉強会5回目(Slide Share用)

14

まとめ

• オブジェクト指向プログラミング– PHPでも十分に組むことが出来る

– 現在のプログラミングの主流なので、習得したほうが良い

– ただし、本気で勉強したいのならJavaのほうがお勧め

• TMAPリファクタリング– OOP化の成果物としてTMAPのリファクタリングを行った

– かなり可読性は上がったと思う

– 現在のPHP対JSソース量比• PHP : JS = 8 : 2

• 今のところ処理の大半をサーバサイドで処理している

• ただし今後5:5程度になる予定