はじめに
ここのところScalaの記事が続いていますが、この記事もScala関連になります。
前の記事で、Scalaで複素数を扱うためのオブジェクト及びクラス(以下、単に「クラス等」と書きます。)を書きましたが、これだけだとせっかく書いたクラスを動かすことはできません。
ソフトウェア開発とかソフトウェア工学的には、次のステップとしてナウなヤングにバカうけな一般的なのは「テストコードを書く」ということになるんですけど、本サイトの管理人はどちらかというと早く計算結果だけが知りたい派なので、テストコードの件はいったん脇に置いておくことにします。
そこで、この記事ではEclipseのScalaプロジェクトでmainメソッドを持ったクラスを定義して計算結果を確認する方法について書いていきます。
EclipseのScalaプロジェクトへのオブジェクトの追加
前の記事の「コードを書くための準備」の手順4あたり以降の手順を用いると、main関数を追加するためのオブジェクトを作成できます。
この記事では、下図のように”ComplexNumberMain”オブジェクトを作成したものと仮定します。
main関数をサクサクと(?)書きます。
前項で作ったオブジェクトにmain関数を書いていきます。以下のようなmain関数を書いてみました。かなり長いです。
package info.pandanote.test | |
// Scalaで複素数を扱うためのテスト用のコード例です。 | |
// このコードは無保証であり、使用したことよって得られる結果については一切保証いたしません。 | |
// 詳細は以下のURLを参照いただけると幸いです。 | |
// https://pandanote.info/?p=1849 | |
object ComplexNumberTest { | |
def main(args: Array[String]): Unit = { | |
val a = ComplexNumber(-2,4) | |
val b = ComplexNumber(-3,3) | |
val c = ComplexNumber(5,0) | |
val d = ComplexNumber(9,-4) | |
val e = ComplexNumber(4,-1) | |
val f = -3.000428692900978 | |
val g = 10 | |
val aa = ComplexNumber(2,1) | |
val ab = ComplexNumber(3,-3) | |
val ac = ComplexNumber(4,5) | |
val ad = ComplexNumber.one | |
// toString() | |
println("--- toString() ---") | |
println("a="+a.toString) | |
println("b="+b.toString) | |
println("c="+c.toString) | |
println("d="+d.toString) | |
println("e="+e.toString) | |
println("aa="+aa.toString) | |
println("ab="+ab.toString) | |
println("ac="+ac.toString) | |
println("ad="+ad.toString) | |
println(ComplexNumber.one) | |
println(ComplexNumber.zero) | |
// re() | |
println("--- re() ---") | |
println("Re(a) = "+a.re.toString) | |
println("Re(b) = "+b.re.toString) | |
println("Re(c) = "+c.re.toString) | |
println("Re(d) = "+d.re.toString) | |
println("Re(e) = "+e.re.toString) | |
println("Re(aa) = "+aa.re.toString) | |
println("Re(ab) = "+ab.re.toString) | |
println("Re(ac) = "+ac.re.toString) | |
println("Re(ad) = "+ad.re.toString) | |
println("Re(ComplexNumber.one) = "+ComplexNumber.one.re.toString) | |
// im() | |
println("--- im() ---") | |
println("Im(a) = "+a.im.toString) | |
println("Im(b) = "+b.im.toString) | |
println("Im(c) = "+c.im.toString) | |
println("Im(d) = "+d.im.toString) | |
println("Im(e) = "+e.im.toString) | |
println("Im(aa) = "+aa.im.toString) | |
println("Im(ab) = "+ab.im.toString) | |
println("Im(ac) = "+ac.im.toString) | |
println("Im(ad) = "+ad.im.toString) | |
println("Im(ComplexNumber.imaginaryUnit) = "+ComplexNumber.imaginaryUnit.im.toString) | |
// +(that: ComplexNumber) | |
println("--- +(that: ComplexNumber) ---") | |
println("a + b = "+(a + b).toString) | |
println("b + c = "+(b + c).toString) | |
println("c + d = "+(c + d).toString) | |
println("d + e = "+(d + e).toString) | |
println("aa + 1 = "+(aa+ComplexNumber.one).toString) | |
// +(that: Int) | |
println("--- +(that: Int) ---") | |
println("a + 2 = "+(a + 2).toString) | |
println("b + 3 = "+(b + 3).toString) | |
println("c + 4 = "+(c + 4).toString) | |
println("d + 5 = "+(d + 5).toString) | |
println("e + 6 = "+(d + 6).toString) | |
// +(that: Long) | |
println("--- +(that: Long) ---") | |
println("a + 2L = "+(a + 2L).toString) | |
println("b + 4L = "+(b + 4L).toString) | |
println("c + 8L = "+(c + 8L).toString) | |
println("d + 16L = "+(d + 16L).toString) | |
println("e + 32L = "+(e + 32L).toString) | |
// +(that: Float) | |
println("--- +(that: Float) ---") | |
println("a + 0.1f = "+(a + 0.1f).toString) | |
println("b + 0.2f = "+(b + 0.2f).toString) | |
println("c + 0.3f = "+(c + 0.3f).toString) | |
println("d + 0.4f = "+(d + 0.4f).toString) | |
println("e + 0.5f = "+(e + 0.5f).toString) | |
// +(that: Double) | |
println("--- +(that: Double) ---") | |
println("a + 0.3 = "+(a + 0.3).toString) | |
println("b + 0.6 = "+(b + 0.6).toString) | |
println("c + 0.9 = "+(c + 0.9).toString) | |
println("d + 1.2 = "+(d + 1.2).toString) | |
println("e + 1.5 = "+(e + 1.5).toString) | |
// -(that: ComplexNumber) | |
println("--- -(that: ComplexNumber) ---") | |
println("a - b = "+(a - b).toString) | |
println("b - c = "+(b - c).toString) | |
println("c - d = "+(c - d).toString) | |
println("d - e = "+(d - e).toString) | |
println("aa - ab = "+(aa - ab).toString) | |
// -(that: Int) | |
println("--- -(that: Int) ---") | |
println("a - 2 = "+(a - 2).toString) | |
println("b - 3 = "+(b - 3).toString) | |
println("c - 4 = "+(c - 4).toString) | |
println("d - 5 = "+(d - 5).toString) | |
println("e - 6 = "+(e - 6).toString) | |
// -(that: Long) | |
println("--- -(that: Long) ---") | |
println("a - 1L = "+(a - 1L).toString) | |
println("b - 2L = "+(b - 2L).toString) | |
println("c - 4L = "+(c - 4L).toString) | |
println("d - 8L = "+(d - 8L).toString) | |
println("e - 16L = "+(e - 16L).toString) | |
// -(that: Float) | |
println("--- -(that: Float) ---") | |
println("a - 0.1f = "+(a - 0.1f).toString) | |
println("b - 0.2f = "+(b - 0.2f).toString) | |
println("c - 0.3f = "+(c - 0.3f).toString) | |
println("d - 0.4f = "+(d - 0.4f).toString) | |
println("e - 0.5f = "+(e - 0.5f).toString) | |
// -(that: Double) | |
println("--- -(that: Double) ---") | |
println("a - 0.3 = "+(a - 0.3).toString) | |
println("b - 0.6 = "+(b - 0.6).toString) | |
println("c - 0.9 = "+(c - 0.9).toString) | |
println("d - 1.2 = "+(d - 1.2).toString) | |
println("e - 1.5 = "+(e - 1.5).toString) | |
// *(that: ComplexNumber) | |
println("--- *(that: ComplexNumber) ---") | |
println("a * b = "+(a * b).toString) | |
println("b * c = "+(b * c).toString) | |
println("c * d = "+(c * d).toString) | |
println("d * e = "+(d * e).toString) | |
println("aa * ac = "+(aa*ac).toString) | |
// *(that: Int) | |
println("--- *(that: Int) ---") | |
println("a * 2 = "+(a * 2).toString) | |
println("b * 3 = "+(b * 3).toString) | |
println("c * 4 = "+(c * 4).toString) | |
println("d * 5 = "+(d * 5).toString) | |
println("e * 6 = "+(e * 6).toString) | |
// *(that: Long) | |
println("--- *(that: Long) ---") | |
println("a * 7L = "+(a * 7L).toString) | |
println("b * 8L = "+(b * 8L).toString) | |
println("c * 9L = "+(c * 9L).toString) | |
println("d * 10L = "+(d * 10L).toString) | |
println("e * 11L = "+(e * 11L).toString) | |
// *(that: Float) | |
println("--- *(that: Float) ---") | |
println("a * 0.2f = "+(a * 0.2f).toString) | |
println("b * 0.3f = "+(b * 0.3f).toString) | |
println("c * 0.4f = "+(c * 0.4f).toString) | |
println("d * 0.5f = "+(d * 0.5f).toString) | |
println("e * 0.6f = "+(e * 0.6f).toString) | |
// *(that: Double) | |
println("--- *(that: Double) ---") | |
println("a * 0.2 = "+(a * 0.2).toString) | |
println("b * 0.3 = "+(b * 0.3).toString) | |
println("c * 0.4 = "+(c * 0.4).toString) | |
println("d * 0.5 = "+(d * 0.5).toString) | |
println("e * 0.6 = "+(e * 0.6).toString) | |
// /(that: ComplexNumber) | |
println("--- /(that: ComplexNumber) ---") | |
println("a / b = "+(a / b).toString) | |
println("b / c = "+(b / c).toString) | |
println("c / d = "+(c / d).toString) | |
println("d / e = "+(d / e).toString) | |
println("aa / ab = "+(aa/ab).toString) | |
// /(that: Int) | |
println("--- /(that: Int) ---") | |
println("a / 2 = "+(a / 2).toString) | |
println("b / 3 = "+(b / 3).toString) | |
println("c / 4 = "+(c / 4).toString) | |
println("d / 5 = "+(d / 5).toString) | |
println("e / 6 = "+(e / 6).toString) | |
println("ab / 4 = "+(ab / 4).toString) | |
// /(that: Long) | |
println("--- /(that: Long) ---") | |
println("a / 6L = "+(a / 6L).toString) | |
println("b / 5L = "+(b / 5L).toString) | |
println("c / 4L = "+(c / 4L).toString) | |
println("d / 3L = "+(d / 3L).toString) | |
println("e / 2L = "+(e / 2L).toString) | |
// /(that: Float) | |
println("--- /(that: Float) ---") | |
println("a / 0.5f = "+(a / 0.5f).toString) | |
println("b / 0.6f = "+(b / 0.6f).toString) | |
println("c / 0.7f = "+(c / 0.7f).toString) | |
println("d / 0.8f = "+(d / 0.8f).toString) | |
println("e / 0.9f = "+(e / 0.9f).toString) | |
// /(that: Double) | |
println("--- /(that: Double) ---") | |
println("a / 1.1 = "+(a / 1.1).toString) | |
println("b / 1.2 = "+(b / 1.2).toString) | |
println("c / 1.3 = "+(c / 1.3).toString) | |
println("d / 1.4 = "+(d / 1.4).toString) | |
println("e / 1.5 = "+(e / 1.5).toString) | |
// %(that: ComplexNumber) | |
println("--- %(that: ComplexNumber) ---") | |
println("a % b = "+(a % b).toString) | |
println("b % c = "+(b % c).toString) | |
println("c % d = "+(c % d).toString) | |
println("d % e = "+(d % e).toString) | |
// %(that: Int) | |
println("--- %(that: Int) ---") | |
println("a % 5 = "+(a % 5).toString) | |
println("b % 6 = "+(b % 6).toString) | |
println("c % 7 = "+(c % 7).toString) | |
println("d % 8 = "+(d % 8).toString) | |
println("ab % 4 = "+(ab % 4).toString) | |
// %(that: Long) | |
println("--- %(that: Long) ---") | |
println("a % 5L = "+(a % 5L).toString) | |
println("b % 6L = "+(b % 6L).toString) | |
println("c % 7L = "+(c % 7L).toString) | |
println("d % 8L = "+(d % 8L).toString) | |
println("e % 4L = "+(e % 9L).toString) | |
// %(that: Float) | |
println("--- %(that: Float) ---") | |
println("a % 1.5f = "+(a % 1.5f).toString) | |
println("b % 2.0f = "+(b % 2.0f).toString) | |
println("c % 2.5f = "+(c % 2.5f).toString) | |
println("d % 3.0f = "+(d % 3.0f).toString) | |
println("e % 4.0f = "+(e % 4.0f).toString) | |
// %(that: Double) | |
println("--- %(that: Double) ---") | |
println("a % 1.5 = "+(a % 1.5).toString) | |
println("b % 2.0 = "+(b % 2.0).toString) | |
println("c % 2.5 = "+(c % 2.5).toString) | |
println("d % 3.0 = "+(d % 3.0).toString) | |
println("e % 4.0 = "+(d % 4.0).toString) | |
// unary_- = ComplexNumber(-real,-imag,this.imagUnit) | |
println("--- unary_- ---") | |
println("-a = "+(-a).toString) | |
println("-b = "+(-b).toString) | |
println("-c = "+(-c).toString) | |
println("-d = "+(-d).toString) | |
println("-e = "+(-e).toString) | |
// abs = math.sqrt(real*real+imag*imag) | |
println("--- abs ---") | |
println("a.abs = "+a.abs.toString) | |
println("b.abs = "+b.abs.toString) | |
println("c.abs = "+c.abs.toString) | |
println("d.abs = "+d.abs.toString) | |
println("e.abs = "+e.abs.toString) | |
// conjugate = ComplexNumber(real,-imag,this.imagUnit) | |
println("--- conjugate ---") | |
println("a.conjugate = "+a.conjugate.toString) | |
println("b.conjugate = "+b.conjugate.toString) | |
println("c.conjugate = "+c.conjugate.toString) | |
println("d.conjugate = "+d.conjugate.toString) | |
println("e.conjugate = "+e.conjugate.toString) | |
println("aa.conjugate*(ac-ComplexNumber.one*7) = "+(aa.conjugate*(ac-ComplexNumber.one*7)).toString) | |
// log = ComplexNumber(math.log(abs)) | |
println("--- log ---") | |
println("a.log = "+a.log.toString) | |
println("b.log = "+b.log.toString) | |
println("c.log = "+c.log.toString) | |
println("d.log = "+d.log.toString) | |
println("e.log = "+e.log.toString) | |
// exp = { | |
println("--- exp ---") | |
println("a.exp = "+a.exp.toString) | |
println("b.exp = "+b.exp.toString) | |
println("c.exp = "+c.exp.toString) | |
println("d.exp = "+d.exp.toString) | |
println("e.exp = "+e.exp.toString) | |
println("aa.exp = "+aa.exp.toString) | |
println("aa.exp.log = "+aa.exp.log.toString) | |
println("aa.exp.log != aa: "+(aa.exp.log == aa)) | |
// pow(that: Double) | |
println("--- pow(that: Double) ---") | |
println("a pow 0.2 = "+(a pow 0.2).toString) | |
println("b pow 0.4 = "+(b pow 0.4).toString) | |
println("c pow 0.6 = "+(c pow 0.6).toString) | |
println("d pow 0.8 = "+(d pow 0.8).toString) | |
println("e pow 1.1 = "+(e pow 1.1).toString) | |
println("a.pow(0.2) = "+a.pow(0.2).toString) | |
println("b.pow(0.4) = "+b.pow(0.4).toString) | |
println("c.pow(0.6) = "+c.pow(0.6).toString) | |
println("d.pow(0.8) = "+d.pow(0.8).toString) | |
println("e.pow(1.1) = "+e.pow(1.1).toString) | |
// pow(that: Int) | |
println("--- pow(that: Int) ---") | |
println("aa.pow(3) = "+aa.pow(3).toString) | |
// pow(that: ComplexNumber) | |
println("--- pow(that: ComplexNumber) ---") | |
println("a pow b = "+(a pow b).toString) | |
println("b pow c = "+(b pow c).toString) | |
println("c pow d = "+(c pow d).toString) | |
println("d pow e = "+(d pow e).toString) | |
println("e pow a = "+(e pow a).toString) | |
println("a.pow(b) = "+a.pow(b).toString) | |
println("b.pow(c) = "+b.pow(c).toString) | |
println("c.pow(d) = "+c.pow(d).toString) | |
println("d.pow(e) = "+d.pow(e).toString) | |
println("e.pow(a) = "+e.pow(a).toString) | |
println("aa.pow(aa) = "+aa.pow(aa).toString) | |
// **(that: ComplexNumber) | |
println("--- **(that: ComplexNumber) ---") | |
println("a ** b = "+(a ** b).toString) | |
println("b ** c = "+(b ** c).toString) | |
println("c ** d = "+(c ** d).toString) | |
println("d ** e = "+(d ** e).toString) | |
println("e ** a = "+(d ** e).toString) | |
println("aa ** ab = "+(aa**ab).toString) | |
// **(that: Double) | |
println("--- **(that: Double) ---") | |
println("a ** 0.2 = "+(a ** 0.2).toString) | |
println("b ** 0.4 = "+(b ** 0.4).toString) | |
println("c ** 0.6 = "+(c ** 0.6).toString) | |
println("d ** 0.8 = "+(d ** 0.8).toString) | |
println("e ** 1.1 = "+(e ** 1.1).toString) | |
// **(that: Int) | |
println("--- **(that: Int) ---") | |
println("aa ** 2 = "+(aa ** 2).toString) | |
// equals(that: Any) | |
println("--- equals(that: Any) ---") | |
println("a equals b: "+(a equals b).toString) | |
println("b equals c: "+(b equals c).toString) | |
println("c equals d: "+(c equals d).toString) | |
println("d equals e: "+(d equals e).toString) | |
println("e equals a: "+(e equals a).toString) | |
println("a equals a: "+(a equals a).toString) | |
println("b equals b: "+(b equals b).toString) | |
println("c equals c: "+(c equals c).toString) | |
println("d equals d: "+(d equals d).toString) | |
println("e equals e: "+(e equals e).toString) | |
println("ad == 1: "+(ad == 1).toString) | |
println("ad.equals(1): "+ad.equals(1)) | |
println("aa != aa: "+(aa!=aa)) | |
// >(that: ComplexNumber) | |
println("--- >(that: ComplexNumber) ---") | |
println("a > b: "+(a > b).toString) | |
println("b > c: "+(b > c).toString) | |
println("c > d: "+(c > d).toString) | |
println("d > e: "+(d > e).toString) | |
println("aa > ab: "+(aa > ab).toString) | |
// >=(that: ComplexNumber) | |
println("--- >=(that: ComplexNumber) ---") | |
println("a >= b: "+(a >= b).toString) | |
println("b >= c: "+(b >= c).toString) | |
println("c >= d: "+(c >= d).toString) | |
println("d >= e: "+(d >= e).toString) | |
// <(that: ComplexNumber) | |
println("--- <(that: ComplexNumber) ---") | |
println("a < b: "+(a < b).toString) | |
println("b < c: "+(b < c).toString) | |
println("c < d: "+(c < d).toString) | |
println("d < e: "+(d < e).toString) | |
println("aa < ab: "+(aa < ab).toString) | |
// <=(that: ComplexNumber) | |
println("--- <=(that: ComplexNumber) ---") | |
println("a <= b: "+(a <= b).toString) | |
println("b <= c: "+(b <= c).toString) | |
println("c <= d: "+(c <= d).toString) | |
println("d <= e: "+(d <= e).toString) | |
// <>(that: ComplexNumber) | |
println("--- <>(that: ComplexNumber) ---") | |
println("a <> b: "+(a <> b).toString) | |
println("b <> c: "+(b <> c).toString) | |
println("c <> d: "+(c <> d).toString) | |
println("d <> e: "+(d <> e).toString) | |
println("aa <> aa: "+(aa<>aa).toString) | |
// exp(that: ComplexNumber) | |
println("--- ComplexNumber.exp(that: ComplexNumber)---") | |
println("ComplexNumber.exp(a) = "+ComplexNumber.exp(a).toString) | |
println("ComplexNumber.exp(b) = "+ComplexNumber.exp(b).toString) | |
println("ComplexNumber.exp(c) = "+ComplexNumber.exp(c).toString) | |
println("ComplexNumber.exp(d) = "+ComplexNumber.exp(d).toString) | |
println("ComplexNumber.exp(e) = "+ComplexNumber.exp(e).toString) | |
println("ComplexNumber.exp(aa) = "+ComplexNumber.exp(aa).toString) | |
// log(that: ComplexNumber) | |
println("--- ComplexNumber.log(that: ComplexNumber)---") | |
println("ComplexNumber.log(a) = "+ComplexNumber.log(a).toString) | |
println("ComplexNumber.log(b) = "+ComplexNumber.log(b).toString) | |
println("ComplexNumber.log(c) = "+ComplexNumber.log(c).toString) | |
println("ComplexNumber.log(d) = "+ComplexNumber.log(d).toString) | |
println("ComplexNumber.log(e) = "+ComplexNumber.log(e).toString) | |
// Imaginary Unit and others. | |
println("--- Imaginary Unit and others. ---") | |
val aj = new ComplexNumber(2,-5,"j") | |
println("aj = "+aj) | |
println("aj * aa = "+(aj*aa).toString) | |
println("aa * aj = "+(aa*aj).toString) | |
println("aj.pow(0) = "+aj.pow(0)) | |
println("aj.pow(2) = "+aj.pow(2)) | |
println("aj * aj = "+(aj*aj)) | |
println("aj.pow(2).log = "+aj.pow(2).log) | |
println("aj.pow(2).pow(0.5) = "+aj.pow(2).pow(0.5)) | |
} | |
} |
演算子関連の動作を確認するためのテストコードの量が多すぎて最初から手で書くレベルではなさそうだったので、以下の手順で作りました。
- Python3で元のコード(ComplexNumberクラス等)の”def”の行を取り出して、それを元にテンプレート的なコードを書き出すためのスクリプトを作成します。
- 手順1で作成したプログラムを実行し、Scalaのプログラムのテンプレート的なものを作ります。
- 手順2で作成したプログラムを修正します。すると上記のプログラムが出来上がります。
プログラムを実行する。
前節のプログラムをEclipse上で実行してみます。Eclipseを起動して、前節のプログラムをProject Explorer上で右クリックすると、ポップアップメニューが表示されますので、「Run As」→「Scala Application」と選択していきます(下図)。
すると、プログラムが実行されてEclipseのConsoleビューに実行結果が以下のように表示されます。
結果についてはすべて検証したわけではありませんが、おそらく正しいのではないかと思います。
まとめ
C++で演算子をオーバーロードした場合と同様に、Scalaでも演算子をオーバーロードすると、動作確認のパターンがソースコードの見かけに反して(※個人の感想です。)増大していきます。そんなときにいきなりテストコードを書いてしまって、そこで何か問題が発覚すると原因の切り分けが難しくなってしまい、気力を奪われてしまいがちです。
また、初めてScalaでコードを記述したためにmainメソッドを使ったプログラムの実行方法も確認する必要があったので、「いきなりテストーコードを書く」というのは作業の単位として大きすぎるように感じたので、いったんmainメソッドにテスト用にも使えるコードを記述して動作確認を行うことで、アプローチとしてはダサくてもいいから作業単位を分割して小さくしたというのがいったんmainメソッドを書いた理由です。
というわけで、別の記事でEclipseを使ってテストを行う方法については書いていきますが、いろいろとハマりましたということだけ、先に書いておきます。
この記事は以上ですが、次の記事に続いていくと思います。