コードの焦げ臭さ

メルマガバックナンバー 2019/08/23発行

こんにちは、プログラミング書籍の館の江畑です。

今回のテーマはズバリコードの焦げ臭さ(こげくささ)です。

「焦げ臭さ」ってなに?
それはプログラミング中に「あ、このままだとヤバいぞ」という予兆の事です。

早く焦げ臭さに気付かないと、後になってコードが極上のカオスを起こします。
逆に言うと直ぐに察知できれば、問題の発生を未然に防げるわけです。

今回はそんな焦げるパターンをいくつか紹介したいと思います。
「プログラミングあるある」みたいなノリで読んで貰えれば嬉しいです。

私も偉そうなこと言える立場では無いので、反省も込めながら。。。

コードの焦げ臭さ

コピペ、コピペ、コピペ、

とりあえずコピペして直して動かす
 ↓
あとで関数化・共通化しよう
 ↓
でも面倒だから放置だ放置

こんな事した経験ありませんか?
私は数え切れない程やってます…

もちろんこれを繰り返すとカオスになります。

ちゃんと共通化するのがベスト!
んなことは分かってます。

でも分かっていても、共通化の実装(関数作ったり、クラス抽出したり)とテストで時間を取られるのが嫌なんですね。
特に期限が迫っているときは、共通化してる暇なんてありません。

そのジレンマとどう向き合うか?

前にもメルマガで話しましたが、私はコピペは2回(==重複3箇所)まで許すという妥協策を取ってます。
なお根拠は一切ナシ!の経験則です。
仏の顔も三度までにちなんで、3をブッダナンバーと勝手に呼んでます。

興味のある方は、こちらのバックナンバーコピペはどこまで許される?もご覧下さい。

どんどん長くなる引数

関数やメソッドの引数がどんどん多くなって、ややこしくなる。
そんな現象です。
省略可能な引数ならまだマシですが、必須のやつだと気軽に呼べなくなりますね。

こういう場合よく行うのがオブジェクト化です。
簡単に言うと、関連する引数をまとめて構造体やクラスにする方法です。

例えば start と end をまとめて Range(範囲)を定義するみたいな。

ただこれも一長一短で、モジュール・クラス間の依存が高まるデメリットがあります。

これまで色んな本を読みましたが、どの著者もこの「どんどん長くなる引数」の明解は断言できない様子でした。
だから単純ですが奥の深い問題と言えます。

結局の所、その時々の状況によってオブジェクト化する、という事になるでしょうか。
うーん実にあいまい。

ちなみに DirectX9 の D3DXCreateFont関数 には引数が11個もあります。
さすがにコレは何とかして欲しかった…

フラグが多すぎる問題

ソースの中にフラグが多くなってくると危険です。これはマジです。

大雑把な言い方ですが、フラグは「例外措置」みたいなものです。
これが目立って増殖すると、例外がこんがらがって制御不能になります。

特に、if文の中で更に別のフラグを設定するケースは危険な兆候です。
if(フラグA){
 フラグB,フラグCを設定
}

またフラグのtrueとfalse両方にデカい処理ブロックがあるのも、かなり怖いです。
if(フラグ){
 デカい処理ブロック
}
else{
 デカい処理ブロック
}

初心者ほどやってしまいがちなので、気を付けて下さい。

対策はアルゴリズムを見直すこと、これに尽きます。

私の経験上シンプルなアルゴリズムにすれば、フラグの数は大きく減らせます。
この「シンプルさ」を保つというのは、本問題に限らず、カオスを防ぐ本質です。

修正の散弾銃

軽微な変更(例えば文字サイズを変えるとか)するだけなのに、あちこちに修正が必要になっちゃう現象です。

むかし私はウィンドウの位置を変えても、ボタンが元の場所に居続けるコードに出会った事あります。

この場合はデータ構造やクラス設計を見直す必要があります。
関連するデータを同じオブジェクトに集める、関数やメソッドを移動する、共通部を抽出するなど

出来るなら一つの機能は、一箇所(1クラス、1モジュール、1メソッド)の修正で済むようにしたいものです。

まあ既に組み上がってるものを保守する時は、そうも行かないんですけどね。
仕事では盛大にカオスってるソースを、ポンと丸投げされることもありますから…

おすすめ書籍

以上「コードの焦げ臭さ」について4つ紹介しました。
もちろんこれだけでなく、他にも様々なパターンがあります。

もっと色んなケースと対策を知りたい方には、以下の書籍をオススメします。
どれも歴史的名著なので、パラパラ拾い読みするだけで役立ちます。

リファクタリング~既存のコードを安全に改善する~

