モトネタ:実装を委譲できる言語を作ればいいのかもしれない
Java
委譲できる言語ということで、Javaだとこんなにメンドクサイ!!という例が出てる。
具体的に手順としてはどうなるか?ということをやってみようと思う。
まず、委譲先になるクラスHogeを定義します。
com.wankuma.kazuki.deleg.Hogeという名前で作ります!!
メソッドは2つ。fooとbooです。
package com.wankuma.kazuki.deleg;
public class Hoge {
public void foo() {
System.out.println("Hoge#foo");
}
public void boo() {
System.out.println("Hoge#boo");
}
}
これをフィールドに持って、仕事をHogeに丸投げするPiyoさんを作ります。
package com.wankuma.kazuki.deleg;
public class Piyo {
private Hoge hoge = new Hoge();
}
委譲先のクラスのインスタンスをフィールドに持ったらおもむろにAlt + Shift + Sを押します。そして、出てきたメニューのGenerate Delegate Methods...を選択します。
出てきたダイアログで委譲させたいメソッドを選択する。満足いくまで選択したらOKをくりっく!
委譲するメソッドがばっちり記入されてます。さすがEclipse!!!
package com.wankuma.kazuki.deleg;
public class Piyo {
private Hoge hoge = new Hoge();
public void boo() {
hoge.boo();
}
public void foo() {
hoge.foo();
}
}
C#
お次はC#!こちらは…ノリノリでHogeとPiyoを書いてみたが…
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Com.Wankuma.Kazuki.Deleg
{
class Program
{
static void Main(string[] args)
{
}
}
class Hoge
{
public void Foo()
{
Console.WriteLine("Hoge#Foo");
}
public void Boo()
{
Console.WriteLine("Hoge#Boo");
}
}
class Piyo
{
private Hoge hoge = new Hoge();
}
}
リファクタリングメニューを眺めても委譲っぽいのが無い!?ということで泣く泣く全部手書き実装…。するのは悔しい。
ということで書かなかった!!何か楽に書く方法は無いのだろうか。
Ruby
次はRuby。Rubyには標準で委譲をするためのライブラリがついてきているという噂。
とりあえずは、委譲のコードを書く直前の段階までサクっと書く。
class Hoge
def foo
puts "Hoge#foo"
end
def boo
puts "Hoge#boo"
end
end
class Piyo
def initialize
@hoge = Hoge.new
end
end
委譲を実現するためのライブラリとして、Forwardableというのが使えるらしい。
使い方はrequire 'forwardable'をしてクラスでextend Forwardableをして、def_delegatorsメソッドを呼ぶという流れになるみたい。
早速してみた。
require 'forwardable'
class Hoge
def foo
puts "Hoge#foo"
end
def boo
puts "Hoge#boo"
end
end
class Piyo
extend Forwardable
def initialize
@hoge = Hoge.new
end
def_delegators(:@hoge, :foo, :boo) # fooとbooを@hogeに委譲
end
piyo = Piyo.new
piyo.foo # => Hoge#foo
piyo.boo # => Hoge#boo
全部のコードを書くより楽チンだわぁ。