設計に関して

PHPは、変数の型が動的に決まるので、
PHP5の機能を使用しても、イマイチJavaのようにはいかない。
と書こうとしたんだけど、よく考えたらまぁこれでもいいのかと納得した。

PHPでは
変数宣言時に型が決まるわけでは無いので、
$obj = new ClassA();
としていたとしても、
ClassAの部分をClassBとするだけで、それらがなんの関係もなくても、
(この1行だけ見れば)正しい記述になってしまう。
Java
IntfA obj = new ClassA(); //ClassAはIntfAをimplementsしている。
とすれば、
ClassAの部分をClassBとしても、コンパイルが通らない。
IntfAと型付けしていることで、
この変数は、IntfAの実装クラスでなければならないと暗に示している。

これをPHPで実現するには、
リフレクションかなんかで型を判断するコードをいれてやるか、
PHP5の新しい書き方、
function setIntfA(InftA $obj) {
・・・
}
と、セッターを介してセットする他無い。

やっぱり、スクリプト言語だとインターフェイスのある意味が
薄れるのかなぁ・・・と思ったりした。
でも、Java同様、Interfaceを使った設計の方が、テストがしやすくなるので、
設計はJavaと同じで問題なさそうだ。


あと、今日、FTPを管理するクラスを作ったんだけども、
FtpTicket

FtpManager2つのクラスに分ける設計にした。
FtpTicketは、FTPに接続するための情報(ホスト、ユーザ名、パスワード他)を保持し
getFtpResourceメソッドを持つ、
このメソッドはftp_connectionし、ログイン等をした状態のresourceを返すメソッド。
FtpManagerは、コンストラクタでFtpTicketを取り、
すぐさまgetFtpResourceを行い、その戻り値をフィールドに格納する。
その値を使い、アップロードやらを行うクラス。
というような感じになった。
getFtpResourceをどっちに持たせようか迷った。
FtpTicketが情報を持ってるんなら、その情報を使ってやること=責任だろうと考えたすえ
このようなものになった。
さて、設計がこれでいいのか・・・いまいち確信が無い。