リファクタリング プログラミング

あなたが読み難いコードを書いてしまう理由

投稿日:

はじめに

読みやすいコードを書きたい人と願う方のために執筆しました。
誰もが良いコードを書きたいと願っているはずだからです。(と私は信じています)

というもの、後で自分が読み直した時、誰かにレビューを依頼する時、逆に自分がコードレビューを依頼されたときなど、読み難いコードはそれだけでイライラするし、仕様を読み解くのに時間がかかって頭を抱えることになるからです。

そういう経験はありませんか?
 

私の経験

私にはこんな経験がありました。

私は設計書を渡されて、実装を行なっていました。
設計書に目を通しロジックを確認すると、2次元配列としていたデータは3次元配列で保持する必要があることに気づきました。

発注元にも確認し、3次元配列であることは明確になりました。
ただこれはどう考えてもArrayIndexOutBoundsExceptionを引き起こす可能性(嫌な臭い)がしました。

私は独自のオブジェクトを定義することを提案し、完全コンストラクタでオブジェクトを生成するように変更しました。
保持するデータは変えず、保持する方針のみを変更したのです。

結果、データを扱うことがとても簡単になりました。
もし3次元配列にしていたら、デバッグも出力処理の実装ももっと大変になっていたに違いないと、今でも思っています。
 

読み難いコードを書く人

そのプロジェクトでは、発注元が他の会社にも発注していました。
つまり、私の会社を含めて複数の会社で設計書を分担して実装していたのです。

結合試験工程で、私の会社は他の会社の結合試験を一部引き受けることになりました。
他の会社の進捗が遅く、少しでもいいから対応してほしいということでした。

バグが出てきてコードを追いかけると、とんでもないものを目にしました。
・ロジックの重複
・配列の嵐
・if文の中に長文の判定文(2行以上もありました)

これらは以下のちょっとしたテクニックで対処できるものばかりでした。
・privateメソッドにロジックを移して流用できるようにする。
・配列はオブジェクトにして入出力とデータ保持を簡潔にする。
・判定ロジックをメソッドに移し、メソッド名で判定内容を明示する。

おそらく他の会社の実装が遅延したのは、これらのほんのちょっとした手間を惜しんだことによるものだと思います。
私の会社では私を筆頭に、ほんのわずかな工夫を所々に取り入れることでロジックが肥大化しすぎないようにし、ロジックを簡潔に保つように意識していました。

もちろんそのおかげで実装に多少の時間はかかったものの、バグの発生は適度に抑えられ、バグ修正に思った以上の時間を費やすということはありませんでした。

私の会社とその会社の違いは、ほんのわずかな読みやすさ、修正のしやすさにこだわったか?」だけでした。

ここを妥協する人が読み難いコードを書いてしまうのです。
 

読みやすいコードを書けるようになるには?

あなたはどちらでしょうか?

・与えられた設計書通りに実装することだけを考えて、コードの読みやすさや、修正のしやすさは後回しにするのか?

・多少時間がかかっても、小さくてわかり易いロジックを丁寧に実装していき、バグの発生を抑えつつ、修正をしやすいようにするのか?

……

 

聞くまでもの無く、誰もが後者を選ぶはずです。
でも、それをどうやって身に着けるのか?
それを学ぶためにこれがあります。

全てのをノウハウがすぐにできるようになるわけではありませんが、日々の仕事の中で、少しずつ改善を加えていく努力が実を結びます。

今のコードの現状を変えたい(自分自身やチームのために)のであれば、これを手に取ってみて下さい。
読みやすいコードを書くための学び

 
最後までお読み頂き、ありがとうございました!
ご意見・ご要望がありましたら、遠慮なくコメント下さい!
もし内容が良かったらランキング評価を頂けると励みになります(^^)

ランキング評価する

-リファクタリング, プログラミング
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


関連記事

【Bootstrap】共通ヘッダーをナビバーとしてデザインしよう!

概要 ヘッダーをナビバーとして実装します。 (SpringBootチュートリアルの共通ヘッダーを基に解説していきます) また、デザインはBootstrapのサンプルを基にしていますので、 そちらも一度 …

【Java入門】Predicateの使い方まとめ

概要 Predicateはtestメソッド持つ関数型インターフェースです。 引数を1つ受け取り、booleanを返します。   基本的な使い方 test(T t)には、ジェネリクスに指定する型を引数と …

【Java入門】クラスとインスタンスの違いを分かり易い言葉で説明します。

概要 クラスとインスタンスの違いについて、できるだけ分かり易い言葉や表現で説明します。   クラス 設計書だよ。 以上です。 ほんとマジで。 どんなデータと操作が可能かを決めているだけなので設計書と表 …

Facadeパターンの使い道をコードとクラス図で説明します。

Facadeパターンはどんな役に立つか? 簡単にいうと、複数の処理のまとめ役。 なので、依頼1つでいろんな仕事をやってくれる点で役に立つ。 Facadeパターンの要件 Facadeクラスはあくまでサブ …

ExcelをA1セルに揃えて拡大率100%にするツール

(追記:2021年8月18日) サブフォルダを処理対象にするかどうかを選択できるように改修しました。   たくましゅくじょさんのところで公開されていた、 「エクセルで全シートの拡大率を100%にしA1 …

記事を探す

SpringFramworkの良書

■おすすめ教材
Javaの基本を学んだ人が、次のステップとして読む本(中級者向け)

※SpringはJavaのFrameworkの1つです。
変更のしやすさ、保守性の高さが特徴です。

サイト内検索