2011年1月14日金曜日

XcodeでMacRuby・4日目 電卓を作る

やはりちょっと面白くなってcocoaについていろいろ調べる。

Butinekoの世界 iPhone SDKの開発に入る前に読んでおきたい日本語の資料(開発ツール編)

経由で知りました。HDMTの木下誠氏によるアップルのcocoaセミナーの資料。ダウンロードはここから。

Documentation 日本語に翻訳されたドキュメントです。

とりあえず今回は「初級編」の資料をじっくり読んでみた。まあObjective-Cのソースは見慣れない記号が多くて([]とか-とか@とかがどうしてここにある?という感じで)私には読みづらいわけですが基本はCなので、簡単なものならなんとかついていける。

で・・・この電卓のサンプルをMacRubyで書きなおせばいいんじゃないの?と考えました。それができるなら、楽しいだろう、と。

しかしソースを読むと、のっけから
- (id)init {
    Calculator/CalcController.m
    self = [super init]; if (self) {
        value = 0; operation = OpNone; numberEntering = YES;
    } return self;
}
ってrubyのclassのinitなんか書いたことないぜ、というレベルなので非常に不安になる。(はいはい、その程度ですよ私は)ただ、MacRubyにはサンプルがたくさん用意されているので、そちらで多少調べてみると、こんなふうに書きなおせばいいらしい。

def init
 super
 @value=0
 @operation=OpNone
 @numberEntering = true
 
 self
end

「super」って何?(ボソッ)
ま、とりあえずこれで大丈夫みたい。(^^;)わからないことは後でゆっくり調べよう。思いついたことを実行にうつすときはスピードも大事なので、やれそうだ、という時はさっさと作業したほうがいい。

で、リソースもセミナー資料の通りに作って、アウトレットとアクションの接続をするために骨組みだけソースを作ったのが下の画像。


ちょっと資料に比べると電卓君がかっちょ悪い感じがする。センス無いからなあ。で、あとはアクションにあたるdefを地道に移し替えていく。
できあがったソースがこうなりました。

class CalcController < NSWindowController
attr_accessor :textField
OpNone=0
OpPlus=1
OpMinus=2
OpTIme=3
OpDivid=4

def init
 super
 @value=0
 @operation=OpNone
 @numberEntering = true
 
 self
end

 def clear(sender)
  textField.setStringValue("0")
  @value=0
  @numberEntering = false
 end

 def divide(sender)
  self.calculate
  @operation=OpDivid
  @numberEntering=false
 end

 def equal(sender)
  self.calculate
  @operation=OpNone
  @numberEntering=false
 end

 def minus(sender)
  self.calculate
  @operation=OpMinus
  @numberEntering=false
 end

 def number(sender)
  s_number=sender.title
  old_number=textField.stringValue
  if @numberEntering
   new_number=old_number+s_number
  else
   new_number=s_number
  end
  textField.setStringValue(new_number)
  
  @numberEntering=true
 end

 def plus(sender)
  self.calculate
  @operation=OpPlus
  @numberEntering=false
 end
 
 def time(sender)
  self.calculate
  @operation=OpTIme
  @numberEntering=false
 end

 def calculate
  enterValue=textField.stringValue.to_i
  
  case @operation
  when OpNone then
   @value= enterValue
  
  when OpPlus then
   @value += enterValue
  
  when OpMinus then
   @value -=enterValue
  
  when OpTIme then
   @value *= enterValue
  
  when OpDivid then
   @value /= enterValue
   
  end
  textField.setStringValue @value.to_s
 end
end

うーん、Objective-Cより短く書けてるかも。 ちゃんと意図したとおりに動きます。かなり打ち間違えたところがあって、相変わらず時間がかかっております。 一番自分でも笑っちゃったのが
class CalcController < NSWindowController
の「<」を「>」って入力してたことですね。呆れました、さすがに。こんなひどい間違いをしてもXcodeの「ビルド」では文句を言われません。実行したら「コード1で終了」という見慣れたエラーがでるので、あとはターミナルから直接実行してみて、MacRubyが何と言って怒っているかを確かめる、というなかなか泣けるdebug環境です。こういう時こそtestなんでしょうねえ。でもいっぺんに勉強する時間がないぞ。

こうやって、Objective-CのソースをMacRubyで書き換えていくという作業、自分にはとっても勉強になります。しばらくこれでいけそうかも。なにより、rubyの書き方の勉強にすごーくなってます。実際に動くコードを作れるのもうれしいし。XcodeやInterfaceBuilderにも慣れてきたし。InterfaceBuilderの挙動はMacらしく、洗練されてますね。VisualStudioの似たような機能とは大分ちがうような気がする。(いや、かなり昔ですからね、VS使ってたの)

5日目もあるかもしれません。

0 件のコメント:

コメントを投稿