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

ふにゃっとしない名前の付け方 〜哲学で茹で上げる、コシのあるソフトウェア設計〜

ふにゃっとしない名前の付け方 〜哲学で茹で上げる、コシのあるソフトウェア設計〜

Avatar for akshimo

akshimo

May 08, 2026

More Decks by akshimo

Other Decks in Programming

Transcript

  1. • Eric Evans『ドメイン駆動設計』 • Vlad Khononov『ドメイン駆動設計をはじめよう』 • Robert C. Martin『Clean

    Code』 • 増田 亨『現場で役立つシステム設計の原則』 • 石川 宗寿『読みやすいコードのガイドライン』 • Dustin Boswell, Trevor Foucher『リーダブルコード』
  2. • 永井 均『ウィトゲンシュタイン入門』 • 橋爪 大三郎『言語ゲームの練習問題』 • 橋爪 大三郎『はじめての言語ゲーム』 •

    中村 晃『ウィトゲンシュタイン、最初の一歩』 • 中村 晃『ウィトゲンシュタイン「哲学探究」入門』
  3. • 鈴木 俊貴『僕には鳥の言葉がわかる』 • 石田 英敬『記号論講義』 • 内田 樹『寝ながら学べる構造主義』 •

    ガイ・ドイッチャー『言語が違えば、世界も違って見えるわけ』 • 佐藤 信夫『レトリック感覚』 • 町田 健『ソシュールと言語学』 • 服部 裕幸『言語哲学入門』
  4. 1. 世界は成立していることがらの総体である。 2. 成立していることがら、すなわち事実とは、諸事実の成立である。 3. 事実の論理像が思考である。 4. 思考とは有意味な命題である。 5. 命題は要素命題の真理関数である。(要素命題は自分自身の真理関数であ

    る。) 6. 真理関数の一般的な形式はこうである。      これは命題の一般形式であ る。 7. 語りえぬものについては、沈黙せねばならない。 8. ウィトゲンシュタイン著、野矢茂樹訳『論理哲学論考』
  5. ドメインをマッピングができてないと class Account { public float $balance; } class AccountService

    { public function reduceBalance(Account $account, float $amount): void { if ($account->balance < $amount) { throw new Exception("残高不足です"); } $account->balance -= $amount; } }
  6. ドメインをマッピングができてないと class Account { public float $balance; } class AccountService

    { public function reduceBalance(Account $account, float $amount): void { if ($account->balance < $amount) { throw new Exception("残高不足です"); } $account->balance -= $amount; } } ドメインと違う構造
  7. class Account { public float $balance; } class AccountService {

    public function reduceBalance(Account $account, float $amount): void { if ($account->balance < $amount) { throw new Exception("残高不足です"); } $account->balance -= $amount; } } ドメインをマッピングができてないと ドメインと違うコトバ
  8. ドメインをマッピングができてないと class Account { public float $balance; } class AccountService

    { public function reduceBalance(Account $account, float $amount): void { if ($account->balance < $amount) { throw new Exception("残高不足です"); } $account->balance -= $amount; } } 知識のマッピング漏れ
  9. ドメインをマッピングができてないと class Account { public float $balance; } class AccountService

    { public function reduceBalance(Account $account, float $amount): void { if ($account->balance < $amount) { throw new Exception("残高不足です"); } $account->balance -= $amount; } } 分散する知識
  10. そのままコードに落とし込む class Account { public function __construct(private float $balance) {

    // 不変条件 if ($balance < 0) throw new DomainException("残高がマイナスです"); } public function withdraw(float $amount): Account { if ($amount <= 0) throw new InvalidArgumentException("金額が正しくありません"); if ($this->balance < $amount) throw new DomainException("残高不足です"); $this->balance -= $amount; } }
  11. そのままコードに落とし込む class Account { public function __construct(private float $balance) {

    // 不変条件 if ($balance < 0) throw new DomainException("残高がマイナスです"); } public function withdraw(float $amount): Account { if ($amount <= 0) throw new InvalidArgumentException("金額が正しくありません"); if ($this->balance < $amount) throw new DomainException("残高不足です"); $this->balance -= $amount; } } ドメインと同じコトバ
  12. そのままコードに落とし込む class Account { public function __construct(private float $balance) {

    // 不変条件 if ($balance < 0) throw new DomainException("残高がマイナスです"); } public function withdraw(float $amount): Account { if ($amount <= 0) throw new InvalidArgumentException("金額が正しくありません"); if ($this->balance < $amount) throw new DomainException("残高不足です"); $this->balance -= $amount; } } ドメインと同じ構造
  13. そのままコードに落とし込む class Account { public function __construct(private float $balance) {

    // 不変条件 if ($balance < 0) throw new DomainException("残高がマイナスです"); } public function withdraw(float $amount): Account { if ($amount <= 0) throw new InvalidArgumentException("金額が正しくありません"); if ($this->balance < $amount) throw new DomainException("残高不足です"); $this->balance -= $amount; } } 口座のルールは口座にマッピング
  14. “全部入り”のモデルを作ると 注文モデル • 成約日時 • 発送日時 • 発送期限 • 重量

    • 配送方法 • 決済金額 • 決済方法 • 支払い期限 このモデルの関心は何...?
  15. 言語ゲームで境界を引く 営業の言語ゲーム 倉庫の言語ゲーム 注文モデル • 成約日時 • 決済金額 • 決済方法

    • 支払い期限 注文モデル • 発送日時 • 発送期限 • 重量 • 配送方法 同じ名前のモデルでも、 異なるモデルにする!
  16. ◯はなんと命名する? for ($i = 1; $i <= 100; $i++) {

    if ($i % 3 === 0) { echo ‘Fizz’; } }
  17. ファクトリメソッド class Account { private function __construct(private float $balance) {...}

    public static function fromBalance(float $balance): self { return new self($amount); } public static function open(): self { return new self(0); } }
  18. 再代入をしない // 良くない例 $price = 100; $price = $price *

    $fee; // 手数料加算 $price = $price * 1.1; // 消費税計算 // 良い例 $itemsPrice = 100; $priceWithFee = $itemsPrice * $fee; // 手数料加算 $priceWithTax = $priceWithFee * 1.1; // 消費税計算