「良いコードを書く技術」(習慣、名前付け、スコープ)

本当に良書でした。
自分の手元に置いておきたいです。。。
色々反省しまくりで(-_-;)内容をまとめておきます。

□習慣
とにかく、読め!書け!環境いじれ!自動化しろ!良い知識(本)知れ!アウトプットして人からレビューしてもらえ!とのこと。

読むというのは、
コード検索サービスでコードをリーディングしたり、書こうとしてるのに近いコードここで検索すると捗る。
Google Code Search
Koders

あと、ソースコードリポジトリ利用すると自分のコードをレビューしてもらったり、他の人のソース見れたりするので捗る。
GitHubが注目されてるとのこと。(まだ早い段階だと思うけど。いつかは見たり、出来たら上げれるようになりたい)

環境は統合開発環境なり、バージョン管理、OS(UNIX,MacOS)等弄ったりすると色々と知れて捗どる。
(今まで道具(環境だったり、OSだったりをないがしろにしてたので反省。
 開発環境で使ってない機能とかチューニングとか色々あるのでこれからどんどんいじっていこう。)

「部分的なプログラム」しか書けない(書かない)のは開発者として将来に大きなリスクを抱えていることになります。
ある程度の規模のプログラムを一から最後まで書けるようになって初めて、プログラマとしてスタート地点に立ったと思って良いでしょう。

□名前付け

名前付けがうまくできない時は、設計を見直したほうがよいことが多いのう。ふぉっふぉっふぉっ。(達人プログラマ

という場合もあるので、どうしても名前がつかない、つけれないよ(´Д⊂グスンってなったら少し見直すのも手。

基本的に説明的で意味・意図を表してる名前がやっぱり良い。
ただ、長くなりがちなので適度に省略したほうが見やすいしわかりやすい。

省略の仕方の例:
・先頭の数文字を残す。複数系の場合はsを付ける。(Separetors→Seps)
 でも、この場合(本の例だけど)はSeparetorsでもまだいいんじゃないかと思うけど、とにかくこんな感じで。

・ingの削除 とか
他、一般的に省略してもよくわかるの(image→img、Server→svr、database→db)等。

後は一般的なコーディング規約に沿うように。
javaだと
オブジェクト倶楽部
Sun Microsystems
等のサイトにコーディング標準載ってるのでそこを参考にして付けていく。

○メソッドの引数名
目からウロコ。
例えば updateItem(Item item, Account account)とか付けがちだけど、
updateItem(Item item, Account updater) にすると更新者のアカウントう情報を受け取りますよってのが
前者より見ただけでわかりやすい。

僕は引数でuserとか掲示板の作成時に書いてしまったりしたけど、
writerとかupdaterとかの名前で書いたほうがより分かりやすい!

○メソッド名
参考(よく使われる名前の例)
・生成に関するメソッド  create、build、make,generate
・初期化に関するメソッド Initialize、SetupXxx
・破棄に関するメソッド  destroy,dispose
・状態に関するメソッド  contains、exists       など(Java

メソッド名も長くなりがちなので、気を付けないと。
適度にわかりやすく、それでいて長くもなく意味がわかるもの。難しい。。。

○クラス名
参考になるのでこれ↓

□スコープ
スコープは保守性に大きな影響を与える!

スコープ=見える範囲=使える範囲=保存する範囲=影響を与える範囲

今までそんな意識したことなかったです(-_-;)

スコープは小さくするように心がけた方が良いとのこと。
メリット:依存性が低くなって、保守しやすくなる(・∀・)イイネ!!
     問題領域(影響与えてる範囲)が小さくなって理解しやすくなる(・∀・)イイネ!!

○変数
→変数は使う直前で宣言するようにする。(Cとかだと無理だけど)
 そうしたら、下手に最初の方で宣言してスコープ大きくなっちゃうこと防げる。簡単な方法。

→メソッドに抽出してみる。
 ある程度の固まりが出来たら、メソッドを抽出してみてその中にローカル変数ごと
 移動できれば元の処理の部分は変数から切り離されて(・∀・)イイネ!!

→変更しない変数はfinalを付けてしまう。これも比較的簡単。

・private,package private,protected,publicを使い分けることも大事。
 フィールド変数は基本的にはprivateで宣言。
 フィールド変数に外部や下位クラスのオブジェクトからアクセスする場合は
 ゲッタ、セッタなどのアクセサメソッドを用意するように書くこと。

 インスタンス変数もスコープは基本的にprivateだけれども、
 protectedとする考えもある。どちらがいいのかはわからない(-_-;)

○メソッド
インスタンスメソッドがpublicだと自由に呼び出せてしまうので
 (スコープが大きくなるので)本当に必要なものをpublicとして宣言するように心がけること。

・クラスメソッド
 インスタンスメソッドと記述はあまり変わらないが(Javaならstatic)
インスタンス変数みたいに自由にグローバル変数みたいに使うことが出来る。
 ※クラスメソッドはフィールド変数にアクセス出来ない。
 フィールド変数にアクセスする必要がなくオーバーライドなどの必要がないメソッドは
 クラスメソッドにしたほうが良い場合が多い。

・メソッドの引数の情報量
 できるだけ少ない情報(必要なものだけ)を渡すようにする。
 例えばユーザ情報を保持してる(ID、名前、パス等)インスタンスを引数に渡すのではなく
 IDしか必要ないのであれば、IDだけを引数にしたほうが良い。

例)UserクラスはUserIDの他にも色々情報を持っているとして。
  idCheck(int userID){〜〜} ○
  idCheck(User user ){〜〜}× 

ただし、引数があまりに多くなってしまう場合(目安は5,6個当たり)
インスタンス化して渡したほうがわかりやすいので適度な大きさで渡すよう心がけること。

○クラス
クラスの宣言ではpublicを使うことが多い。
だけれども、必要以上にアクセスされたくない場合
同じパッケージないからだけ参照して欲しい→package privateを指定等。

他、デザインパターンの考え方としてシングルトンパターン(※)として、
メインのクラス宣言はpublic、コンストラクタをprivateにして、他のクラスからインスタンスを宣言できないようにする。という考え方もある。

privateを使う目的は、上記のパターンを使用する場合とインナークラス(クラス内に定義されたクラス)を用いる場合。
GUIアプリケーションのイベントハンドラ定義などはprivateなインナークラスで実装することが多い。