Locked History Actions

Diff for "scala/structuralSubtyping"

Differences between revisions 1 and 2
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
= 構造的部分型(structural subtyping) == = 構造的部分型(structural subtyping) =
Line 5: Line 5:

== やりたいこと ==

例えば、Javaでは以下のようには記述できない。

{{{
class Greeter {
  public void hello() {
    System.out.println("hello, world");
  }
}
class Executer {
  public void execute(Object someObject) {
    someObject.hello(); // Objectにそんなメソッドはない!コンパイルエラー
  }
}
...
new Executer(new Greeter()).execute();
}}}

つまり、Executer.executeメソッドは「任意の」オブジェクトを受け入れ、そのhelloメソッドを呼び出したいわけだが、コンパイラはコンパイル時にパラメータの型を調べて、それにhelloというメソッドがなければエラーにしてしまう。実行時にはhelloというメソッドの定義されたGreeterオブジェクトが渡されているにも関わらずである。

これはJavaなどの静的型付けの言語ではいたし方ないし、これがあるがゆえに実行速度が高いわけである。つまり、実行時に渡されたオブジェクトにそのようなメソッドがあるかどうかを調べなくて済むわけである(もちろんリフレクションを用いて調べる場合は別)。

これに対して、ruby等の動的な言語は実行時にメソッドの有無を調べる。それがゆえに遅いし、完全なテスト(テストカバレッジ100%)が必要になる。例えば、スペルミスして「hell」などという呼び出しを記述してしまえば、そのミスはその行が実際に呼び出されるまではわからない。

※私見だが、これがゆえにスクリプト言語のプログラマは「スペルミスをしないように」長い名前を避ける傾向があるように思われる。しかし、短い簡単な名前ばかりつけていけば、大規模なプログラムでは同じ名前がそこかしこに存在することになり、リファクタリング時には非常な問題になる。「この名前とあの名前は同じだが、同じものを指しているのかわからない」という状況になりうる。静的に決定することができないのだ。スクリプト言語が大規模プログラム作成に向いていないのはこのような理由だ。

構造的部分型(structural subtyping)

むつかしそうな名前だが、やりたいことはきわめて簡単。 そもそもプログラミングを簡単にしたいがための仕組みなのだから。

やりたいこと

例えば、Javaでは以下のようには記述できない。

class Greeter {
  public void hello() {
    System.out.println("hello, world");
  }
}
class Executer {
  public void execute(Object someObject) {
    someObject.hello(); // Objectにそんなメソッドはない!コンパイルエラー
  }
}
...
new Executer(new Greeter()).execute();

つまり、Executer.executeメソッドは「任意の」オブジェクトを受け入れ、そのhelloメソッドを呼び出したいわけだが、コンパイラはコンパイル時にパラメータの型を調べて、それにhelloというメソッドがなければエラーにしてしまう。実行時にはhelloというメソッドの定義されたGreeterオブジェクトが渡されているにも関わらずである。

これはJavaなどの静的型付けの言語ではいたし方ないし、これがあるがゆえに実行速度が高いわけである。つまり、実行時に渡されたオブジェクトにそのようなメソッドがあるかどうかを調べなくて済むわけである(もちろんリフレクションを用いて調べる場合は別)。

これに対して、ruby等の動的な言語は実行時にメソッドの有無を調べる。それがゆえに遅いし、完全なテスト(テストカバレッジ100%)が必要になる。例えば、スペルミスして「hell」などという呼び出しを記述してしまえば、そのミスはその行が実際に呼び出されるまではわからない。

※私見だが、これがゆえにスクリプト言語のプログラマは「スペルミスをしないように」長い名前を避ける傾向があるように思われる。しかし、短い簡単な名前ばかりつけていけば、大規模なプログラムでは同じ名前がそこかしこに存在することになり、リファクタリング時には非常な問題になる。「この名前とあの名前は同じだが、同じものを指しているのかわからない」という状況になりうる。静的に決定することができないのだ。スクリプト言語が大規模プログラム作成に向いていないのはこのような理由だ。