Contents
先輩から雑誌を渡された
これから設計に関する知識も増やしていきたいな〜と思っていた矢先、「Software Design (ソフトウェアデザイン) 2023年6月号 [雑誌]」という書籍に出会いました。中々嬉しいタイミングですね!笑
いわゆるクリーンアーキテクチャに関する内容が紹介されている雑誌になります。
今回はシリーズ形式で各記事に分けて書いていこうと思います〜!
SOLID原則を簡単に
- 単一責任の原則 (Single Responsibility Principle, SRP)
- オープン/クローズドの原則 (Open/Closed Principle, OCP)
- リスコフの置換原則 (Liskov Substitution Principle, LSP)
- インターフェース分離の原則 (Interface Segregation Principle, ISP)
- 依存性逆転の原則 (Dependency Inversion Principle, DIP)
単一責任の原則
SRP : Single Responsibility Principle
一言で表すとクラスは単一の責務を持つべきということらしいです。
もっと噛み砕くと1つのクラスが1つの目的や責務にのみ集中するべきことを指します.
//良くない設計
<?php
class DB {
private $host;
private $dbName;
private $userName;
private $password;
public function __construct($name, $email) {
$this->host = env('host');
$this->dbName = env('dbName');
$this->userName = env('userName');
$this->password = env('password');
try {
$database_handler = new PDO('mysql:host=' . $this->host . ':3306;dbname=' . $this->dbName . ';charset=utf8mb4', $this->userName, $this->password);
}
catch (PDOException $e) {
echo $e->getMessage() . "\n";
exit;
}
}
public static function selectUser() {
$PDO = $db = new self();
//取得処理
}
public static function editAdmin() {
$PDO = $db = new self();
//編集処理
}
}
?>
上記のコードではDBクラスを定義しているのですが、ユーザーの取得処理と管理者の編集処理を記述しています。
理想とするクラス設計では、ユーザーのクラス/管理者のクラスという形で分けるべきですよね。↓
DB接続クラス
class DB {
private $host;
private $dbName;
private $userName;
private $password;
public function __construct($name, $email) {
$this->host = env('host');
$this->dbName = env('dbName');
$this->userName = env('userName');
$this->password = env('password');
try {
$database_handler = new PDO('mysql:host=' . $this->host . ':3306;dbname=' . $this->dbName . ';charset=utf8mb4', $this->userName, $this->password);
}
catch (PDOException $e) {
echo $e->getMessage() . "\n";
exit;
}
}
}
ユーザクラス(管理者も同様に)
class User {
public static function selectUser() {
$PDO = $db = new self();
//取得処理
}
//他のユーザーに関する処理を記述していく
}
良くないコード例として出したソースは以前の現場で書いていた手法なんですよね。笑
DBクラスの内容が1000以上になっていたので、拡張性や保守性がかなり良くない事が単一責任の原則を学んで理解できたので良しとしましょう。
ちなみに前の現場で書いていた内容はいつか爆発することは目に見えているのですが、爆破する前に逃げ出すことが出来ました。笑