#自己紹介
動物大好き、唐揚げ大好きな(最近はサラダも好きです)本山公子といいます
母がアメリカ在住の人と再婚して8歳から20年間アメリカで育ちました。
その後はアメリカで働いたり、日本で英語の講師をしたりしていましたが、
夢はハッカー!
お金持ちになりたい!
ビルゲイツになるぞ!
のような夢を持っており、プログラマーに転職しました
今は健全な Reactを使ったフロントエンドデベロッパーです
要領の悪い私は日頃から勉強に苦戦しており、会社の先輩に相談していたら、
「SOLID Principleをググってごらん。」
と言われて、ググって調べてみました。
とてもいいな!と思ったので、今回はその「S」をシェアします。
何かおかしなこと、訂正した方がいいところなどのアドバイス、歓迎します!
#SOLID Principle (単一責任の原則)
SOLID Principleとは、頭文字で、
- S - Single Responsibility Principle:単一責任の原則
- O - Open/closed principle:オープン/クロースドの原則
- L - Liskov substitution principle:リスコフの置換原則
- I - Interface segregation principle:インターフェース分離の原則
- D - Dependency inversion principle:依存性逆転の原則
の略です。今日は、その「Single Responsibility Principle」
について書きます。
##Single Responsibility Principle
Single Responsibility Principle(略してSRP)は、ざっと
クラスは一つの仕事のみ担当せよ
という風に言われています。
例えば、こんなコードがあるとします。
public class BankAccount {
public function getAccountNumber(user: User): number {
return 1234567890;
}
}
めちゃめちゃシンプルに、銀行口座の番号を返す関数を作りました。
例として書いているので、どんなユーザーでも1234567890
が返ってくるのは、ごめんなさい
今の状態は「Single Responsibility」な訳です。
どういうことかというと、このクラスは「Bank Account」がすべき事をしているからです。
他の関係ないことはしていません。
こんなコードを追加したらどうでしょうか?
public class BankAccount {
public function getAccountNumber(user: User): number {
return 1234567890;
}
//追加↓
public function getBalance(user: User): number {
return 100,000,000,000,000;
}
ビルゲイツ並みにふさわしく、ちょっと欲張って大金持ちになってみました
getBalance
という関数を作りました。
自分の残高だって知りたいですよね。
毎回残高がこの金額だったら、ウハウハです
どうですか?まだ銀行口座らしい仕事をしていますかね?
うん、いいんじゃないでしょうか。
じゃぁ、次はどうでしょう?
public class BankAccount {
public function getAccountNumber(user: User): number {
return 1234567890;
}
public function getBalance(user: User): number {
return 100,000,000,000,000;
}
//追加↓
public function sendBalanceStatementToUser(user: User): void {
ExpressMail.sendStatement(user.address, 100,000,000,000,000);
}
いきなり長い関数名が出てきました。
sendBalanceStatementToUser
は、お客さんに今の残高の「お知らせ通知」を手紙で送るサービスです
ネットが使えない、紙の方がいい!という人に喜んでもらうためです
でもこれって、「銀行口座」のお仕事でしょうか?
銀行口座の任務を超えてる気がしませんか?
これが、
Single Responsibilityに反している
わけなんですね。
銀行口座は、「講座の管理をする」ことがお仕事であって、
「お客さんに通知のお知らせを送る」ことまでは、するべきではありません。
こういった場合、通知を送ってくれるクラスを作って、そのクラスにお仕事をしてもらいましょう!
public class Mail {
public function sendMailToUser(user: User, balance: BankAccount) {
ExpressMail.sendStatement(user.address, balance);
}
}
これで BankAccount
は、銀行口座のお仕事だけに集中できますね
なので、先ほどのユーザーに通知を送る関数は削除しちゃいます。
全部のコードは、こんな感じです。
public class BankAccount {
public function getAccountNumber(user: User): number {
return 1234567890;
}
public function getBalance(user: User): number {
return 100,000,000,000,000;
}
public class Mail {
public function sendMailToUser(user: User, balance: BankAccount) {
ExpressMail.sendStatement(user.address, balance);
}
}
以上でした