SlideShare une entreprise Scribd logo
1  sur  46
Télécharger pour lire hors ligne
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

Contenu connexe

Tendances

Eucalyptus on OpenStack
Eucalyptus on OpenStackEucalyptus on OpenStack
Eucalyptus on OpenStack
irix_jp
 
(初心者向け) Vim の機能紹介@nagoya.vim #1
(初心者向け) Vim の機能紹介@nagoya.vim #1(初心者向け) Vim の機能紹介@nagoya.vim #1
(初心者向け) Vim の機能紹介@nagoya.vim #1
cohama
 
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
Satoshi Kume
 
fanscala1 1 インストールとreplまで
fanscala1 1 インストールとreplまでfanscala1 1 インストールとreplまで
fanscala1 1 インストールとreplまで
Toshiki Shinozaki
 
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
 

Tendances (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にインストール
 

En vedette

オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
 
ソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビューソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビュー
Moriharu Ohzu
 
2828_Forestry_Conference book for print
2828_Forestry_Conference book for print2828_Forestry_Conference book for print
2828_Forestry_Conference book for print
Manoj Neupane
 
U6 1er-grado-paginas-iniciales
U6 1er-grado-paginas-inicialesU6 1er-grado-paginas-iniciales
U6 1er-grado-paginas-iniciales
MARGARET GAMARRA
 
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
ernesto tomas
 

En vedette (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と私
 

Plus 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 リリースを前に
 

Dernier

Dernier (7)

新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 

Javaで最強のfizz buzz