Scala におけるコード進化パターン (Code Evolution Patterns in Scala)

asato shimotaki <asatohan at gmail.com>

最終更新日 : 2008/11/16 (2008/8/24 より)


このドキュメントでは、Scala 言語 における コード進化のパターン をカタログ化することを目的としています。

はじめに

Scala 基本関連

Class 関連

クラスの追加

状況&動機:クラスを新たに追加する。

タイプ:

進化タイプ:

前提:

構成要素:

before:

object Main extends Application {

}
after:
class MyClass {

}
object Main extends Application {
  val my = new MyClass
}

進化リクエスタ/プロバイダ

議論

進化パス

パターン関係

関連パターン

参考文献とリソース

その他/疑問

Method 関連

メソッドボディの変更

状況&動機:クラスのメソッドボディのコードを変更する。

タイプ:

進化タイプ:

前提:

構成要素:

before:

object Main extends Application {

  val my = new MyClass
  my.myMethod

}
class MyClass {

  def myMethod = {
    println("MyClass.myMethod")
  }

}
after:
object Main extends Application {

  val my = new MyClass
  my.myMethod

}
class MyClass {

  def myMethod = {
    println("*** MyClass.myMethod ***")
  }

}

進化リクエスタ/プロバイダ

議論

進化パス

パターン関係

関連パターン

参考文献とリソース

その他/疑問

Java から Scala 関連

Scala のバージョン 2.7.2 から、Java コードもコンパイルしてくれるようになりました。それにより、Java で書かれていたコードを Scala のコードにインクリメンタルに変換していくことができるようになりました。ここでは、Java コードから Scala コードへの変換パターンを紹介します。

interface から trait への変換

状況&動機:Java の interface を Scala の trait へ変換する。

タイプ:

進化タイプ:

前提:

構成要素:

before:

// Java
public interface MyInterface {
	public void method();
}
// Java
public class MyInterfaceImpl implements MyInterface {
	
	@Override
	public void method() {
		System.out.println("MyInterfaceImpl.method()");
	}
}
// java
public class MyInterfaceClient {

	public static void main(String[] args) {

		MyInterface my = new MyInterfaceImpl();
		my.method();
	}
}
after:
// Scala
trait MyInterface {
  def method
}
// Java
public class MyInterfaceImpl implements MyInterface { // interface として trait を implement

	public void method() {
		System.out.println("MyInterfaceImpl.method()");
	}
}
// Java
public class MyInterfaceClient {
	
	public static void main(String[] args) {

		MyInterface my = new MyInterfaceImpl();
		my.method();
	
	}
}

進化リクエスタ/プロバイダ

議論

パターン関係

進化パス

関連パターン

参考文献とリソース

その他/疑問

Content Filter interface から trait への変換

状況&動機:Java の Content Filter interface を Scala の trait へ変換する。

タイプ:

進化タイプ:

前提:

構成要素:

before:

// Java
public class Item {
	
	private String name;
	
	public Item(String name) {
		this.name = name;
	}
	
	public String getName() {
		return name;
	}
}
// Java
public interface ItemFilter { // Content Filter
	public boolean accept(Item item);
}
// java
public class ItemContainer {

	private List items = new ArrayList();

	public void addItem(Item i) {
		items.add(i);
	}
	
	public List getItems(ItemFilter filter) {
		
		List accepted = new ArrayList();

		for(Item i : items) {
		
			if (filter.accept(i)) {
				accepted.add(i);
			}
		}
		
		return accepted;
	}
}
// java
public class ItemContainerClient {

	public static void main(String[] args) {
		
		ItemContainer c = new ItemContainer();
		
		c.addItem( new Item("a") );
		c.addItem( new Item("b") );
	
		List items = c.getItems(new ItemFilter() {
				
			@Override
			public boolean accept(Item item) {
				return item.getName().equals("a");
			}	
		});
		
		for(Item i : items) {
			System.out.println(i.getName()); // "a"
		}
	}
}
after:
// Java
public class Item {
	
	private String name;
	
	public Item(String name) {
		this.name = name;
	}
	
	public String getName() {
		return name;
	}
}
// Scala
trait ItemFilter {
  def accept(item: Item): Boolean
}
// java
public class ItemContainer {

	private List items = new ArrayList();

	public void addItem(Item i) {
		items.add(i);
	}
	
	public List getItems(ItemFilter filter) {
		
		List accepted = new ArrayList();

		for(Item i : items) {
		
			if (filter.accept(i)) {
				accepted.add(i);
			}
		}
		
		return accepted;
	}
}
// java
public class ItemContainerClient {

	public static void main(String[] args) {
		
		ItemContainer c = new ItemContainer();
		
		c.addItem( new Item("a") );
		c.addItem( new Item("b") );
	
		List items = c.getItems(new ItemFilter() {
				
			@Override
			public boolean accept(Item item) {
				return item.getName().equals("a");
			}	
		});
		
		for(Item i : items) {
			System.out.println(i.getName()); // "a"
		}
	}
}

進化リクエスタ/プロバイダ

議論

パターン関係

進化パス

関連パターン

参考文献とリソース

その他/疑問

更新履歴

todo