読者です 読者をやめる 読者になる 読者になる

こすげのブログ

金髪エンジニアのブログ

【読書】「Code Complete 第2版 上 完全なプログラミングを目指して」の感想 その7

はじめに

今回は第3部 変数第12章 基本的なデータ型から第13章 特殊なデータ型までを読みました。

第3部 変数まで読み終えました。

昨日は腹痛で横になっていたため、読書もできませんでした...。

今回はデータ型について書かれいました。

まあ章のタイトル読めばまんまじゃんっていう感じなのですが...。

いろいろあるデータ型の意味や使い方など...。

当たり前なことばかり書いてありましたが、知っていることを確認できて良かったです。

今回で73%の読了率でした。あとちょっとで終わります(上巻ですが...)

Code Complete 第2版 上 完全なプログラミングを目指して

Code Complete 第2版 上 完全なプログラミングを目指して

ハイライト

今回はそこまで多くありませんでした。

そして確認の意味を込めたやつが多いです。

第12章 特殊なデータ型

■「マジックナンバー」を使わない

マジックナンバーとは、プログラムのどこかに説明なしで使われている100や47524といった数値リテラルである。

名前付き定数をサポートしている言語でプログラミングする場合は、マジックナンバーではなく名前付き定数を使用すること。

名前付き定数が使用できない場合は、最後の手段としてグローバル変数を使用する。

12.1 数値全般

これ、インターン生によく言います。

ここの値をこれに変えてみて?って言うと結構険しい顔をするのを覚えています。

至る所で使わないようにあるクラスに隠蔽しておく手段などを紹介します。

あとは広告のIDの宣言のする場所とかですね。

広告IDはStringであることがほとんどですが、使うところで毎回そのまま使いがちではありますが、マジックナンバーと一緒で好ましくありません。

なので、定数として宣言したり設定ファイルにまとめておいたりと分けることのメリットを教えるようにしていました。

マジックナンバー、大っ嫌いです。


■ブール変数を使って複雑な評価を単純にする

複雑な評価をコーディングする際、正しい結果を得るために試行錯誤が必要になることが多い。

後で評価の式を変更しようとして、何を評価しているのか皆目検討がつかなくなってしまうこともあるが、ブール変数を使用すれば、評価を単純なものにできる。

12.5 ブール変数

これはif文の中に全ての条件式を書くことがソースコード解読につながると書かれていました。

であれば、ステータスごとにブール変数を宣言して、分かりやすい結果として変数をifの中に書くことがいいというとこでした。

よく僕もif分の中にいろいろな条件式を書いてしまうので、直そうと思った部分でした。


名前付き定数を使用することは、プログラムを「パラメータ化」する手段である。

12.7 名前付き定数

今後定数を簡単に説明するときはこの言葉を使おうと思いました。


■たとえ「安全な」ものであっても、リテラルを使用しない

リスト12-23のループで、12は何を表しているだろうか。

/// リスト12-23 明確でないコードの例 (Visual Basic)
For i = 1 To 12
   profit( i ) = revenue( i ) - expense( i )
Next

このコードは特徴的なので、1年の12か月をループで処理していることはだいたい想像がつく。

だが、それは本当だろうか。

Monty Pythonのコレクションを賭けても大丈夫だろうか。

この場合、名前付き定数を使って柔軟性を強化する必要はない。

近い将来、1年の月の数が変わる可能性はまずないからだ。だが、このコードはその目的に疑いの余地を残すような書き方になっている。

これを良い名前の付いた定数で書き換えると、リスト12-24のようになる。

/// リスト12-24 より明確なコードの例 (Visual Basic)
For i = 1 To NUM_MONTHS_IN_YEAR
    profit( i ) = revenue( i ) - expense( i )
Next

コードは良くなったが、ループ変数も情報源になるような名前にしなければ、完璧とは言えない。

/// 12-25 さらに明確なコードの例(Visual Basic)
For month = 1 To NUM_MONTHS_IN_YEAR
    profit( month ) = revenue( month ) - expense( month )
Next

コードはだいぶ良くなった。列挙型を使ってもう一押ししてみよう。

/// 12-26 非常に明確なコードの例(Visual Basic)
For month = Month.January To Month.December
    profit( month ) = revenue( month ) - expense( month )
Next

リスト12-26のコードなら、ループの目的に疑いの余地はない。

リテラルが安全なものであることがわかっていたとしても、代わりに名前付き定数を使用しよう。

12.7 名前付き定数

という手段を紹介していたので、全部ハイライトしてみました。

こうやってソースコードは読みやすくなっていくんだなーって思いました。

僕はVisual Basicを使ったことがないので、ソースコードはまんま書き写させていただきました。

第13章 特殊なデータ型

構造体の1つか2つのフィールドだけが必要である場合、構造体を引数として渡すことはせず、必要なフィールドだけを個別に渡す。

これは情報隠ぺいの一例である。ある情報はルーチンの中で隠され、ある情報はルーチンから外に対して隠される。

こうして、情報は「知る必要がある」ものかどうかに基づいてやり取りされる。

13.1 構造体

Swiftを使うようになって構造体(Struct)に触れるようになりました。

今までClassのみで生きてきたので、いろいろ調べながら勉強して楽しかったのを覚えています。

このハイライトは引数の話でしたので、おぉって思ってハイライトしました。

感想

第13章でCのポインタについての説明とこうするといいよっていうやつがありました。

恥ずかしながらポインタとかに触れたことがないので、とても新鮮でした。

仕事でやりたいとは思いませんが(挫折したりなんたりっていい話を聞かないので...)触ってみたいなって思いました。

Code Complete 第2版 上 完全なプログラミングを目指して

Code Complete 第2版 上 完全なプログラミングを目指して

終わりに

最近Amazon ビデオでベイブレードが見れるようになってて、結構見てしまっています。

ちょうど小学生の時にやっていたもので...。

そしてアマゾンで調べても新しいのしか出てこない感じ...。

時代なんですかね...。

以上です。