FizzBuzz

下記を一日で示して、
java大好き!」といえれば、
その人はjava-jaに入っても意義があるよー
というようなことを友人が言っていたので試してみます。


> →FizzBuzz:Normal
> →FizzBuzz:Objective@Template method
> →FizzBuzz:Objective@Seasar2


とりあえず、FizzBuzzとは、というのをググって確認してみる。


FizzBuzzとは:
1 から順に数を数えていく。
但し、その数が 3 で割り切れるならば数字の代わりに Fizz と、
5 で割り切れるなら Buzz と言うゲーム。
3 でも 5 でも割り切れる場合は、FizzBuzz の順に言う。


そっかー

ではNormalから

public class FizzBuzzPlain {
	public static void main(String[] args) {
		for( int i=1; i<= 100; i++ ){
			if( i % 3 != 0 && i % 5 != 0){
				System.out.println(i);
				continue;
			}
			if( i % 3 == 0 ){
				System.out.print("Fizz");
			}
			if( i % 5 == 0 ){
				System.out.print("Buzz");
			}
			System.out.println("");
		}
	}
}

実行結果は割愛。



次はTemplateMethod・・・・
っと・・・どこで抽象化するんだ?
割り切れる数を判断した後だと、なんつーかやるメリットというか、
意味がないしな・・・
とりあえずまるごとやっちゃいます。
こんな感じ。

public class FizzBuzzTemplateMethod {
	public static void main(String[] args) {
		HogeWriter writer = new FizzBuzzWriter();
		writer.output();
	}
}

abstract class HogeWriter{
	public void output(){
		for( int i=1; i<= 100; i++ ){
			if( i % 3 != 0 && i % 5 != 0){
				outputNumeric(i);
				System.out.println();
				continue;
			}
			if( i % 3 == 0 ){
				outputThreeDivides(i);
			}
			if( i % 5 == 0 ){
				outputFiveDivides(i);
			}
			System.out.println();
		}
	}
	public abstract void outputNumeric(int seq );
	public abstract void outputThreeDivides(int seq );
	public abstract void outputFiveDivides(int seq );
}

class FizzBuzzWriter extends HogeWriter{

	@Override
	public void outputNumeric(int seq ) {
		System.out.print(seq);
	}

	@Override
	public void outputThreeDivides(int seq ) {
		System.out.print("Fizz");
	}

	@Override
	public void outputFiveDivides(int seq ) {
		System.out.print("Buzz");
	}
}


最後にSeasar2で・・・
っと、DIってことはファイルわけないと多分だめだよね。

まずはインターフェース
IF_HogeWriter.java

package FizzBuzzSeasar2;

public interface IF_HogeWriter {
	public void output();
}

実装。
めんどいのでTemplateMethodのやつを流用してます。

Abst_HogeWriter.java

package FizzBuzzSeasar2;

public abstract class Abst_HogeWriter implements IF_HogeWriter{
	public void output(){
		for( int i=1; i<= 100; i++ ){
			if( i % 3 != 0 && i % 5 != 0){
				outputNumeric(i);
				System.out.println();
				continue;
			}
			if( i % 3 == 0 ){
				outputThreeDivides(i);
			}
			if( i % 5 == 0 ){
				outputFiveDivides(i);
			}
			System.out.println();
		}
	}
	public abstract void outputNumeric(int seq );
	public abstract void outputThreeDivides(int seq );
	public abstract void outputFiveDivides(int seq );
}


FizzBuzzWriter.java

package FizzBuzzSeasar2;

public class FizzBuzzWriter extends Abst_HogeWriter{
	public FizzBuzzWriter(){};
	
	@Override
	public void outputNumeric(int seq ) {
		System.out.print(seq);
	}

	@Override
	public void outputThreeDivides(int seq ) {
		System.out.print("Fizz");
	}

	@Override
	public void outputFiveDivides(int seq ) {
		System.out.print("Buzz");
	}
}


定義ファイル
app.dicon

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
"http://www.seasar.org/dtd/components24.dtd">
<components>
    <component name="FizzBuzz" class="FizzBuzzSeasar2.FizzBuzzWriter">
    </component>
</components>


実行メイン
FizzBuzzSeasar2.java

package FizzBuzzSeasar2;

import org.seasar.framework.container.S2Container;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;

public class FizzBuzzSeasar2 {

	public static void main(String[] args) {
		SingletonS2ContainerFactory.init();
		S2Container container = SingletonS2ContainerFactory.getContainer();
			IF_HogeWriter writer = (IF_HogeWriter)container.getComponent("FizzBuzz");
			writer.output();
	}
}

Java大好き!
ほんとだよ。

ちょっと出勤前にかみさんにぱしりを頼まれたのでいってきます。
ではまた。