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大好き!
ほんとだよ。
ちょっと出勤前にかみさんにぱしりを頼まれたのでいってきます。
ではまた。