2014-04-02

ruby でトップレベルにコードを書かないスタイルを「インスタンスって何」と思ってしまう Fortran 使いに説明するの巻

毎年4月になるとなんかこういうことをしているので、なんとか経験を洗練したいものです。

要はこう言うと楽なのではと思いましたよ。

  • クラスというのはFortranのモジュールみたいなものです。使い始めに任意のサブルーチンじゃなくてnewを呼ばなければいけな いので、変数の初期化を普通はinitialize内でやります。
  • インスタンス変数(@name)というのはFortranのモジュール変数です。
  • インスタンスとは何かというのは、今はわからなくてもいいです。1クラスを同時に複数個newできて、その時インスタンスが複数ある という言い方をします。クラスにはコードが所属しますが、インスタンスにはデータが所属します。
  • クラス変数(@@name)というのは複数インスタンスがあるときに共有される変数です。私はほとんど使いません。
  • グローバル変数($name)というのはFortranのコモンブロックです。覚悟をもって使用してください。
ぼくは数行を超えるプログラムはほとんどこういう感じのテンプレートで書きはじめるようにしているんです。

  class App
    def initialize argv
      # 初期値設定
        @files = []
        for arg in argv   
          case arg
          when /\A-d\z/ then $DEBUG = true  
          # その他オプション処理  
          else @files.push arg 
          end 
        end
      end
      def run
        for file in @files
          File.open(file, 'r') {|fp|  fp.each{|line|  ... }}  
        end 
      end
    end
    App.new(ARGV).run if $0 == __FILE__
  
で、Ruby初めてでトップレベルで Hello World から入った人がこれをいきなり見ると「うっ」となるわけですね。悩んだ挙句「インスタンス(変数)ってなんですか」みたいに聞かれて、素直にインスタンスから説明すると時間を無駄にするんですわ。この2014年にもなってOOPを全く知らないなんて、と読者諸兄は思われるかもしれないけど、気象界は世間と隔絶したところなんで、プログラミングセンスがあってもOOPを全く知らないなんてことが平気で起こるのです。何か方便が必要で しょうと。

なんでトップレベルで書かないかというとその心は、複数メソッドが現れるならば、最初からその間で共有されるデータのスコープ管理をしておかない といけないということであって、それってFortranのモジュールでできたことと同じなんですよね。だからモジュールでたとえてしまえばいいの ではないかと。

0 件のコメント:

コメントを投稿