SlideShare uma empresa Scribd logo
1 de 46
Baixar para ler offline
Javaで最強のFizzBuzz
第16回 渋谷じゃば 2016/07/23
@yy_yank
          こいつです
          ・小物SIer
          ・viキーバインド好き
          ・サクラエディタicon
          ・JavaとKotlinが好き
ヤンク(@yy_yank)
自己紹介
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)
[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

Mais conteúdo relacionado

Mais procurados

第6回鹿児島node.jsの会資料_内村
第6回鹿児島node.jsの会資料_内村第6回鹿児島node.jsの会資料_内村
第6回鹿児島node.jsの会資料_内村Koichi Uchimura
 
Eucalyptus on OpenStack
Eucalyptus on OpenStackEucalyptus on OpenStack
Eucalyptus on OpenStackirix_jp
 
これだけ知っときゃなんとかなるVim
これだけ知っときゃなんとかなるVimこれだけ知っときゃなんとかなるVim
これだけ知っときゃなんとかなるVimarisu yano
 
(初心者向け) Vim の機能紹介@nagoya.vim #1
(初心者向け) Vim の機能紹介@nagoya.vim #1(初心者向け) Vim の機能紹介@nagoya.vim #1
(初心者向け) Vim の機能紹介@nagoya.vim #1cohama
 
etckeeperをopenSUSEの公式リポジトリに入れたいぞ! Ver.2
etckeeperをopenSUSEの公式リポジトリに入れたいぞ! Ver.2etckeeperをopenSUSEの公式リポジトリに入れたいぞ! Ver.2
etckeeperをopenSUSEの公式リポジトリに入れたいぞ! Ver.2Mitsutoshi Nakano
 
A_road_to_AMBER_simulations_ver_1.0
A_road_to_AMBER_simulations_ver_1.0A_road_to_AMBER_simulations_ver_1.0
A_road_to_AMBER_simulations_ver_1.0Satoshi Kume
 
fanscala1 1 インストールとreplまで
fanscala1 1 インストールとreplまでfanscala1 1 インストールとreplまで
fanscala1 1 インストールとreplまでToshiki Shinozaki
 
Windowsでも使えるシェル
Windowsでも使えるシェルWindowsでも使えるシェル
Windowsでも使えるシェルTetsuya Hasegawa
 
SoftlayerのCLIで遊ぼうとしたら
SoftlayerのCLIで遊ぼうとしたらSoftlayerのCLIで遊ぼうとしたら
SoftlayerのCLIで遊ぼうとしたら雄哉 吉田
 
rabbit - 第10回 岡山Ruby, Ruby on Rails勉強会
rabbit - 第10回 岡山Ruby, Ruby on Rails勉強会rabbit - 第10回 岡山Ruby, Ruby on Rails勉強会
rabbit - 第10回 岡山Ruby, Ruby on Rails勉強会Masaya Konishi
 
HTML5-pronama-study
HTML5-pronama-studyHTML5-pronama-study
HTML5-pronama-studyNaoya Inada
 
Symfony2 workshop-0 (nagoya 2011/2/10)
Symfony2 workshop-0 (nagoya 2011/2/10)Symfony2 workshop-0 (nagoya 2011/2/10)
Symfony2 workshop-0 (nagoya 2011/2/10)Hidenori Goto
 
How_to_install_OpenCV_ver1.0
How_to_install_OpenCV_ver1.0How_to_install_OpenCV_ver1.0
How_to_install_OpenCV_ver1.0Satoshi Kume
 
超簡単! インストールなしでRedmineを試す
超簡単! インストールなしでRedmineを試す超簡単! インストールなしでRedmineを試す
超簡単! インストールなしでRedmineを試すShin Tanigawa
 
超簡単!Apache SubverisonをWindows Serverにインストール
超簡単!Apache SubverisonをWindows Serverにインストール超簡単!Apache SubverisonをWindows Serverにインストール
超簡単!Apache SubverisonをWindows ServerにインストールShin Tanigawa
 

Mais procurados (20)

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

Destaque

The FizzBuzz Programing Contest
The FizzBuzz Programing ContestThe FizzBuzz Programing Contest
The FizzBuzz Programing ContestJunichi Ito
 
この素晴らしいSQLに祝福を!
この素晴らしいSQLに祝福を!この素晴らしいSQLに祝福を!
この素晴らしいSQLに祝福を!__john_smith__
 
絶対にぬるぽを出さない
絶対にぬるぽを出さない絶対にぬるぽを出さない
絶対にぬるぽを出さないyy yank
 
Kotlinソースコード探訪
Kotlinソースコード探訪Kotlinソースコード探訪
Kotlinソースコード探訪yy yank
 
Server Side Kotlin
Server Side KotlinServer Side Kotlin
Server Side Kotlinyy yank
 
Jvm言語とJava、切っても切れないその関係
Jvm言語とJava、切っても切れないその関係Jvm言語とJava、切っても切れないその関係
Jvm言語とJava、切っても切れないその関係yy yank
 
型についてあれこれ
型についてあれこれ型についてあれこれ
型についてあれこれYuta Shimakawa
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
ソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビューソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビューMoriharu Ohzu
 
Fizz buzz publish
Fizz buzz publishFizz buzz publish
Fizz buzz publishM I
 
時間をかけて解く FizzBuzz
時間をかけて解く FizzBuzz時間をかけて解く FizzBuzz
時間をかけて解く FizzBuzzKazuyuki CHINDA
 
2828_Forestry_Conference book for print
2828_Forestry_Conference book for print2828_Forestry_Conference book for print
2828_Forestry_Conference book for printManoj Neupane
 
U6 1er-grado-paginas-iniciales
U6 1er-grado-paginas-inicialesU6 1er-grado-paginas-iniciales
U6 1er-grado-paginas-inicialesMARGARET GAMARRA
 
Dificultades en el uso de las TIC
Dificultades en el uso de las TICDificultades en el uso de las TIC
Dificultades en el uso de las TICPablo Hdz
 
Guia de valoarcion de daño psiquico 2016 criminalistica
Guia de valoarcion de daño psiquico 2016 criminalisticaGuia de valoarcion de daño psiquico 2016 criminalistica
Guia de valoarcion de daño psiquico 2016 criminalisticaernesto tomas
 
Laplace ckt analysis with intial condition
Laplace ckt analysis with intial conditionLaplace ckt analysis with intial condition
Laplace ckt analysis with intial conditionsaravana kumar R
 
Your code sucks, let's fix it - DPC UnCon
Your code sucks, let's fix it - DPC UnConYour code sucks, let's fix it - DPC UnCon
Your code sucks, let's fix it - DPC UnConRafael Dohms
 
超大量トラフィックとAWSと私
超大量トラフィックとAWSと私超大量トラフィックとAWSと私
超大量トラフィックとAWSと私Noriaki Kadota
 

Destaque (20)

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

Mais de yy yank

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

Mais de yy yank (8)

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

Javaで最強のfizz buzz