コードコンプリート~完全なプログラミングを目指して~

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

Twitterハイライト

こんな事つぶやきました

レトロゲームとアダルト描写の関係 

ゲーム広告と謎の子供

8730通から選ばれた8人

マジでよく分からんカプコンの広告

ファミコンに吹いた奇跡の追い風

クイズ昭和のミステリー の答え

さて、前回出題したクイズ昭和のミステリーの答えです。
こんな問題でした。

ある年の12/25、OLのAさんが何者かに殺された。
警察がAさんの部屋を捜索したところ、手紙を発見する。

そこには
「12/25の18:00に緑広場で待ち合わせましょう」
と書いてあった。

さて犯人は次のうち誰か?推理して欲しい。

1:栗山 学 大学生
2:橋田 清 消防士
3:石元 健一 駅員

正解は3の石元健一(駅員)でした。

その理由は
 午後6時を18:00と呼ぶのは駅員だから!
です。

あ、物を投げないで下さい…
トホホな答えですが、マジで昭和の本にあった問題なんです。

なお今回は正解した方はいませんでした。反省してます。

ちなみに興味深い解答として
 犯人は1の栗山学(大学生)
 理由:学生にはOLの良さが分からないから
というのがありました。

うむむ、妙な説得力を感じる。

ろんりが!キャンペーン

では今回のクイズです。

私が作ったろんりが!というブラウザゲームを使ったキャンペーンです。

——————–
【問題】
このゲーム、全40面をクリアするとスタッフロールが流れます。

その中で一つだけ他と色が異なる単語があります。
さて、その単語とは何でしょうか?
——————–
※1回クリアするとスタッフロールは何度でも見られます

ウソみたいだろ…
このクイズをやりたいがために、開発から仕込んでおいたネタなんだぜ。

ただ自分でプレイしても後半のステージは超絶な難易度なので、人類には早すぎたような気もしてます…
果たしてクリア者はいるんだろうか。不安になってきたぞ。

分かった猛者は本メールに返信してご応募下さい。
※募集は終了しました

正解した方の中から抽選で3名様に、Amazonギフト券コード(キャリーオーバーで1000円)を送信致します。
1人しかいなかったら、3000円は総取りです。

今回はここまでです。読んでいただきありがとうございました。

プログラミング書籍の館 江畑


もっと知りたい?
C言語_初級 | C言語_中上級 | C++_初級 | C++_中上級 | C#_初級 | C#_中上級 | Java_初級 | Java_中上級 | コンピュータ_サイエンス | アルゴリズム_ | ゲーム_プログラミング | DirectX_ | Unity_ | ゲーム_デザイン | ゲームのしくみ_ | 数学_ | プログラミング_テクニック | 歴史_偉人 | ソフトウェア工学_ | 読み物_エッセー | 人生_生き方 | 創造_発想 | 雑誌_ | 漫画_小説_映画 | メルマガのバックナンバー_

無料メルマガ たのしくやってます

読むだけで使える!プログラマーの裏技と考え方

読むだけでプログラミング力が上がる
上辺の技術ではないプログラミングの本質が分かる
ビギナーからプロのゲームプログラマーまで幅広い方が購読しています

つまり、登録して一緒にプログラミングを楽しもうぜ!
ってことだよ。言わせんな恥ずかしい。


登録完了メールが届きます
届かない場合は迷惑メールフォルダや設定を御確認下さい(Yahoo!メールにて発生)
powered byメール配信CGI acmailer

Kuniaki Ebata 登録者

大学中退(文系)の専門卒 日本で唯一のプログラミング書籍評論家
プログラマーで現役のスキー国体選手です
頭と体を動かすのが大好きなフレンズなんだね 専門学校で先生もやってます
プログラミングは21歳から
貴族じゃない独身

持病:重度うつ病(薬とサポートのおかげで何とか生きてます)

教え子をゲーム業界へどんどん送り込み、世界を面白くする野望を実現中

プログラミングが上達するメルマガやってます

ここを見たゲーム業界の卒業生へ
新作が出たら、連絡するか現物を送ってくれると嬉しいです
ただし18禁・CERO-Dの場合は、厳重に梱包の上、品名をパソコン部品にて送る事(だいじ)

このページが参考になった方へ
ぜひSNSやブログでシェアして欲しいです お願いします(少し上にボタンあります)
最近Google先生が中身の無い「いかがでしたか?」サイトを優遇するので困っています助けて下さい(>_<)

シェアしてくださった方には
小冊子 プログラミング書籍が10倍わかる読み方(pdf)
を差し上げます
こちらからご報告頂くか、こっそりDMを送って下さい