3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Code ChrysalisAdvent Calendar 2019

Day 25

会社の先輩に教えてもらったSOLID Principle: Single-responsibility principle

Posted at

#自己紹介
動物大好き、唐揚げ大好きな(最近はサラダも好きです)本山公子といいます:woman_tone1:
母がアメリカ在住の人と再婚して8歳から20年間アメリカ:flag_us:で育ちました。
その後はアメリカで働いたり、日本で英語の講師:pencil2:をしたりしていましたが、

夢はハッカー!:desktop:
お金持ちになりたい!:atm:
ビルゲイツになるぞ!:dark_sunglasses:

のような夢を持っており、プログラマーに転職しました:point_up:
今は健全な Reactを使ったフロントエンドデベロッパーです:raised_hands:
要領の悪い私は日頃から勉強に苦戦しており、会社の先輩に相談していたら、

「SOLID Principleをググってごらん。:man_tone3:
と言われて、ググって調べてみました。
とてもいいな!と思ったので、今回はその「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)は、ざっと

クラスは一つの仕事のみ担当せよ:point_up:

という風に言われています。
例えば、こんなコードがあるとします。

public class BankAccount {

  public function getAccountNumber(user: User): number {
    return 1234567890;
  }
}

めちゃめちゃシンプルに、銀行口座の番号を返す関数を作りました。
例として書いているので、どんなユーザーでも1234567890が返ってくるのは、ごめんなさい:joy:

今の状態は「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;
  }

ビルゲイツ並みにふさわしく、ちょっと欲張って大金持ちになってみました:metal:

getBalanceという関数を作りました。
自分の残高だって知りたいですよね。
毎回残高がこの金額だったら、ウハウハです:dancer_tone3:

どうですか?まだ銀行口座らしい仕事をしていますかね?
うん、いいんじゃないでしょうか。

じゃぁ、次はどうでしょう?

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は、お客さんに今の残高の「お知らせ通知」を手紙で送るサービスです:envelope:
ネットが使えない、紙の方がいい!という人に喜んでもらうためです:relaxed:

でもこれって、「銀行口座」のお仕事でしょうか?
銀行口座の任務を超えてる気がしませんか?
これが、

Single Responsibilityに反している:skull:

わけなんですね。

銀行口座は、「講座の管理をする」ことがお仕事であって、
「お客さんに通知のお知らせを送る」ことまでは、するべきではありません。

こういった場合、通知を送ってくれるクラスを作って、そのクラスにお仕事をしてもらいましょう!

public class Mail {

  public function sendMailToUser(user: User, balance: BankAccount) {
    ExpressMail.sendStatement(user.address, balance);
  }
}

これで BankAccountは、銀行口座のお仕事だけに集中できますね:pencil2:
なので、先ほどのユーザーに通知を送る関数は削除しちゃいます。

全部のコードは、こんな感じです。

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);
  }
}

以上でした:sunglasses:

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?