Upgrade to Pro — share decks privately, control downloads, hide ads and more …

「影響が少ない」を自分の目でみてみる

 「影響が少ない」を自分の目でみてみる

PHPカンファレンス小田原2025での発表資料です
https://fortee.jp/phpconodawara-2025/proposal/10386b1c-679e-4a3b-b64d-9f9a0b4c98f7

hideki kinjyo

April 11, 2025
Tweet

More Decks by hideki kinjyo

Other Decks in Programming

Transcript

  1. 自己紹介 • 金城秀樹 / きんじょうひでき • GitHub: @o0h / 𝕏

    : @o0h_ • 好きなFWはCakePHP • アイコンは美味しい鮭親子丼の写真です • 最近はPodcastをやっています • ハッシュタグ: #readlinefm 
  2.  [ग़య] ᴷ ϚΠέϧɾC.ϑΣβʔζ ஶ΄͔ ϨΨγʔίʔυվળΨΠυ : อक։ൃͷͨΊͷϦϑΝΫλϦϯά P171 ※

    ڧௐ͸εϥΠυ੍࡞ऀʹΑΔ この図には、描き方の規則がほとんどありません。私が影響スケッチ (effect sketch)と呼んでいるだけです。重要なことは、影響を受ける 変数と、戻り値が変わる可能性のあるメソッドについて、それぞれ楕円を 描くことです。 [中略] 更新されるものについて楕円を描き、それによって実行時に値 が変わり得るすべてのものに向かって矢印を描くだけです。
  3. 例  // class ஫จ { public function can஫จड෇(): bool

    { if ( $this->঎඼DB->is༧໿ඞਢ($this->঎඼ID) && !$this->is༧໿஫จ() ) { return false; } $ࡏݿؔ܎৘ใ = $this->঎඼DB ->getࡏݿؔ܎৘ใ($this->঎඼ID); $ݱࡏͷࡏݿ = $ࡏݿؔ܎৘ใ['ݱࡏͷࡏݿ'] ?? 0; $༧໿਺ = $ࡏݿؔ܎৘ใ['༧໿਺'] ?? 0; return ($ݱࡏͷࡏݿ - $༧໿਺) >= $this->஫จ਺; } こんな感じのメソッドを 題材に (ちょっと解説します)
  4. 例  // class ஫จ { public function can஫จड෇(): bool

    { } 注文クラスに can注文受付メソッドが あります
  5. 例  // can஫จड෇ { if ( $this ->঎඼DB ->is༧໿ඞਢ($this->঎඼ID)

    && !$this->is༧໿஫จ() ) { return false; } 予約必須商品 の場合は 予約注文でなければ 不可(false)です
  6. 例  // can஫จड෇ { $঎඼ID = $this->঎඼ID; $ࡏݿؔ܎৘ใ =

    $this ->঎඼DB ->getࡏݿؔ܎৘ใ($঎඼ID); 商品DBから 注文商品の 在庫関係情報を 取り出します
  7. 例  // can஫จड෇ { $ݱࡏͷࡏݿ = $ࡏݿؔ܎৘ใ['ݱࡏͷࡏݿ'] ?? 0;

    $༧໿਺ = $ࡏݿؔ܎৘ใ['༧໿਺'] ?? 0; 在庫数と 予約数を 取得します
  8. 例  // can஫จड෇ { return ($ݱࡏͷࡏݿ - $༧໿਺) >=

    $this->஫จ਺; 今回の注文の 注文数と比較して 注文可否判定を 返します
  9. これをスケッチしてみる  // can஫จड෇ { return ($ݱࡏͷࡏݿ - $༧໿਺) >=

    $this->஫จ਺; 今回の注文の 注文数と比較して 注文可否判定を 返します この構造をスケッチしてみる
  10. 処理(メソッド)も列挙する  // can஫จड෇ { if ( $this ->঎඼DB ->is༧໿ඞਢ($this->঎඼ID)

    && !$this->is༧໿஫จ() ) { return false; } ->is༧໿ඞਢ is༧໿஫จ
  11. 要素同士を結ぶ:アプリケーション外のつながり  // can஫จड෇ { $ࡏݿؔ܎৘ใ = $this ->঎඼DB ->getࡏݿؔ܎৘ใ($঎඼ID);

    $ݱࡏͷࡏݿ = $ࡏݿؔ܎৘ใ['ݱࡏͷࡏݿ'] ?? 0; $༧໿਺ = $ࡏݿؔ܎৘ใ['༧໿਺'] ?? 0; DBから データをとる処理
  12. 要素同士を結ぶ:アプリケーション外のつながり  // can஫จड෇ { $ࡏݿؔ܎৘ใ = $this ->঎඼DB ->getࡏݿؔ܎৘ใ($঎඼ID);

    $ݱࡏͷࡏݿ = $ࡏݿؔ܎৘ใ['ݱࡏͷࡏݿ'] ?? 0; $༧໿਺ = $ࡏݿؔ܎৘ใ['༧໿਺'] ?? 0; 在庫数と 予約数を 取得します このメソッドの話 ->getࡏݿؔ܎৘ใ
  13. スケッチの全体像  全体像は こんな感じに // class ஫จ { public function

    can஫จड෇(): bool { if ( $this->঎඼DB->is༧໿ඞਢ($this->঎඼ID) && !$this->is༧໿஫จ() ) { return false; } $ࡏݿؔ܎৘ใ = $this->঎඼DB ->getࡏݿؔ܎৘ใ($this->঎඼ID); $ݱࡏͷࡏݿ = $ࡏݿؔ܎৘ใ['ݱࡏͷࡏݿ'] ?? 0; $༧໿਺ = $ࡏݿؔ܎৘ใ['༧໿਺'] ?? 0; return ($ݱࡏͷࡏݿ - $༧໿਺) >= $this->஫จ਺; }
  14. プログラミングの秘密  public function getࡏݿؔ܎৘ใ($঎඼ID) { // ͝ʹΐ return $ࡏݿؔ܎৘ใ;

    } 図式化してみまして get在庫関係情報($arg) 商品ID 在庫情報
  15. プログラミングの秘密  ೖྗ ܭࢉ ग़ྗ public function getࡏݿؔ܎৘ใ($঎඼ID) { //

    ͝ʹΐ return $ࡏݿؔ܎৘ใ; } get在庫関係情報($arg) 商品ID 在庫情報 概念化してみました
  16. 乱暴な例  さっきのコード $ࡏݿؔ܎৘ใ = $this->঎඼DB ->getࡏݿؔ܎৘ใ($this->঎඼ID); $ݱࡏͷࡏݿ = $ࡏݿؔ܎৘ใ['ݱࡏͷࡏݿ']

    ?? 0; $༧໿਺ = $ࡏݿؔ܎৘ใ['༧໿਺'] ?? 0; return ($ݱࡏͷࡏݿ - $༧໿਺) >= $this->஫จ਺;
  17. $ࡏݿؔ܎৘ใ = $this->঎඼DB ->getࡏݿؔ܎৘ใ($this->঎඼ID); $ݱࡏͷࡏݿ = $ࡏݿؔ܎৘ใ['ݱࡏͷࡏݿ'] ?? 0; $༧໿਺

    = $ࡏݿؔ܎৘ใ['༧໿਺'] ?? 0; return ($ݱࡏͷࡏݿ - $༧໿਺) >= $this->஫จ਺; 乱暴な例  さっきのコード 在庫関係情報を DBから取って ->getࡏݿؔ܎৘ใ($this->঎඼ID)
  18. 乱暴な例  さっきのコード $ࡏݿؔ܎৘ใ = $this->঎඼DB ->getࡏݿؔ܎৘ใ($this->঎඼ID); $ݱࡏͷࡏݿ = $ࡏݿؔ܎৘ใ['ݱࡏͷࡏݿ']

    ?? 0; $༧໿਺ = $ࡏݿؔ܎৘ใ['༧໿਺'] ?? 0; return ($ݱࡏͷࡏݿ - $༧໿਺) >= $this->஫จ਺; ($ݱࡏͷࡏݿ - $༧໿਺) 差分を計算して、 結果を返す
  19. 乱暴な例  在庫関係情報の「中身」を注意深く見てみると・・・ $ࡏݿؔ܎৘ใ = $this->঎඼DB ->getࡏݿؔ܎৘ใ($this->঎඼ID); $ݱࡏͷࡏݿ = $ࡏݿؔ܎৘ใ['ݱࡏͷࡏݿ']

    ?? 0; $༧໿਺ = $ࡏݿؔ܎৘ใ['༧໿਺'] ?? 0; return ($ݱࡏͷࡏݿ - $༧໿਺) >= $this->஫จ਺; ここに注目したい ['ݱࡏͷࡏݿ'] ['༧໿਺'] ここに注目したい
  20. 乱暴な例  DBの知識が、そのまま流れ込んでいる $ࡏݿؔ܎৘ใ = $this->঎඼DB ->getࡏݿؔ܎৘ใ($this->঎඼ID); $ݱࡏͷࡏݿ = $ࡏݿؔ܎৘ใ['ݱࡏͷࡏݿ']

    ?? 0; $༧໿਺ = $ࡏݿؔ܎৘ใ['༧໿਺'] ?? 0; return ($ݱࡏͷࡏݿ - $༧໿਺) >= $this->஫จ਺; ['ݱࡏͷࡏݿ'] ['༧໿਺']
  21. 乱暴な例  計算処理を「右側」に押しやる改修 public function get༗ޮࡏݿ਺($঎඼ID): int { $ࡏݿؔ܎৘ใ =

    $this->getࡏݿؔ܎৘ใ($঎඼ID); // $ࡏݿؔ܎৘ใΛ͜͜ͰΰχϣΔ return $༗ޮࡏݿ਺; }
  22. 乱暴な例  こんなコードがあったとして final class ͓໺ࡊ { private string $໊લ;

    private int $ΧϩϦʔ; private int $Ձ֨; } get੫ࠐՁ֨($oyasai);
  23. 乱暴な例  渡す(受け取る・要求する)データを絞ってあげる final class ͓໺ࡊ { private string $໊લ;

    private int $ΧϩϦʔ; private int $Ձ֨; } get੫ࠐՁ֨($oyasai->getՁ֨()); $oyasai->getՁ֨()