Scala におけるコード進化パターン (Code Evolution Patterns in Scala)
asato shimotaki <asatohan at gmail.com>
最終更新日 : 2008/11/16 (2008/8/24 より)
はじめに
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 関連
interface から 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 への変換
タイプ:
進化タイプ:
前提:
構成要素: 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