五月病ではなくて普通に免疫が落ちてるおかげで遅くなりましたが、 Software Design が発売されております。
特集の「ちゃんとオブジェクト指向できていますか?」で、ひときわ目を惹くのは、この中にRubyとPythonがないこと。「わかってねえなSD」というあなた、わかってないのはあなたです。
P. 57Perlの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以前では、!obj
はobj
にメッセージを送っていなかったのです。「真のオブジェクト指向言語」ではなかったのですね:-p
実のところ、言語ほど外から見ないとその特徴がわかりづらいものもそうはないと思います。
その意味で、本特集を最もよく読むべきなのは、Rubyistだと弾言しときましょう。
でもPythonがないのは残念だったな。PerlのOOの源流だっただけに。
あと、@query1000はPerl Best PracticesとモダンPerl入門を読み直すように。いくらPerlではなくオブジェクト指向が主題だとは言っても
use overload '""' => 'toString', '+' => 'add', ;
はないわー。そこは
use overload '""' => \&toString, '+' => \&add, ;
でしょうが。
熱がぶりかえしてきたんで、このあたりで。あとは@yusukebeが添削しといてくだしあ。
今後とも Software Design をよろしくお願いします。
Dan the Man with too Many Languages to Speak
このブログにコメントするにはログインが必要です。
さんログアウト
この記事には許可ユーザしかコメントができません。