2013年11月16日土曜日

開発環境

『初めてのJavaScript 第2版』(シェリー・パワーズ著(Shelley Powers著)、武舎 広幸+武舎 るみ訳、オライリージャパン、2009年、ISBN978-4-87311-425-5) の13章(カスタムオブジェクトと例外の処理)、練習問第13-1、13-2、13-3、13-5.をDartで解いてみる。

その他参考書籍

練習問第13-1、13-2、13-3、13-5.

コード

sample.dart

import 'dart:html';

void main(){
  var run = querySelector('#run'),
      clear = querySelector('#clear'),
      pre0 = querySelector('#pre0');
  run.onClick.listen((MouseEvent event){
    var result = window.navigator.userAgent + '\n';
    MyClass c = new MyClass();
    Element d0 = querySelector('#d0');
    Element d1 = querySelector('#d1');
    InputElement button = new InputElement();
    button.type = 'button';
    result += '1.\n';
    var i;
    for (i = 0; i < 10; i += 1){
      result += 'tripler($i) -> ${tripler(i)}\n';
    }
    for (i = 0.5; i < 10.5; i += 1){
      result += 'tripler($i) -> ${tripler(i)}\n';
    }
    result += '3. (dart2jsでjavascriptに変換した場合、関数の定義で型を指定して、それ以外の型を渡してもエラーにならないみたい。)\n';
    result += '引数は共に(num n)で、fはthrow文無し、gはifとthrow文有り。\n';
    result += 'f(num n)\n';
    [1, 'a', [1,2], () => null, {'a':1, 'b':2}].forEach((item){
      try{
        result += '${f(item)}\n';
      } catch (e){
        result += '$e: ${item}\n';
      }
    });
    result += 'g(num n)\n';
    [1, 'a', [1,2], () => null, {'a':1, 'b':2}].forEach((item){
      try{
        result += '${g(item)}\n';
      } catch (e){
        result += '$e: ${item}\n';
      }
    });
    result += '引数を2つ以上渡した場合\n';
    try{
      result += '${f(1, 2)}\n';
    } catch (e){
      result += '$e\n';
    }
    d0.innerHtml = '';
    d0.text = '5.';
    d0.append(button);
    button.value = '現在の状態: ${c.getState()}';
    button.onClick.listen((MouseEvent event){
      c.changeState();
      button.value = '現在の状態: ${c.getState()}';
      d1.style.backgroundColor = c.getColor();
    });
    pre0.text = result;
  });
  clear.onClick.listen((MouseEvent event) => pre0.text = '');
}

num tripler(num n){
  return 3 * n;
}

String f(num n){
  return 'エラー発生無し: f($n)';
}
String g(num n){
  if (n.runtimeType != int && n.runtimeType != double){
    throw '引数には数値(num(int, double))を指定して下さい。$n';
  }
  return 'エラー発生無し: f($n)';
}

class MyClass{
  // Dartでは、ライブラリーごとにデータの隠蔽
  // 先頭が下線の変数が隠蔽される。
  // 今回は同じライブラリー上なので、隠蔽はされない。
  // とりあえず学習目的で、データメンバーの隠蔽とそれにアクセスするパブリックメソッドの定義
  String _state = 'on';
  String _background = '#fff';
  void changeState(){
    if (_state == 'on'){
      _state = 'off';
      _background = '#000';
    } else {
      _state = 'on';
      _background = '#fff';
    }
  }
  String getState() => _state;
  String getColor() => _background;
}

0 コメント:

コメントを投稿