あえて作ったバッドなプログラムを修正してみただけのおはなし

突然ですが問題です~
これは何をしているプログラムでしょうか?(pythonのプログラムです)

 

これは何でしょう?

 

正解は…fizzbuzzのプログラムでした~

なんでこれを作ったのかと言いますと、
プログラムって色々ルールがあったり、
きれいにみせるためのHowtoとかいろいろあるじゃないですか?
例えばこの本とか…

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

じゃあ、逆に分かりづらく書いたらどうなるかな?と思いまして、
作ったのが先ほどのプログラムになります~
ポイントとしては

  • 意味のない名前できたグローバル変数

  • 揃っていない行間・空白

  • 不要なコメントをつけ、必要なコメントを付けない

を意識した結果になります~
ホントはもっと分かりにくく作りたかったけど、
cacaponとしてはこのくらいしか思いつきませんでした… 

さて、作ってみた結果ですが…
ん~まだ読めるかなって感じですかね?
ただ、これは二十数行のコードだから読めますけど、
これが1000とか2000とか増えて
こんな感じだったらと思うと...恐ろしいですね。

これに複数個所で編集できちゃう変数tmpとか
マリアナ海溝並みに深いネストとか
他にもきっと私が知らないトンデモプログラムが世の中にはあるのでしょう… 

 

これを作っただけでも「きれいに書きましょう」
というのは必要だなぁというのは再認識できました~

でも、このままで終わりはちょっともったいないかなと思いまして、
折角だからこれを修正してみましょうか~

 

修正1:名前をしっかり付けてみる

まず目につくのがfuncとvarですね。
皆さん、書くときにそんな名前つけてませんか?

命名するときはその役割をちゃんと意識した名前にする必要が
あると思うんです。

そんなわけで英語が苦手なcacaponがうんうん唸った結果…

修正1

 

 こんな感じになりました~
fizz_buzzの使う単語、何番目かを表示するためのcount、
後は冒頭で何番目から何番目までを表示するか指定できるようにもしました~

名前を整えた時に不要な変数を消したり、処理も一部すっきりさせたので、
これだけでもだいぶすっきりした見た目になったかなぁと思います~

修正2:適切なコメントに切り替える

 

皆さんプログラムにコメントってつけてますか?
私はなるべくつけてます~

でも、意味のないコメントつけてませんか?
今回のだと、「指定した数値その1からその2まで繰り返す」とか
「countが3だったら」とか
プログラム見たら分かることを書いているんですよ。
それだと意味ないですよね?

という訳で修正したのがこちら

修正2

私がコメントを付けるときに意識しているのは、
「こういう風に実装したんだ」という思考のメモと
後で見返したときに分かりにくそうだなと思ったところ、
ここを直しておきたいなぁというところにコメントを入れてます~
あとは、この関数は何をする関数か?ってところですかね?

TODO:とかの書き方とかはリーダブルコードを参考にしています。
意味としては、後で手を付ける、って感じですね~

 


修正3:体裁を整える

 


今回わざと、文字間隔を揃えてなかったりしたのですが、
これをするだけでもだいぶ見やすくなります。
この辺に関しては、pythonだとpep8があったり、
社内ルールでコーディング規約があったりするので、
それを確認して順守すると良いかなぁと思います~

パブリックなコーディング規約だったりすると
自動で体裁を整えてくれるツール(例:pythonだとautopep8)
とかもありますので、探してみるといいかも。らくちんですし…

そんなわけで整えたのがこちら

修正3

 

最初と比べるとだいぶ見違えたかなと思います~

余談ですが、体裁を整えるのはコーディングよりも、
GUIのプログラミングの方が比重が大きいかなと考えています~

UE4のBluePrintのように、パーツを組み合わせて
ロジックを組み立てるプログラミングを使っている人などは
特に意識したほうが良いんじゃないでしょうか?



修正4:TODOにした機能を追加してみる

 

これは一通り終わった後の話ですが、
折角TODOが出てきたので直してみました。

修正4

 

作った後で思ったのですが、これは悪い例だと思います。

何故なら、最初のTODO以外の対応も入っているからです~

 

なんでこうなったかというと、

とりあえず数字を変えられるようにしたいなと思いまして、
数字用の配列を用意しました。

その後、「ん?どうせなら紐づけられるといいんじゃない?」
と思い、辞書型に変更し、
辞書型に「fizz,buzz,fizzbuzzって入れたところあとで変えたいなぁ」
と思ったところ、wordの配列の値を辞書型に入れるようにしました。

その後、冒頭で変えられるように…


とかなんとかやっていくうちに先ほどの形になっちゃいました…

直していくとどんどんいろんなところに目が行くので、
色々修正したくなっちゃいますが、
直す場合は一つの機能に絞りましょう~
それが終わったら別の機能に取り掛かりましょう~
 

そして分かりやすさに関してですが、
汎用性が上がった分、分かりにくさは上がったかなと思います~
「"fizz"が3の時」より「単語Aが数値Bの時」の方が
抽象的で分かりにくいですよね?

この辺はトレードオフな部分になるのかなと思いますので、
作る時に何を重視するのかを頭の片隅に置いていくと
良いのかもしれません~

さて、まだまだいろいろ出てきそうですが、終わりがなさそうなので、
一旦これで区切りたいと思います♪

汚いコードからきれい?なコードにしていくのをやってみて
改めてきれいなコードを心がけるのは、
後々の見やすさや修正のしやすさを考えると
大事だなというか基礎中の基礎みたいな感じなんだろうなというのが
cacaponの感想です~

疲れてきたり、修正に重なる修正があると
汚いコードになりがちですが、意識してきれいなコードを
保てるようにしたいなぁと思う、今日この頃のcacaponなのでした~