# ミノ駆動本_読書py[7] みんなのメモ ###### tags: `ミノ駆動本` - このメモはWebに公開されています(HackMDチーム) - リンクを知っている人は見られます - HackMDにログインして編集できます7 ## お願い事項 https://twitter.com/MinoDriven/status/1541334416622256130 > 【お願い】 拙著『良いコード/悪いコードで学ぶ設計入門』に関する情報発信について。 ブログ等で発信の際は、引用の範囲を超え、著作権侵害となる場合は勿論のこと、 拙著の詳細内容が分かるような表現での公開はお控え頂けると助かります。 ご感想や拙著に基づく試行錯誤は歓迎です。 #ミノ駆動本 とミノ駆動さんが仰られていますので、勉強会そのものでも詳細内容がわかる記述はしないように気をつけていきましょう。 ## このメモについて このメモは ミノ駆動本_読書py[7] のメモです https://pythonista-books.connpass.com/event/250267/ 読む範囲: 5章 ミノ駆動本のサポートページより、Javaのサンプルコードが見られます。 https://gihyo.jp/book/2022/978-4-297-12783-1/support ## 読書会の流れ * 19:30〜20:00 **自由参加**のもくもく会(個人作業) - 事前に読む時間がとれなかった方はここで読んじゃいましょう(ざっとで大丈夫です) - 合わせて、この**HackMD**に話したいことを各自書いてください - ログインすれば書ける設定にしています - ここがわからん、ここはわかった お気軽に書き込んでみてください - HackMDの書き込みに投票し、みんなが気になるところをわいわい読み解いていきます * 20:00〜21:30 読書会本編(みんなでわいわい) * Discordでスライド共有して別途案内します * 20:00開始の本編では、「わたしこれ気になる!」 という話題に `:+1:` と書いて投票します。 * :+1: する上限はありません。 気になる話題に全部 :+1: しちゃいましょう。 ただし1つの話題には1個だけ:+1:でお願いします * 票数が多い話題から話していきます。 ### 5 低凝集 ―バラバラになったモノたち― #### 5.1 staticメソッドの誤用 - > 凝集度 - ここのstaticメソッド、Pythonではクラスメソッド(とスタティックメソッド)しかないクラスで発生する可能性があります - =インスタンスメソッドがないクラス - モジュール(hogehoge.py)に関数を並べているのとあんまり変わらないように思えます:+1::+1: - - ```python class A: CLASS_VAR = 42 @classmethod def awesome(cls): cls.inner() @classmethod def inner(cls): pass @classmethod def fabulous(cls): # clsを一切使わないなら、実態はstaticメソッド pass def instance_method(self): pass @staticmethod def static(): pass A.awesome() A.fabulous() ``` ```python def awesome(): inner() def inner(): pass def fabulous(): pass ``` #### 5.2 初期化ロジックの分散 - ファクトリメソッド、工場、つまり作り方を知っているメソッド!(エヴァンス本) - あ〜、、、使い手に委ねる(他の箇所のソースを見て実装せよとなっている)のではなくって、使い手が間違えないよう(例えば適切な引数を渡すだけでちゃんと使えるようになる)みたいな作りが大事かなと思っていたところにちょっと響いた :+1: :+1: - #### 5.3 共通処理クラス(Common・Util) - これ、あるあるなんだろうなぁと思った - 「どこに置けば良いんだろう?」というものを、この辺りでしょうと置くのは体感的によくわかる・・・:+1: - そして前職で最初に書いたコード、良かれとこういうふうにしていたな・・・ ちなみに名前はfunctions.phpだった気がする・・・ - staticメソッドとするくらいなら重複した方が良い(リスト5.10)?そもそもそうなるようならクラス構造を見直すきっかけとすべき? - 合わせて読みたい:https://jisou-programmer.beproud.jp/%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E8%A8%AD%E8%A8%88/16-utils.py%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E6%B1%8E%E7%94%A8%E7%9A%84%E3%81%AA%E5%90%8D%E5%89%8D%E3%82%92%E9%81%BF%E3%81%91%E3%82%8B.html:+1::+1: - #### 5.4 結果を返すために引数を使わないこと - Pythonでもあるあるかな?と思ったのですがどうでしょう? - https://qiita.com/Yumihiki/items/ddac93a87c47bf373ae7 - 引数に入れたリスト、値を書き換えちゃう問題で意図せずバグを埋め込んだことが・・・(動作確認で気がついた) - 下に例を書きましたー:+1::+1::+1: - ミュータブルなオブジェクトなので変更できる - ```python >>> l = [{"name": "apple"}, {"name": "banana"}] >>> def add_price(l): # lが出力引数 ... for d in l: ... d["price"] = 100 ... >>> add_price(l) >>> l [{'name': 'apple', 'price': 100}, {'name': 'banana', 'price': 100}] ``` #### Column C#のoutキーワード - 金額など計算した結果をoutキーワードで取得しているケースが多い。 - しかもプリミティブ型で戻ってくるため、取得した後に妥当性チェックを外で行ったりもしている。 - - - #### 5.5 多すぎる引数 - 何個くらいまでが良いよね、みたいな指標って何かの本に載ってたりしたような・・・??? 5〜7つくらいまで?? - 「Clean Code」P71 :関数の引数は理想的には0です。(中略)3つの引数はできれば避けるべきです。4つ以上とするのはよほどの理由がなければやめるべきです。:+1::+1::+1: - この章で語られている内容、「適切な値オブジェクト」を作ろう、っていう話かなと改めて思いました - 多すぎる引数の例:https://pycaret.readthedocs.io/en/stable/api/classification.html#pycaret.classification.setup - Pythonはプリミティブ型執着しやすい印象(辞書やリストが便利なので):+1::+1: - #### 5.6 メソッドチェイン - self.hoge.huga くらいなら大丈夫かなと思いつつ、self.hoge.huga.hogegoge とかになると追いにくそうな気がするので2つ、3つくらいまでかなぁ - EAFP Styleを思い出した - https://docs.python.org/ja/3/glossary.html#term-EAFP - -
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up