Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Javaで最強のfizz buzz

3,548 views

Published on

第16回 渋谷じゃばのLT資料

Published in: Technology

Javaで最強のfizz buzz

  1. 1. Javaで最強のFizzBuzz 第16回 渋谷じゃば 2016/07/23 @yy_yank
  2. 2.           こいつです           ・小物SIer           ・viキーバインド好き           ・サクラエディタicon           ・JavaとKotlinが好き ヤンク(@yy_yank) 自己紹介
  3. 3. FizzBuzzとは
  4. 4. 3の倍数ではFizzを出力して、5の倍数で はBuzzを出力して、 両方の倍数(15の倍 数)の場合はFizzBuzzと出力して、それ以 外は数字をそのまま出力する処理のこと を言います FizzBuzzとは
  5. 5. なるほど
  6. 6. 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); } 適当にやるならこんな感じ
  7. 7. 特に説明は不要で すよね
  8. 8. 設計を考える
  9. 9. ・言語規約を守る ・適切なインターフェースを実装する Javaの設計で大事なこと
  10. 10. 3の倍数ではFizzを出力して、5の倍数で はBuzzを出力して、 両方の倍数(15の倍 数)の場合はFizzBuzzと出力して、それ以 外は数字をそのまま出力する処理のこと を言います 要件を改めて見る
  11. 11. 3の倍数ではFizzを出力して、 5の倍数ではBuzzを出力して、 両方の倍数(15の倍数)の場合は FizzBuzzと出力して、それ以外は数字を そのまま出力する処理のことを言います 要件を改めて見る
  12. 12. Fizz Buzz FizzBuzz Sonomama クラス構成
  13. 13. Fizz・・・fizzと出力 Buzz・・・buzzと出力 FizzBuzz・・・fizzbuzzと出力 Sonomama・・・そのまま数字を出力 なにをするか
  14. 14. Fizz・・・3で割り切れたら Buzz・・・5で割り切れたら FizzBuzz・・・15で割り切れたら Sonomama・・・3でも5でも15でも割り切れない どのタイミングか
  15. 15. よし、いけそう
  16. 16. じゃあ、どうやって 処理伝播をしよう
  17. 17. 投げよう
  18. 18. これが最強のクラス構成だ FizzBuzzPitcher FizzException BuzzException FizzBuzzException SonomamaException
  19. 19. FizzBuzzPitcher FizzException BuzzException FizzBuzzException SonomamaException これが最強のクラス構成だ 投げる
  20. 20. FizzBuzzPitcher FizzException BuzzException FizzBuzzException SonomamaException これが最強のクラス構成だ 投げられる
  21. 21. FizzBuzzPitcher FizzException BuzzException FizzBuzzException SonomamaException これが最強のクラス構成だ 持ちつ
  22. 22. FizzBuzzPitcher FizzException BuzzException FizzBuzzException SonomamaException これが最強のクラス構成だ 持たれつ
  23. 23. 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); } これが最強のピッチャーだ
  24. 24. 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); } これが最強の処理実行だ
  25. 25. 完璧ですね
  26. 26. いやチョット待て
  27. 27. おかしいおかしい
  28. 28. 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); } これが最強の処理実行だ このあたりが冗 長!!! #そこかよ
  29. 29. じゃあ、どうやって 冗長さをなくそう
  30. 30. AutoClosableを使 おう
  31. 31. FizzException implements AutoClosable BuzzException implements AutoClosable FizzBuzzException implements AutoClosable SonomamaException implements AutoClosable FizzBuzzCatcher これが最強のクラス構成だ
  32. 32. public class BuzzException extends RuntimeException implements AutoCloseable{ @Override public void close() { System.out.println(“buzz”); } } これが最強のclose処理だ
  33. 33. これが最強のキャッチャーだ 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)){} } }
  34. 34. 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 で処理が呼び出さ れる
  35. 35. これでインスタンス 生成するだけで標 準出力される ぞ!!
  36. 36. これが最強の処理実行だ // なんと呼び出し側は1行!!! for (int i = 0; i < 10000; i++) FizzBuzzCatcher.receive(i);
  37. 37. ・時として、人類は間違いをおかす ・誰かが止めなければならない ・例外は異常を伝えるために使いましょう ・例外をgoto文のように使ってはいけません ・AutoClosableインターフェースはクローズ処理を行うために使 いましょう ※ちなみにjava.util.stream.Streamも AutoCloseableです まとめ
  38. 38. ・言語規約を守る ・適切なインターフェースを実装する Javaの設計で大事なこと
  39. 39. 動けば良い、は 良くない!!
  40. 40. 時間が余ったら おまけ
  41. 41. これが最強のキャッチャーだ 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で直ってま す
  42. 42. 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)
  43. 43. [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

×