##開放閉鎖の原則 (Open/closed principle)
拡張に対して開いて (open) いなければならず、
修正に対して閉じて (closed) いなければならない
上記原則に従ったソフトウェアは、既存のソースコードを変更することなく、振る舞いを変更することができる
ある日の会話
私「なんとなくしかわからない...。つまり、どういうこと?」
夫「SOLID原則の中で、一番何言ってるのかわからない箇所かも」
夫「実際コードを書いて説明するよ」
class BadSampleController
{
public function BadSample()
{
$class = new Update(new DbConnection());
//エンドユーザー
$class->updateUser($userName, $address);
//管理者ユーザー
$class->updateAdmin($userName, $address, $authority);
}
}
class Update
{
public function __construct(DbConnection $connection)
{
$this->connection = $connection;
}
public function updateUser($userName, $address)
{
$this->connection->begin();
// $userName, $addressの更新処理
$this->connection->commmit();
}
public function updateAdmin($userName, $address, $authority)
{
$this->connection->begin();
// $userName, $address, $authorityの更新処理
$this->connection->commmit();
}
}
兄「この例だと、更新対象が増える度に、メソッドを追加しなくちゃならないから修正に対して閉じてないということ」
私「わかりやすくいうと、「店舗ユーザー」を追加する場合は、Updateクラスにメソッドを追加することになるってことか・・・」
私「逆に、更新対象が増えてもメソッドを追加しなくてもいいのが修正に対して閉じてるのね」
兄「そ。じゃあどうすればいい?って思うよね?」
私「うん。...インターフェイスとか使うのかな?」
兄「正解! コードを書いてみようか」
class SampleController
{
$class = new Update(new DbConnection());
//エンドユーザー
$class->update(new User());
//管理者ユーザー
$class->update(new Admin());
}
class Update
{
public function __construct(DbConnection $connection)
{
$this->connection = $connection;
}
public function update(UpdateInterface $update)
{
$this->connection->begin();
$update->updateUser();
$this->connection->commmit();
}
}
interface UpdateInterface
{
public function updateUser();
}
class User implements UpdateInterface
{
public function __construct(DbConnection $connection)
{
$this->connection = $connection;
}
/**
* エンドユーザーに対する更新処理を記載する
*/
public function updateUser(){
// $userName, $addressの更新処理
}
}
class Admin implements UpdateInterface
{
public function __construct(DbConnection $connection)
{
$this->connection = $connection;
}
/**
* 管理者ユーザーに対する更新処理を記載する
*/
public function updateUser(){
// $userName, $address, $authorityの更新処理
}
}
兄「こうすると、下位ロジックにメソッドを追加しなくてもよくなったでしょ」
私「たしかに!」
私「じゃあ、店舗ユーザーを増やしたいってなった時は、店舗ユーザークラスの作成とコントローラーへの追記だけでOKってことだよね?」
兄「そうだよ」
私「めっちゃいいやつ....」
おわり
###関連_SOLID原則の記事
単一責任の原則