2017.11.4
Livvon#26【オブジェクト指向、ちょっとわかってきたかも・・・・・・?】
たぶん11月に入ってから
Livvonは全然前進していません。
最近やっていることというのは思い返せば
過去に書いたコードの焼き直しの作業が大半を占めている気がします。
でもこれが結構重要でして、ここでコードの感じを作ることで来るRC版での作業が減る・・・・・・はず・・・・・・。
さて、僕は知らず知らずのうちにオブジェクト指向ができるようになっていたつもりだったのですがこうやって書き進めてみると、あぁこれはこう書けば良かったのか!と思うことも多々あります。
その例の一つをいまお見せしましょうか。
<?php
class Handshake_detail {
protected $id;
protected $token;
/*略*/
function __get($name){
return $this->$name;
}
public function set($array){
//足らない情報を追加で付与したいとき。
foreach((array)$array as $key=>$value){
if(empty($this->$key)){$this->$key=$value;}//既に値が入っているものは保守
}
}
public function __construct($id_or_record,$token=null) {
if(is_numeric($id_or_record)){
//IDが渡されれば、直接DBにアクセスして取得する
$id_or_record=T_reservationsDAOfunction::get_handshake_info($id_or_record,$token);
}
//オブジェクトでも配列でも、とりあえずぶっこめば対応するキーに値が入る。
foreach((array)$id_or_record as $key=>$value){
$this->$key = $value;
}
$this->checkin_Time = new Time($this->checkin);
$this->checkout_Time = new Time($this->checkout);
$this->user_name = new Name($this->user_name_first,$this->user_name_first_kana,
$this->user_name_last,$this->user_name_last_kana,$this->user_nickname,$this->user_is_public_name);
$this->host_name = new Name($this->host_name_first,$this->host_name_first_kana,
$this->host_name_last,$this->host_name_last_kana,$this->host_nickname,$this->host_is_public_name);
$this->deadline_Datetime=new LivvonDateTime($this->deadline_Datetime);
$this->occurance_Datetime=new LivvonDateTime($this->occurance_Datetime);
$this->day=new LivvonDateTime($this->day);
$this->user_Age=new Age($this->user_yyyy,$this->user_m,$this->user_d);
$this->host_Age=new Age($this->host_yyyy,$this->host_m,$this->host_d);
}
}
これは新規に作ったクラスなんですが、Handshake_Detailっていう、まぁ見るからにハンドシェイクの詳細クラスですね。
一応今のとこ実装はこんな感じになっています。マジックメソッドを導入してます。setにアンダーバー入れ忘れてますけどまぁこれは今修正して使ってたら嫌なので放置の方向で・・・・・・笑
コンストラクタでやけにごにょごにょやってて、まぁこれが明らかに良くない実装なのは分かっていますがめんどくさいので色々機能を凝縮しています。
ぶっちゃけコンストラクタでデータやりとりする必要ないんじゃって思いはするんですけどね。別個にメソッド用意した方が良かったですね。まぁハンドシェイク詳細に関しては必然的にDBと絡むし別にこれでいいとは思うんですけどね。
やってる内容は見たまんまです。IDが渡されたらそれをキーにアクセスします。トークンがあれば渡します。
ただDBに逐一アクセスするのもコストというか、既にデータがあるのならそれを利用しなよということで渡されたのがオブジェクトであれば直代入です。
で、ですね。以前Timeクラスとか作りましたがここで新たに
Nameクラスというのを作っています。
こいつが今回の話の肝なんですよね。
このNameクラス、やってることはその名の通り
「名前を表示するだけ」のクラスです。
ただ、Livvonでは名前はハンドルネームが使用可能になっておりまして、ハンドシェイクが締結、つまり予約が確定したら本名を教えるという、そういうロジックになっているわけですね。
//苦し紛れに作った名前表示用のクラス
class Name {
private $name_first;
private $name_first_kana;
private $name_last;
private $name_last_kana;
private $nickname;
private $is_public_name;
private $name=null;//基本ない。ユーザークラスでのみアクセスの可能性があるので別途セットすること。
function set_id($name){
$this->name=$name;
}
function display_name($full=null){
if($this->nickname===1 && !empty($this->nickname)){
return $this->nickname;
}
$str=$this->display_force_name();
if( !$full || empty($this->kana()) ){return $str;}
return $this->display_force_full_name();
}
private function kana(){
if( empty($this->name_first_kana) && empty($this->name_last_kana) ){return null;}
return $this->name_last_kana." ".$this->name_first_kana;
}
function display_force_name(){
return $this->name_last." ".$this->name_first;
}
function display_force_full_name(){
if( empty($this->kana()) ){
return $this->display_force_name();
}
return $this->display_force_name()."(".$this->kana().")";
}
public function __construct($name_first,$name_first_kana,$name_last,$name_last_kana,$nickname,$is_public_name) {
$this->name_first=$name_first;
$this->name_first_kana=$name_first_kana;
$this->name_last=$name_last;
$this->name_last_kana=$name_last_kana;
$this->nickname=$nickname;
$this->is_public_name=$is_public_name;
}
}
今のとこ実装はこんな感じです。苦し紛れに、って書いちゃってますね(笑)
各種名前に関するデータを渡してきてこのクラスを作ることで、名前に関する操作をこのクラスに集約できます。
そう、これを「新しく作った」と言いましたが、これ、Hostクラスに最初はなかったんですよね。
Hostクラスに名前を表示するロジックをそのまま入れてしまったので、名前の表示部分だけ取り出せなくなったんですよね。つまり、疎結合ができていないわけです。
ハンドシェイク時にも「名前を表示したい」というオーダーはあるわけじゃないですか。
で、その時、「本名はまだ公表させてはいけない」「この人はよみがなを振っていない」などに対応するための条件分岐のロジック自体はHostクラスにあるのに、そこだけ別個に取り出せないんですよね。
使おうとするとHostクラスのインスタンスを作らなくちゃならなくて、
それってどう見ても無駄だよねっていう。
そういう問題に直面して、あぁこれが疎結合のやりたいことか・・・・・・って実感したなぁって話です。
自分では切り離してたつもりなんだけど、切り離せてなかったなぁと。
名前表示にクラスなんて必要となんて全然思ってなかったんですけど、思えばこれクラスにすれば良かったなぁって後悔して、今作ったわけですね。
こんな感じのやつに似た作業を最近やっているわけです・・・・・・。地味な作業ですけど、まとめられる時にまとめておかないと結局後でバグを生むので仕方ありません・・・・・・。