質問: True chef.cut('meat', 5) # レベルがたりません chef.level += 10 chef.cut('meat', 5) # meatを5個に切断しました chef.show_foods() # {'meat': (2.0, 15)} ``` 皆さん多くの有用な回答をありがとうございました。 当初の質問「foodが切るかchefが切るか」について,food派の回答で最も納得のいく理由を説明してくださったLLmanさんをベストアンサーとさせていただきました。 (全員へ返信する時間がなかったのでLLmanさんへの返信欄に全員宛のお礼を書かせていただきました) 今回知ったことを実際のコーディングにも活かせていければと思っております。
回答: まさに私も同じ質問を昨晩からしたいと考えていたところだったので、すごいタイムリーで驚きました! 昨日読んでいたアジャイルソフトウェア開発の奥義という名著の中でも、employee.pay()のようなコードがあり、「支払うのは雇用者であるemployerであって、従業員であるemployeeじゃないだろ!」と1人でツッコミいれてました。 他にも先日見かけたコードでは、vendingMachine.buy()のようなコードがあり、「購入するのは自販機の利用者であって自販機じゃねーだろ!」と、腑に落ちないコードに悶々としていました。 個人的にはやはり、メソッドを持つオブジェクトが主語であった方が自然なので、vendingMachine.buy()よりはvendingMachine.transactのような動詞の方が自然だと感じますし、employee.pay()よりはemployee.getPaidの方が自然に感じます。 ただ、これだと単に命名の話ということになってしまうのですが、結局、どういった設計がより適しているかはケースバイケースなのでこうとしか言いようがありません。chiken自体に持たせるのであれば、やはり前述の通り、cutだと意味的に不自然感が半端ないので、chickenが保持する内部データの変化を表すような名前でメソッド名を考えてあげると良いのかなと思います。例えば、chicken.split()とか。これであれば、chef.serve("親子丼")というメソッドを実行した時にchefの内部で持つknifeクラスのcutメソッドが呼ばれて、さらにcutの対象であるchicken.split()が実行され〜〜〜のようなことで意味的にも自然だと思います。 先に挙げた例に戻ると、employee.pay()のような名前だと従業員が立て替えしておいたようにも解釈出来ますし、罰金でも支払わされたのかとも解釈出来てしまいます。混乱の元になると思うので、「〜された」ことをメソッドとするならば、やはり自然に意味が通る名前にすべきだと思います。 この質問、他の方の回答がすごい気になります!