SlideShare a Scribd company logo
Javaで最強のFizzBuzz
第16回 渋谷じゃば 2016/07/23
@yy_yank
          こいつです
          ・小物SIer
          ・viキーバインド好き
          ・サクラエディタicon
          ・JavaとKotlinが好き
ヤンク(@yy_yank)
自己紹介
Javaで最強のfizz buzz
FizzBuzzとは
3の倍数ではFizzを出力して、5の倍数で
はBuzzを出力して、 両方の倍数(15の倍
数)の場合はFizzBuzzと出力して、それ以
外は数字をそのまま出力する処理のこと
を言います
FizzBuzzとは
なるほど
public void fizzBuzz() throws Exception {
IntStream.rangeClosed(0, 10000).mapToObj(FizzBuzz::make).forEach
(System.out::println);
}
private static String make(int i) {
return i != 0 && i % 15 == 0 ? "fizzbuzz" : i != 0 && i % 3 == 0 ?
"fizz" : i != 0 && i % 5 == 0 ? "buzz" : String.valueOf(i);
}
適当にやるならこんな感じ
特に説明は不要で
すよね
設計を考える
・言語規約を守る
・適切なインターフェースを実装する
Javaの設計で大事なこと
3の倍数ではFizzを出力して、5の倍数で
はBuzzを出力して、 両方の倍数(15の倍
数)の場合はFizzBuzzと出力して、それ以
外は数字をそのまま出力する処理のこと
を言います
要件を改めて見る
3の倍数ではFizzを出力して、
5の倍数ではBuzzを出力して、
両方の倍数(15の倍数)の場合は
FizzBuzzと出力して、それ以外は数字を
そのまま出力する処理のことを言います
要件を改めて見る
Fizz
Buzz
FizzBuzz
Sonomama
クラス構成
Fizz・・・fizzと出力
Buzz・・・buzzと出力
FizzBuzz・・・fizzbuzzと出力
Sonomama・・・そのまま数字を出力
なにをするか
Fizz・・・3で割り切れたら
Buzz・・・5で割り切れたら
FizzBuzz・・・15で割り切れたら
Sonomama・・・3でも5でも15でも割り切れない
どのタイミングか
よし、いけそう
じゃあ、どうやって
処理伝播をしよう
投げよう
これが最強のクラス構成だ
FizzBuzzPitcher
FizzException
BuzzException
FizzBuzzException
SonomamaException
FizzBuzzPitcher
FizzException
BuzzException
FizzBuzzException
SonomamaException
これが最強のクラス構成だ
投げる
FizzBuzzPitcher
FizzException
BuzzException
FizzBuzzException
SonomamaException
これが最強のクラス構成だ
投げられる
FizzBuzzPitcher
FizzException
BuzzException
FizzBuzzException
SonomamaException
これが最強のクラス構成だ
持ちつ
FizzBuzzPitcher
FizzException
BuzzException
FizzBuzzException
SonomamaException
これが最強のクラス構成だ
持たれつ
public class FizzBuzzPitcher {
private FizzBuzzPitcher(){}
public static void overThrow(int i) {
boolean fizz = i != 0 && i % 3 == 0;
boolean buzz = i != 0 && i % 5 == 0;
boolean fizzBuzz = i != 0 && i % 15 == 0;
if(fizzBuzz) {
throw new FizzBuzzException();
} else if(fizz) {
throw new FizzException();
} else if(buzz) {
throw new BuzzException();
} else {
throw new SonomamaException(i);
}
これが最強のピッチャーだ
for (int i = 0; i < 10000; i++)
try {
FizzBuzzPitcher.overThrow(i);
} catch (FizzException fizz) {
System.out.println("fizz");
} catch (BuzzException buzz) {
System.out.println("buzz");
} catch (FizzBuzzException fizzbuzz) {
System.out.println("fizzbuzz");
} catch (SonomamaException not) {
System.out.println(i);
}
これが最強の処理実行だ
完璧ですね
いやチョット待て
おかしいおかしい
for (int i = 0; i < 10000; i++)
try {
FizzBuzzPitcher.overThrow(i);
} catch (FizzException fizz) {
System.out.println("fizz");
} catch (BuzzException buzz) {
System.out.println("buzz");
} catch (FizzBuzzException fizzbuzz) {
System.out.println("fizzbuzz");
} catch (SonomamaException not) {
System.out.println(i);
}
これが最強の処理実行だ
このあたりが冗
長!!!
#そこかよ
じゃあ、どうやって
冗長さをなくそう
AutoClosableを使
おう
FizzException implements AutoClosable
BuzzException implements AutoClosable
FizzBuzzException implements AutoClosable
SonomamaException implements AutoClosable
FizzBuzzCatcher
これが最強のクラス構成だ
public class BuzzException extends RuntimeException
implements AutoCloseable{
@Override
public void close() {
System.out.println(“buzz”);
}
}
これが最強のclose処理だ
これが最強のキャッチャーだ
public class FizzBuzzCatcher {
private FizzBuzzCatcher(){}
public static AutoCloseable make(int i) {
try {
FizzBuzzPitcher.overThrow(i);
} catch(FizzException | BuzzException | FizzBuzzException | SonomamaException e){
return (AutoCloseable) e;
}
// 投げられないのはおかしいから投げる
throw new IllegalStateException();
}
public static void receive(int i) throws Exception {
try(AutoCloseable ex = make(i)){}
}
}
public class FizzBuzzCatcher {
private FizzBuzzCatcher(){}
public static AutoCloseable make(int i) {
try {
FizzBuzzPitcher.overThrow(i);
} catch(FizzException | BuzzException | FizzBuzzException | SonomamaException e){
return (AutoCloseable) e;
}
// 投げられないのはおかしいから投げる
throw new IllegalStateException();
}
public static void receive(int i) throws Exception {
try(AutoCloseable ex = make(i)){}
}
}
これが最強のキャッチャーだ
try-with-resoureces
で処理が呼び出さ
れる
これでインスタンス
生成するだけで標
準出力される
ぞ!!
これが最強の処理実行だ
// なんと呼び出し側は1行!!!
for (int i = 0; i < 10000; i++) FizzBuzzCatcher.receive(i);
・時として、人類は間違いをおかす
・誰かが止めなければならない
・例外は異常を伝えるために使いましょう
・例外をgoto文のように使ってはいけません
・AutoClosableインターフェースはクローズ処理を行うために使
いましょう
※ちなみにjava.util.stream.Streamも
AutoCloseableです
まとめ
・言語規約を守る
・適切なインターフェースを実装する
Javaの設計で大事なこと
動けば良い、は
良くない!!
時間が余ったら
おまけ
これが最強のキャッチャーだ
public class FizzBuzzCatcher {
private FizzBuzzCatcher(){}
public static AutoCloseable make(int i) {
try {
FizzBuzzPitcher.overThrow(i);
} catch(FizzException | BuzzException | FizzBuzzException | SonomamaException e){
return (AutoCloseable) e;
}
// 投げられないのはおかしいから投げる
throw new IllegalStateException();
}
public static void receive(int i) throws Exception {
try(AutoCloseable ex = make(i)){}
}
}
こういうふざけたコードを書いてたら Javaコ
ンパイラのバグを踏みました
※1.8.0_25のバグで、1.8.0_72で直ってま
す
14:39:40: Executing external task 'build'...
コンパイラで例外が発生しました(1.8.0_25)。
Bug Paradeで重複がないかをご確認のうえ、Java Developer Connection (http://java.sun.
com/webapps/bugreport)でbugの登録をお願いいたします。レポートには、そのプログラムと
下記の診断内容を含めてください。ご協力ありがとうございます。
java.lang.ClassCastException: com.sun.tools.javac.code.Type$UnionClassType cannot be cast to com.sun.tools.
javac.code.Type$IntersectionClassType
at com.sun.tools.javac.code.Types$8.visitClassType(Types.java:1540)
at com.sun.tools.javac.code.Types$8.visitClassType(Types.java:1497)
at com.sun.tools.javac.code.Type$ClassType.accept(Type.java:778)
at com.sun.tools.javac.code.Types$DefaultTypeVisitor.visit(Types.java:4451)
at com.sun.tools.javac.code.Types.isCastable(Types.java:1488)
at com.sun.tools.javac.comp.Check.checkCastable(Check.java:568)
at com.sun.tools.javac.comp.Check.checkCastable(Check.java:565)
Javaで最強のfizz buzz
Javaで最強のfizz buzz
[JDK-8071291]
Compiler crashes trying to cast UnionType to
IntersectionClassType
https://bugs.openjdk.java.net/browse/JDK-
8071291
バグレポートの書き方
http://yyyank.blogspot.jp/2016/07/javajdk.html

More Related Content

PDF
Vimはこわくない
PDF
Vagrant intro
PDF
「Vimrcリーディングに役立ちそうな」vimrcの設定とplugin管理
 
PPTX
Casperjsのインストール
ODP
PDF
Vim script と vimrc の正しい書き方@nagoya.vim #1
PDF
できるBGP! IHANet Meeting 11@うどん県(小豆島)でVyOSでpeerしてみた~初心者向け~
Vimはこわくない
Vagrant intro
「Vimrcリーディングに役立ちそうな」vimrcの設定とplugin管理
 
Casperjsのインストール
Vim script と vimrc の正しい書き方@nagoya.vim #1
できるBGP! IHANet Meeting 11@うどん県(小豆島)でVyOSでpeerしてみた~初心者向け~

What's hot (20)

ODP
Ruby build
PDF
第6回鹿児島node.jsの会資料_内村
PDF
Eucalyptus on OpenStack
PDF
Ilstudy001_20110806
PPTX
これだけ知っときゃなんとかなるVim
PDF
(初心者向け) Vim の機能紹介@nagoya.vim #1
ODP
etckeeperをopenSUSEの公式リポジトリに入れたいぞ! Ver.2
PPT
PDF
A_road_to_AMBER_simulations_ver_1.0
PDF
fanscala1 1 インストールとreplまで
PPTX
Windowsでも使えるシェル
PDF
今から始めるzsh
PDF
SoftlayerのCLIで遊ぼうとしたら
PDF
Hudson using Groovy #jggug
PDF
rabbit - 第10回 岡山Ruby, Ruby on Rails勉強会
PDF
HTML5-pronama-study
ODP
Symfony2 workshop-0 (nagoya 2011/2/10)
PDF
How_to_install_OpenCV_ver1.0
PDF
超簡単! インストールなしでRedmineを試す
PDF
超簡単!Apache SubverisonをWindows Serverにインストール
Ruby build
第6回鹿児島node.jsの会資料_内村
Eucalyptus on OpenStack
Ilstudy001_20110806
これだけ知っときゃなんとかなるVim
(初心者向け) Vim の機能紹介@nagoya.vim #1
etckeeperをopenSUSEの公式リポジトリに入れたいぞ! Ver.2
A_road_to_AMBER_simulations_ver_1.0
fanscala1 1 インストールとreplまで
Windowsでも使えるシェル
今から始めるzsh
SoftlayerのCLIで遊ぼうとしたら
Hudson using Groovy #jggug
rabbit - 第10回 岡山Ruby, Ruby on Rails勉強会
HTML5-pronama-study
Symfony2 workshop-0 (nagoya 2011/2/10)
How_to_install_OpenCV_ver1.0
超簡単! インストールなしでRedmineを試す
超簡単!Apache SubverisonをWindows Serverにインストール
Ad

Viewers also liked (20)

PDF
The FizzBuzz Programing Contest
PPTX
この素晴らしいSQLに祝福を!
PDF
絶対にぬるぽを出さない
PDF
Kotlinソースコード探訪
PPTX
Server Side Kotlin
PDF
Jvm言語とJava、切っても切れないその関係
PDF
型についてあれこれ
PDF
オブジェクト指向できていますか?
PDF
ソースコードの品質向上のための効果的で効率的なコードレビュー
PPT
Fizz buzz publish
 
PDF
時間をかけて解く FizzBuzz
DOCX
Fotografias de acercamiento
PDF
2828_Forestry_Conference book for print
DOCX
U6 1er-grado-paginas-iniciales
PPTX
Tecnologia
PPTX
Dificultades en el uso de las TIC
DOCX
Guia de valoarcion de daño psiquico 2016 criminalistica
PPTX
Laplace ckt analysis with intial condition
PDF
Your code sucks, let's fix it - DPC UnCon
PDF
超大量トラフィックとAWSと私
The FizzBuzz Programing Contest
この素晴らしいSQLに祝福を!
絶対にぬるぽを出さない
Kotlinソースコード探訪
Server Side Kotlin
Jvm言語とJava、切っても切れないその関係
型についてあれこれ
オブジェクト指向できていますか?
ソースコードの品質向上のための効果的で効率的なコードレビュー
Fizz buzz publish
 
時間をかけて解く FizzBuzz
Fotografias de acercamiento
2828_Forestry_Conference book for print
U6 1er-grado-paginas-iniciales
Tecnologia
Dificultades en el uso de las TIC
Guia de valoarcion de daño psiquico 2016 criminalistica
Laplace ckt analysis with intial condition
Your code sucks, let's fix it - DPC UnCon
超大量トラフィックとAWSと私
Ad

More from yy yank (8)

PDF
Javaプログラマのための頑張らないGo入門
PDF
VMの歩む道。 Dalvik、ART、そしてJava VM
PDF
KuromojiをKotlinで動かす
PDF
Doma2 with Kotlin
PDF
Kotlinこんなん出ましたけど
PDF
Kotlinあるある言いたい
PDF
【こっそり始める】Javaプログラマコーディングマイグレーション
PDF
Kotlinメジャーver リリースを前に
Javaプログラマのための頑張らないGo入門
VMの歩む道。 Dalvik、ART、そしてJava VM
KuromojiをKotlinで動かす
Doma2 with Kotlin
Kotlinこんなん出ましたけど
Kotlinあるある言いたい
【こっそり始める】Javaプログラマコーディングマイグレーション
Kotlinメジャーver リリースを前に

Javaで最強のfizz buzz