@kotyのブログ

.NETとかJavaとかPythonとか勉強会のこととかを、田舎者SEがつづります。記事のライセンスは"CC BY"でお願いします。

第2回 オブジェクト指向設計実践ガイド 読書会 記録

nseg.connpass.com

読書会常連の @tmtms さんが今回は不在でrubyを教えてくれる人がいなくて困ったな〜と思っていたら、rubyを知っている方が3人も来てくれてとっても助かりました。

外部からの参加者が5名、ギーラボ関係者が5名と最近になく賑やかな読書会になりました。全員がちょうど一度づつ読めたのも良かったです。 今回はrubyの文法についての質問が多めでしたが、rubyを知っている人にとってはrubyの文法理解に時間が多く取られるのはあまり良くないな〜と思いました。徐々に慣れるとは思うので、次回以降もrubyist諸氏におかれては今日に懲りずにご参加いただきたいです。

書籍内に出てくるコードはこちらで参照できます。 github.com

以下、普段pythonを書いている人間からの所感をいくつか。

getter/setterについて

attr_readerを使ってフィールドを隠蔽する、という話がありました。

pythonだとプロパティとフィールドのアクセス方法が同じなので、後からプロパティにもできます。

class Gear
  attr_reader :chainring, :cog
  def initialize(chainring, cog)
    @chainring = chainring
    @cog       = cog
  end

  def ratio
    chainring / cog.to_f
  end
end

は、プロパティを介さない場合は

class Gear(object):
  def __init__(self, chainring, cog):
    self.chainring = chainring
    self.cog       = cog

  def ratio(self):
    return self.chainring / self.cog

となります。これをプロパティを介すように直すと

class Gear(object):
  _chainring = None
  _cog = None

  @property
  def chainring(self):
    return self._chainring
  @chainring.setter
  def chainring(self, value):
    self._chainring = value

  @property
  def cog(self):
    return self._cog
  @cog.setter
  def cog(self, value):
    self._cog = value

  def __init__(self, chainring, cog):
    self.chainring = chainring
    self.cog       = cog

  def ratio(self):
    return self.chainring / self.cog

となる。う~ん、ちょっと記述量は多くなりますが、、、言いたいのはchainringおよびcogフィールドを使っている__init__ratioメソッドに変更が無いこと。なので後からプロパティ化することも割と手軽にできます。

配列操作について

  def diameters
    wheels.collect {|wheel| diameter(wheel)}
  end

は、pythonだと普通は内包表記で書きます。

  def diameters(self):
    return [diameter(wheel) for wheel in self.wheels]

ruby は最後に評価された値が戻り値になるそうです。これはこれで便利かも。

次回も楽しみです。

nseg.connpass.com