五月病ではなくて普通に免疫が落ちてるおかげで遅くなりましたが、 Software Design が発売されております。

特集の「ちゃんとオブジェクト指向できていますか?」で、ひときわ目を惹くのは、この中にRubyとPythonがないこと。「わかってねえなSD」というあなた、わかってないのはあなたです。

P. 57
PerlのOOPはバージョン5になって後付けされたもので、ある程度ユーザが手作りで実装しなければいけない独特なところがあります。しかし筆者は、この「普通の言語にこれとこれを加えるとOOPになっちゃったー」という感覚によって、かえってOOPの本質が理解できました。これが「生まれつきOOL」、「OOLで当然」「逆に言うとOOPしかできない」という言語では得られない面白い感覚だと思います。

これとまさに同様の指摘を、私も以前しています。

逆に、RubyからOOを全部かっぱいじゃったらどうなるか。

こんな感じ?

class Null
end
NULL = Null.new
NULL.freeze
verbose = $VERBOSE
$VERBOSE = nil
NULL.methods.each do |m|
  Null.class_eval { undef_method m }
end
$VERBOSE = verbose
Object.send :remove_const, :Null
def null() NULL end

if __FILE__ == $0
  puts "RUBY_VERSION = #{RUBY_VERSION}"
  def try
    p caller
    begin
      yield
    rescue => ex
      p ex
    end
  end
  try { p null }
  try { p +null }
  try { p !!null }
  try { p "#{null}" }
  try { p null.equal? null }
  try { p null.class }
  try { p null.methods }
  try { p Marshal.dump(null) }
  try {
    h = {:null => null}
    p h.keys
    p h
  }
  try {
    h = {null => :null}
    p h.values
    p h
  }
  try {
    def null.yes
      true
    end
    p null.yes
  }
end

データ(すなわちオブジェクト)どおしの比較すら出来なくなるのですね。

で、実は1.8以前と1.9以降で一つ重要な違いがあります。1.8以前では、!objobjにメッセージを送っていなかったのです。「真のオブジェクト指向言語」ではなかったのですね:-p

実のところ、言語ほど外から見ないとその特徴がわかりづらいものもそうはないと思います。

その意味で、本特集を最もよく読むべきなのは、Rubyistだと弾言しときましょう。

でもPythonがないのは残念だったな。PerlのOOの源流だっただけに。

あと、@query1000Perl Best PracticesモダンPerl入門を読み直すように。いくらPerlではなくオブジェクト指向が主題だとは言っても

use overload
  '""' => 'toString',
  '+'  => 'add',
;

はないわー。そこは

use overload
  '""' => \&toString,
  '+'  => \&add,
;

でしょうが。

熱がぶりかえしてきたんで、このあたりで。あとは@yusukebeが添削しといてくだしあ。

今後とも Software Design をよろしくお願いします。

Dan the Man with too Many Languages to Speak