2008年9月15日月曜日

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



PHPで書いてみる。

3 振る舞い
3.1 メソッド

ComposedMethod


1つのことのみするメソッドに分割しよう。


class Controller{
public function controlActivity() {
$this->controlInitialize();
$this->controlLoop();
$this->controlTerminate();
}
public function controlInitialize(){
//初期化
}
public function controlLoop(){
//ループ処理
}
public function controlTerminate(){
//切断
}
}


Constructor Method

インスタンス生成時にいろいろな引数を渡したいときは適切に作ってくれる
メソッドを用意しよう。


class Point{
public function __construct($x, $y){
// .....
}
public function Polar($r, $theta) {
$x = $r * cos(deg2rad($theta));
$y = $r * sin(deg2rad($theta));
new self($x, $y);
}
}

new Point(1, 1);

Point::Polar(sqrt(2), 45);


Constructor Parameter Method

インスタンス変数を一度に設定するメソッドを定義しよう


class Point {
public function __construct($x, $y) {
$this->x = $x;
$this->y = $y;
}
}



class Point {
public function __construct($x, $y) {
$this->_setXY($x, $y);
}
private function _setXY($x, $y) {
$this->x = $x;
$this->y = $y;
}
}




Shortcut Constructor Method
ショートカットメソッドを定義しよう

こんな感じ?


class Number {
public function __construct($x) {
$this->x = $x;
}
public function getPoint($y){
return new Point($this->x , $y);
}
}

$number = new Number(1);
$point = $number->getPoint(2);



Conversion

オブジェクトのプロトコルを増やすのではなく、別のオブジェクトに変換しよう

Converter Method

オブジェクトを同一プロトコルのオブジェクトに変換するメソッドを用意しよう
メソッド名はasXXXとする。

こんな感じ?微妙・・・

class Collection {
private $collection = array();
public function __construct(array $array = array()){
$this->collection = $array;
}
public function asSet() {
return array_unique($this->collection);
}
}

class Number {
public function __construct($x){
$this->x = (int)$x;
}
public function asFloat() {
return (float)$this->x;
}
}



Converter Constructor Method

変換もとのオブジェクトを引数として受け取りインスタンスを生成しよう


Query Method
真偽値を返すメソッドを用意しよう。メソッド名はisXXXとする。


class SwitchClass {
public function makeOn() {
$this->status = 'on';
}
public function makeOff() {
$this->status = 'off';
}
public function status() {
return $this->status;
}
}

class WallPlate{
public function __construct(){
$this->switch = new SwitchClass();
$this->lignt = new Light();
}
public function update() {
if($this->switch->status == 'on'){
$this->lignt->makeOn();
}elseif($this->switch->status == 'off'){
$this->lignt->makeOff();
}
}
}




class SwitchClass {
public function makeOn() {
$this->status = 'on';
}
public function makeOff() {
$this->status = 'off';
}
public function status() {
return $this->status;
}
public function isOn() {
$this->status == 'on'' ? true : false;
}
}

class WallPlate{
public function __construct(){
$this->switch = new SwitchClass();
$this->lignt = new Light();
}
public function update() {
if($this->switch->isOn){
$this->lignt->makeOn();
}else{
$this->lignt->makeOff();
}
}
}


続く