今回はプログラムのモジュール化です。 『計算物理学入門』で扱われている True BASIC のモジュール化機能はサブルーチンと関数ですが、Groovy で対応するのは Java と同じくメソッドです。
True BASIC
まずは True BASIC のコード。PROGRAM tasks ! サブルーチンの使用例 ! 変数がどのように受け渡されるかに注目 CALL initial(x, y) ! 変数の初期化 CALL add(x, y, sum) ! 2つの変数の和 CALL multiply(x, y, product) PRINT "sum ="; sum, "product ="; product END ! 主プログラムの終了 SUB initial(x, y) INPUT x INPUT y END SUB SUB add(x, y, sum) LET sum = x + y END SUB SUB multiply(x, y, product) LET product = x * y END SUB
True BASIC でサブルーチンに変数を渡すと、その変数の参照(Java でいうところの)が渡されます。 したがって、サブルーチン内で変数の値を変更すると、それはサブルーチンの呼び出しもとにも影響を及ぼします。
Groovy
では Groovy でのコード。 Groovy では基本的にはプリミティブ型がなくすべてがオブジェクトなので、数値の受け渡しも True BASIC 同様(Java のプリミティブ型とは違って)すべて参照で行われます。 ただし、True BASIC と異なるのは、Groovy では(というか、Java では)数値が immutable (不変)オブジェクトであることです。 immutable オブジェクトとは、一度インスタンスを生成するとその内容が変更できないオブジェクトのことで、和や積の演算をすると結果の数値は全て別のオブジェクトとして生成されます*1。したがって、上記の True BASIC のようなコードは Groovy では実現できなくて、代わりに、演算結果をメソッドの返り値にして、それを呼び出し側で変数に代入する必要があります。
def (x, y) = initial() def sum = add(x, y) def product = multiply(x, y) println "sum = $sum, product = $product" def initial(){ def scan = new Scanner(System.in) double x = scan.nextDouble() double y = scan.nextDouble() return [x, y] } def add(x, y){ return x + y } def multiply(x, y){ return x * y }
- Groovy では、メソッドは「def」キーワードによって定義できます。 また返り値の型は「double add(x, y){ ... }」のように宣言することもできます。 この場合、def キーワードはあってもなくても構いません。
- 1行目は変数 x, y を宣言し、initial() メソッドの返り値の List に入っている要素を順番に x, y に代入しています。
- 作者: 関谷和愛,上原潤二,須江信洋,中野靖治
- 出版社/メーカー: 技術評論社
- 発売日: 2011/07/06
- メディア: 単行本(ソフトカバー)
- 購入: 6人 クリック: 392回
- この商品を含むブログ (155件) を見る
- 作者: ハーベイゴールド,ジャントボチニク,Harvey Gould,Jan Tobochnik,鈴木増雄,石川正勝,溜渕継博,宮島佐介
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2000/12
- メディア: 単行本
- 購入: 1人 クリック: 28回
- この商品を含むブログ (45件) を見る