RyoGIFT | Web developer blog

Web開発者のブログです。

ダック・タイピングを例に動的型付け言語と静的型付け言語の違い

ダック・タイピングとは
If it walks like a duck and quacks like a duck, it must be a duck.  
(もしも、それがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルに違いない。)  
                                デーブ・トーマスより

ダック・タイピングは、オブジェクトに何ができるかはオブジェクトそのものが決定します。静的型付け言語と違って継承関係が無く、オブジェクトがインタフェースのすべてのメソッドを持っている場合には、対象のクラスがインタフェースを宣言的に実装していない場合でもオブジェクトを呼び出すことができます。

Rubyを使ったコード例
class Duck
  def sound
    "Quack"
  end
end

class Cat
  def sound
    "Meow"
  end
end

def sound(object)
  object.sound
end

puts sound(Duck.new)
puts sound(Cat.new)

soundメソッドはオブジェクトにsoundメソッドが定義されているのかを確認できませんが実行時には呼び出すことが出来ます。

Javaでインタフェースを使って、同様の出力結果になるコード例
// Animal.java
package com.ry0takahash1;

public interface Animal {
    public abstract String sound();
}

// Duck.java
package com.ry0takahash1;

public class Duck implements Animal {
    public String sound() {
        return "Quack";
    }
}

// Cat.java
package com.ry0takahash1;

public class Cat implements Animal {
    public String sound() {
        return "Meow";
    }
}

// Main.java
package com.ry0takahash1;

public class Main {
    public static void main(String[] args) {
        Duck duck = new Duck();
        System.out.println(duck.sound());

        Cat cat = new Cat();
        System.out.println(cat.sound());
    }
}

インタフェースで、あらかじめメソッドを宣言しているため実行しなくてもsoundメソッドが定義されていることが明示的に分かります。

まとめ

ダック・タイピングを例に動的型付け言語と静的型付け言語の違いを考えてみました。個人的には個人開発や小規模なチームでの開発であれば動的型付け言語、大規模なチームでの開発であれば静的型付け言語を使うかなと思います。適材適所でプログラミング言語の使い分けが出来ると良いですね!