#nseg 第7回「オブジェクト指向設計実践ガイド」読書会に参加しました

11/29にギークラボ長野で開催された、NSEGの「オブジェクト指向設計実践ガイド」読書会の第7回に参加しました。

ここ数回参加できていなかったので、今回参加できて良かったです。

nseg.connpass.com

今回は第7章を読みました。今回はモジュールの話でした。

第5,6章に関連するところもあり、その章について教えてもらいながら読み進めました。

今回Rubyに詳しい方がいらっしゃらなかったため、

  • method_missing
  • extend
  • 特異クラス

については、また後日識者の方にお尋ねしたいと思いました。

なお、週末には「ながのRubyの会 #1」が開催されます。 naruby.connpass.com

 
ところで、Rubyのモジュールで思い出したのは、PythonのMixinでした。

このページにもある通り、Djangoとかで見かけます。
Django Class-Based-View Inspector -- Classy CBV

 
たとえば、

mixin_example.py

class FooMixin:
    def hello(self):
        print('hello Foo')

    def call(self):
        print('call Foo')

class BarMixin:
    def hello(self):
        print('hello Bar')

    def call(self):
        print('call Bar')

class Baz(FooMixin, BarMixin):
    def hello(self):
        print('hello Baz')


if __name__ == '__main__':
    baz = Baz()
    baz.hello()
    baz.call()

と、

  • Mixinが2つ
  • Bazクラスは両方のMixinクラスを継承

というソースコードがあるとします。

 
この場合、実行してみると、

$ python mixin_example.py 
hello Baz
call Foo

のように、

  • クラスにメソッドがあれば、そのクラスのものを使う
  • Mixinしたクラスの両方にメソッドがあれば、Mixinの順番(左が優先)で使われる

となります*1

このあたりの話は以下が詳しく、参考になりました。
The History of Python.jp: メソッド解決順序(MRO)

*1:読書会の時はうろ覚えですみませんでした