memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

匿名クラス


そういえば先日の宿題の答え、まだアップしていなかったですね。。。ごめんなさい。宿題やってきた人?。。。いませんね。。。プロには易しすぎ。(うちの)学生には難しかったかもしれません。問題のレベル設定誤りです。ごめんなさい。


この際だから勉強しましょう>(うちの)学生さん。


問題は、scala本に出てきた以下の部分コードが動く完全なプログラムを作成しなさい、ということだったと思います。

interface CharacterProperty {
    boolean hasProperty(char ch);
}

exists(name, new CharacterProperty() {
    public boolean hasProperty(char ch) {
        return Character.isUpperCase(ch);
    }
});


答えは以下。もちろん答えは一つではないですが。

interface CharacterProperty {
  boolean hasCharacter(char ch) ;
}

class CharacterCheck{
	boolean exists(String name, CharacterProperty c){ 
		for (int i=0; i<name.length(); i++){
			if (c.hasCharacter(name.charAt(i))){
				return true;
			}
		}
		return false;
	}
}

public class CharacterCheckMain {
    public static void main(String[] args){
    	CharacterCheck e = new CharacterCheck() ;
        System.out.println(e.exists("Takahashi", new CharacterProperty(){
            public boolean hasCharacter(char ch){
              return Character.isUpperCase(ch);
            }
        } )) ; 
    }   
} 

Checkの内容ごとにクラスを作成して切り替えて使う。要は(このプログラムでいうところの)intefaceさえ決めておけば、文字列の検査仕様は後で決めて良いということ。interfaceプログラミングですなぁ。。。


Rubyならダックタイピングだからinterfaceを予め決める必要はないですね。。。でも多人数開発ではインタフェースを先に取り決めてスタートしたいはず。。。Rubyではどうやって解決(規制)しているのかな?メソッド名をお互いに勘違いしていて組み合わせたら動かない。。。という初歩的なミスは動的言語ではどうやって解決しているのだろう?


CやC++開発ならヘッダーファイルでインタフェース情報を共有して誤りはコンパイルエラーで単体テストレベルで発見できるはず。Rubyは?そもそもそんな考え方はしない?