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

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

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

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

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; // 消費税計算