701 Views
February 27, 25
スライド概要
2025-02-26
すごい広島 with Python
Shuaruta Inc. ウェブアクセシビリティ基盤委員会 (WAIC) NVDA日本語版 すごい広島 with Python
PythonでSOLID原則をAIにやらせてみた https://github.com/nishimotz/hello-python-solid 2025-02-26
DJANGOCONGRESS ABOUT PROGRAM PUBLICVIEWING LIVE ROOM 1 LIVE ROOM 2 DjangoCongress JP 2025 Async Future 2025 Feb, 2025 Online Dates 2025 / 2 / 22 (Sat) JST Online YouTube PubViewing Register
「あるべき構造」を知り ソフトウェア開発の問題に 立ち向かおう 改訂新版 良いコード 悪いコード で学ぶ 設計入門 保守しやすい 成長し続けるコードの書き方 より良いコードの書き方や開発の進め方を わかりやすいアンチパターンで学ぶ コード改善、ソフトウェア設計の入門書 技術評論社 仙場大也 [著] 変更容易性 オブジェクト指向 カプセル化 ドメインモデル完全性 完全コンストラクタ 値オブジェクト イミュータブル 関心の分離 インターフェイスと実装の分離 単一責任の原則 ファーストクラスコレクション コンポジション ストラテジ ポリシー コマンド・クエリ分離 目的駆動名前設計 モデリング リファクタリング コードメトリクス コアドメイン 破壊的代入 重複コード 多重ネスト 生焼けオブジェクト 貧血ドメインモデル プリミティブ型執着 アクセサ連鎖 出力引数 フラグ引数 グローバル変数 スマートUI 神クラス デッドコード マジックナンバー 例外の握り潰し 技術駆動命名 技術駆動パッケージング 退化コメント ダブルモーニング 技術的負債 Clean Architecture クリーンアーキテクチャ Clean Architecture 達人に学ぶソフトウェアの構造と設計 Robert C. Martin 著 角 征典、高木正弘 訳 アーキテクチャの ルールはどれも 同じである! ASCII DWANGO
udemy Benesse カテゴリー 学びたいトピックを検索 例: データ Udemy Business Udemyで教える ログイン 新規登録 開発 > ウェブ開発 > オブジェクト指向デザイン (OOD) Python で身につける オブジェクト指向 【SOLID原 則+デザインパターンで、オブジェクト指向設計の基 礎を習得!】 あなたは、オブジェクト指向で開発できますか? 元塾講師エンジニアが教える、オブジ ェクト指向実践講座! 身近な例とPythonのコードで、SOLID原則・デザインパターン・ 設計技法を丁寧に解説。「オブジェクト指向で開発できない」はこれで卒業です。 ベストセラー 4.8 ★★★★★ (109件の評価) 1,272人の受講生 作成者: ひらまつしょうたろう 最終更新日: 2024/6 日本語 日本語 [自動] このコースをプレビュー ¥1,600 ¥23,800 93%OFF この価格で購入できるのは、あと5時間! カートに入れる 今すぐ購入する
SOLID原則 1. S: 単一責任の原則 (SRP: Single Responsibility Principle) →各クラスや関数は1つの責任だけを持つべき 2. O: オープン・クローズドの原則 (OCP: Open/Closed Principle) →既存のコードを変更せずに、新しい振る舞いを追加できるようにする 3. L: リスコフの置換原則 (LSP: Liskov Substitution Principle) →サブクラスはスーパークラスを置き換え可能であるべき 4. I: インターフェース分離の原則 (ISP: Interface Segregation Principle) →クライアントは不要なメソッドに依存すべきでない 5. D: 依存関係逆転の原則 (DIP: Dependency Inversion Principle) →具象クラスに依存せず、抽象(インターフェースや抽象クラス)に依存する
TN python の property デコレータで値オブジェクトを作る
class Money: def __init__(self, amount, currency): self._amount = amount self._currency = currency @property def amount(self): return self._amount @property def currency(self): return self._currency def __eq__(self, other): if not isinstance(other, Money): return False return self.amount == other.amount and self.currency == other.currency
FizzBuzz を SOLID 原則に従って設計する方法を説明します。 FizzBuzz の概要 FizzBuzz は、1 から n までの数を出力し、 ・3 の倍数なら "Fizz" ・5 の倍数なら "Buzz" ・15 の倍数なら "FizzBuzz" ・それ以外は数値をそのまま出力 する問題です。
FizzBuzz を SOLID に設計 以下の設計に基づき、SOLID に沿った FizzBuzz を実装します。 1. ルール (Fizz, Buzz, FizzBuzz など) を個別のクラスに分割 (SRP) 2. ルールを追加しやすいように OCP に従う (変更せず拡張) 3. 共通のインターフェースを使ってルールを適用 (LSP, ISP, DIP)
def test_fizzbuzz_processor(): # ルールの優先順位: FizzBuzz > Fizz > Buzz > Number processor = FizzBuzzProcessor([ FizzBuzzRule(), FizzRule(), BuzzRule(), NumberRule() ])
# 通常の数字の場合 assert processor.process(1) == "1" assert processor.process(2) == "2" assert processor.process(4) == "4" # Fizz の場合 assert processor.process(3) == "Fizz" assert processor.process(6) == "Fizz" # Buzz の場合 assert processor.process(5) == "Buzz" assert processor.process(10) == "Buzz" # FizzBuzz の場合 (15の倍数) assert processor.process(15) == "FizzBuzz" assert processor.process(30) == "FizzBuzz"
import pytest from fizzbuzz import Rule, FizzRule, BuzzRule, FizzBuzzRule, NumberRule, FizzBuzzProcessor def test_rule_is_abstract(): # Rule クラスは直接インスタンス化できないことを確認 with pytest.raises(TypeError): Rule() def test_rule_has_apply_method(): # Rule クラスが apply メソッドを持つことを確認 assert hasattr(Rule, 'apply')
def test_fizz_rule(): rule = FizzRule() assert rule.apply(3) == "Fizz" assert rule.apply(6) == "Fizz" assert rule.apply(5) == "" # Fizz のルールに該当しない場合 def test_buzz_rule(): rule = BuzzRule() assert rule.apply(5) == "Buzz" assert rule.apply(10) == "Buzz" assert rule.apply(3) == "" # Buzz のルールに該当しない場合
def test_fizzbuzz_rule(): rule = FizzBuzzRule() assert rule.apply(15) == "FizzBuzz" assert rule.apply(30) == "FizzBuzz" assert rule.apply(3) == "" # FizzBuzz のルールに該当しない場合 def test_number_rule(): rule = NumberRule() assert rule.apply(1) == "1" assert rule.apply(2) == "2" assert rule.apply(4) == "4"
from abc import ABC, abstractmethod from typing import List You, 6 日前 | 1 author (You) class Rule(ABC): @abstractmethod def apply(self, number: int) -> str: pass You, 6 日前 | 1 author (You) class FizzRule(Rule): def apply(self, number: int) -> str: if number % 3 == 0: return "Fizz" return ""
You, 6 日前 | 1 author (You) class NumberRule(Rule): def apply(self, number: int) -> str: return str(number) You, 6 日前 | 1 author (You) class FizzBuzzProcessor: def __init__(self, rules: List[Rule]): self.rules = rules def process(self, number: int) -> str: for rule in self.rules: result = rule.apply(number) if result: return result return ""
if __name__ == "__main__": processor = FizzBuzzProcessor([ FizzBuzzRule(), FizzRule(), BuzzRule(), NumberRule() ]) for i in range(1, 101): print(processor.process(i)) ⌘L to chat, ⌘K to generate