続々:僕の好きなコードの書き方

これの続きです!

レビューしてもろた!

そっこーでコメントくれてた!確かに確かに!

なるほどですなー。

あと、@ にも「お邪魔したいのでテストコードも晒さないかな、ちらっちらっ」ってコメント頂きました。

レビューしてもらうの楽しい!((((;゚Д゚))))

てことで、本当は今日のアサコザケ( #asakzk )は実践DDDを読もうと思ってたのだけど。コード書こっと。
アドバイスを踏まえて、ね。

注意点

ゴールが決まってるわけじゃなくて、試行錯誤しながら進むので、その途中で「ほほー!こういう風にやるのが正解なのか!」って思わないようにね。
最終的に「やっぱあんときのあのメソッド切り出しはナシだわ!」ってなる可能性も高いです。

※ 初心者の方向けのコメントです。途中経過だけ読んで「なるほど!」って鵜呑みにすると申し訳ないので。
※ 自分の中に答えがある人は、適当に(・∀・)ニヤニヤしたりコメントくれたりするとうれしす。

今日はここから

前回メソッド切り分ける前までやったのでここからです。できれば最後までいきたい。切られるなら一回でスパッと・・・


メソッドを切り出してみよう

じゃ、ちょこちょこメソッドを切り出してみよう。まだ特に名前は考えない。

戻り値の生成部分をまとめられそう

んー。まぁ、異常系っぽいとこはもうちょいまとめられそうだけどね。とりあえず進もう。

最初のforループをメソッドに切り出してみようかな

ここね。

      List<Integer> coins2 = new ArrayList<>();
      int sum = 0;
      for (Integer coin : in.getCoins()) {
        if (coin == 1) {
          sum += 0;
          coins2.add(coin);
        } else if (coin == 5) {
          sum += 0;
          coins2.add(coin);
        } else if (coin == 10) {
          sum += 10;
        } else if (coin == 50) {
          sum += 50;
        } else if (coin == 100) {
          sum += 100;
        } else if (coin == 500) {
          sum += 500;
        }
      }

ちょっと悩むんだけど、いっかい切り出してみようかな。

戻り値の型を作って、sumとcoins2を返すのもいいけど、パラメータでcoins2のインスタンスを渡してみる。
もし、このまま最後までいくことになったら、やっぱり型を作るかも、と思いながら。


次のforループも考えてみる

これ切り出してみようかな。

        sum -= product.getPrice();
 
        List<Integer> coins3 = new ArrayList<>();
        coins3.add(500);
        coins3.add(100);
        coins3.add(50);
        coins3.add(10);
        for (Integer coin : coins3) {
          while (sum > coin) {
            coins2.add(coin);
            sum -= coin;
          }
        }

あれ・・・。まぁ短くはなったけど、読みにくくなってきた気もする(;・∀・)。

最初の2つのifの中身もメソッドに切り出してみようかな

僕がメソッドを切るときには2つの場合があって。

  • 1つは、同じ処理を1箇所にまとめたい場合。
  • もう1つは、処理に名前を付けたい場合。

Resultの作成メソッドの切り出しは、前者の。それより後は、後者の意図で切ってるかな。
あ、あとテストしたい場合に切ることもあるかな。じゃ、3つの場合だ。

一旦立ち止まって考える

さて。これで、僕も全体の流れを見れるようになりました。で、いくつか気づく点がありますね。
って、既にきしださんが書いてくれてる!

price < sumのほうが正常系なんだから先に異常系を抜けるべき

前回までは、メソッドが長かったから気づいてなかった!ifの中が正常系で、最後までいくと異常系なんだってことに!
逆を取るのに、不等号逆にすればいい気がするけど、一旦考えるのをやめて単純に「!」使っちゃいます。

メソッド切っちゃおうか。なんとなく。


最初のthrowがただのgotoになっててバグぽい

はっ!
最初の入力チェックでIAE投げてますが、これが一番したのcatchで捕まえられてますね。
んで、しかもそのなかでin.getCoins()使ってる。これ、意図した通りなのかな・・・?
どういう実装にしたらいいんだろう?

・・・ってところで今日もターイムオーバー!!(ノД`)シクシク
名前は考えない、って言いつつも、考えがなさすぎて困った。
また次回!

追記

続きかいた。

bufferings.hatenablog.com