Open zerebom opened 3 years ago
ソフトウェア開発・実務に寄ったEffective Pythonみたいな本。 https://amzn.to/33FoUxu
複数の関数で利用するデータ群は辞書でなくクラスで定義する
引数が多いクラスはdataclassを使う
def User: def __init__(self, username, email...): self.username = username self.email = email ...
from dataclasses import dataclass @dataclass class User: username:str email:str ...
別メソッドに値を渡すためだけに属性を設定しない 言い換えると、あるメソッドを呼び出す前に必ず呼び出すメソッドを作るなど、依存関係がある状態に設計しない。 @propertyを使うべき
propertyは外部からアクセスする可能性を排除した値で、 外部から参照、変更するにはgetter,setterからアクセスする必要がある。 別のメソッドで参照し、呼び出すことも可能。
インスタンスを作る関数をクラスメソッドにする
@dataclass class Product: id: int name: str @classmethod def retrieve(cld,id)->Product: data = hoge(id) return cls(data['id'],data['name'])
このようにすると、 ```python from models import Product product = Product.retrieve(1)
で簡単に値を持ったclsをimportできる classmethodの説明
utils.pyのような汎用的な名前は避ける データ、ビジネス上の仕様に依存しないもののみ格納する
ビジネスロジックをモジュールに分割する
テストに対象と同等の実装を書かない A = Aとなって、必ず通るテストになってしまう 入力と予測される出力値を用意して対象が出力値を正しく吐くかをテストする
一つのテストメソッドで1つの項目のみ確認する 文字列が0以上100以下のときのみTrueを返す関数をテストするなら、
テストケースは準備、実行、検証に分割する
ユニットテストをする観点から設計を洗練させる ユニットテストしやすいコードは良いコード
テストから外部環境の依存を排除しよう 外部リンクにアクセスする処理などは、responsesクラスなどでモックを使って用意する DoS攻撃の可能性、外部リンクの変更によるエラー、アクセスによる処理時間の増加などを抑えられる。
responses
テスト用データはテスト後に削除しよう ストレージに余計なデータを残さないようにする。 tempfileモジュールで用意できる
tempfile
テストケースごとにテストデータを用意する テストデータを複数テストで使い回すと思わぬエラーがでるので避ける
テストで確認する内容に関係するデータのみを製作する 何をテストしているかひと目で分かるようにする。 その他のデータはデフォルトにする
必要十分なテストデータを用意する 1万データを超えたら処理を変える関数のテストをする場合は、 1万という値を引数によって変更できるようにして、処理を軽くする。
テストの実行順序に依存しないテストを書く。 それぞれのテストは独立してるようにする。
戻り値がリストのテストは要素数もテストする
公式ドキュメントを読む
1度に実装する範囲を小さくする
基本的な機能だけ実装してレビューする
実装方針も相談する
開発アーキテクチャドキュメントを用意する
PRの差分にレビュアー向けの説明を書く
PRに不要な差分を持たせないようにする
レビュアはレビューの根拠を明示する
いきなり作り始めてはいけない 作る前にイメージを書き出して整理する必要がある。なぜなら、
作りたい価値から考える
100%の要件定義を目指さない 仕様をきめるとき、はじめから良い答えを求めすぎると失敗しやすい。 そのため、要件の確度を意識、明記しながら書く必要がある。 要件定義ドキュメントに作業要件の確度も同時に書くと良い。
文字だけで伝えず、画像や画面で伝える
モックアップは完成させる 作り込みすぎる必要はないが、システム設計に必要な部分は作成する
遷移、入力、表示に注目する
コアになる画面から書く
モックアップから実装までをイメージする
最小で実用できる部分から作る リーンスタートアップ参照
ストーリーが満たせるかレビューをする
ソフトウェア開発・実務に寄ったEffective Pythonみたいな本。 https://amzn.to/33FoUxu
Chpter1 コード実装
関数設計
クラス設計
複数の関数で利用するデータ群は辞書でなくクラスで定義する
メリット
デメリット
引数が多いクラスはdataclassを使う
Before
after
別メソッドに値を渡すためだけに属性を設定しない
言い換えると、あるメソッドを呼び出す前に必ず呼び出すメソッドを作るなど、依存関係がある状態に設計しない。
@propertyを使うべき
property
オブジェクトが持っているデータそのもの
propertyは外部からアクセスする可能性を排除した値で、
外部から参照、変更するにはgetter,setterからアクセスする必要がある。
別のメソッドで参照し、呼び出すことも可能。
インスタンスを作る関数をクラスメソッドにする
で簡単に値を持ったclsをimportできる
classmethodの説明
モジュール設計
utils.pyのような汎用的な名前は避ける データ、ビジネス上の仕様に依存しないもののみ格納する
ビジネスロジックをモジュールに分割する
ユニットテスト
テストに対象と同等の実装を書かない A = Aとなって、必ず通るテストになってしまう 入力と予測される出力値を用意して対象が出力値を正しく吐くかをテストする
一つのテストメソッドで1つの項目のみ確認する 文字列が0以上100以下のときのみTrueを返す関数をテストするなら、
テストケースは準備、実行、検証に分割する
ユニットテストをする観点から設計を洗練させる ユニットテストしやすいコードは良いコード
良いコードはテスト時にデータの準備が簡単にできるので、書き直しもラク。
テストから外部環境の依存を排除しよう 外部リンクにアクセスする処理などは、
responses
クラスなどでモックを使って用意する DoS攻撃の可能性、外部リンクの変更によるエラー、アクセスによる処理時間の増加などを抑えられる。テスト用データはテスト後に削除しよう ストレージに余計なデータを残さないようにする。
tempfile
モジュールで用意できるテストケースごとにテストデータを用意する テストデータを複数テストで使い回すと思わぬエラーがでるので避ける
テストで確認する内容に関係するデータのみを製作する 何をテストしているかひと目で分かるようにする。
その他のデータはデフォルトにする
必要十分なテストデータを用意する 1万データを超えたら処理を変える関数のテストをする場合は、
1万という値を引数によって変更できるようにして、処理を軽くする。
テストの実行順序に依存しないテストを書く。 それぞれのテストは独立してるようにする。
戻り値がリストのテストは要素数もテストする
実装の進め方
公式ドキュメントを読む
1度に実装する範囲を小さくする
基本的な機能だけ実装してレビューする
実装方針も相談する
開発アーキテクチャドキュメントを用意する
レビュー
PRの差分にレビュアー向けの説明を書く
PRに不要な差分を持たせないようにする
レビュアはレビューの根拠を明示する
モデル設計
エラー設計
システム設計
やることの明確化
いきなり作り始めてはいけない
作る前にイメージを書き出して整理する必要がある。なぜなら、
上記のことをやるためにはエディタを開かないことが肝要
作りたい価値から考える
100%の要件定義を目指さない
仕様をきめるとき、はじめから良い答えを求めすぎると失敗しやすい。
そのため、要件の確度を意識、明記しながら書く必要がある。
要件定義ドキュメントに作業要件の確度も同時に書くと良い。
画面モックを作る
文字だけで伝えず、画像や画面で伝える
モックアップは完成させる
作り込みすぎる必要はないが、システム設計に必要な部分は作成する
遷移、入力、表示に注目する
コアになる画面から書く
モックアップから実装までをイメージする
最小で実用できる部分から作る リーンスタートアップ参照
ストーリーが満たせるかレビューをする