2008年9月20日土曜日

Smalltalk ベストプラクティスパターンを読んでのメモ2

これの続き



Comparing Method


オブジェクト同士を並び替えたいときは比較用メソッドを定義しよう
メソッド名で le だと分かりにくい気もする。lessThanOrEqual のほうが良いか。。。
<=って書きたい。


class Event {

public function le($anEvent) {
return ($this->timestamp <= $anEvent->timestamp);
}

}



Reversing Method


メッセージの流れをスムーズに。
よくわからないけど


class Point {

public function printOn($asStream) {
$this->x->printOn($asStream);
$asStream->nextPutAll('@');
$this->y->printOn($asStream);
}

}


class Stream {
public function _print($anObject) {
$anObject->printOn($this);
}

}
class Point {
public function printOn($asStream) {
$asStream->print($this->x);
$asStream->nextPutAll('@');
$asStream->print($this->y);
}

}



Method Object

たくさんの引数や一時変数であふれているメソッドを単純化する。


class Obiligation{

public function sendTask($aTask, $aJob) {
//一時変数いっぱい
$notProcessed = null;
$processed = null;
$copied = null;
$executed = null;
// たくさんの処理
}
}



class Obiligation{

public function sendTask($aTask, $aJob) {
//一時変数いっぱい
$notProcessed = null;
$processed = null;
$copied = null;
$executed = null;
$this->prepareTask($aTask, $aJob, $notProcessed, $processed, $copied, $executed);
}

public function prepareTask($aTask, $aJob, $notProcessed, $processed, $copied, $executed){
//ComposedMethodで処理を請け負うと引数が多くなりすぎ、コード量の削減にもならない
}
}



class TaskSender{
private $obiligation;
private $task;
private $job;
private $notProcessed;
private $processed;
private $copied;
private $executed;

public function __construct($anObiligation, $aTask, $aJob) {
$this->obiligation = $anObiligation;
$this->task = $aTask;
$this->job = $aJob;
}
public function compute(){
//ここにたくさんの処理。
}
}

class Obiligation{

public function sendTask($aTask, $aJob) {
$taskSender = new TaskSender($this, $aTask, $aJob);
$taskSender->compute();
}
}



Execute Around Method

続けて実行しなければならないアクションのペアを表現

class Cursor {
public function showWhite($aBlock) {
$old = null;
$old = Cursor::currentCursor();
$this->show();
$aBlock->value();
$old->show();
}
}

class File{
public function openDuring($aBlock) {
$this->open();
$aBlock->value();
$this->close();
}

}


class File{
public function openDuring($aBlock) {
$this->open();
try{
$aBlock->value();
}catch(Exception $e){
//更に例外を投げるならその前に$this->close()をする。
}
$this->close();
}
}



Debug Printing Method

デバッグ用のメッセージを出力する。


class Association{
public function printOn($asStream) {
$asStream->print($this->key);
$asStream->nextPutAll('->');
$asStream->print($this->value);
}
}


Method Comment
メソッドのコメントの書き方

メソッドの先頭にコメントを書き、コードから明白に読み取れない重要な
情報を伝える。