リーダブルコード読書メモ~その5~
こちらの続きです。9章、10章を見ていきます。
9章は変数についてです。8章で変数を適度に定義する、という話をしましたが、目的が微妙だったり、そもそもいらなかったりする変数はないほうがいい、ということで、そのあたりをどうすればいいか、が出ています。
9章
- 不要な変数は削除する
- 無意味に代入している変数 以下のnowは別に分ける必要もないですよね。
now = datetime.now() hoge.last_view_time = now
だから1行にする
hoge.last_view_time = datetime.now()
中間結果的に使う変数の削減
- その中間結果は本当に必要か吟味する
- 「配列に対して、ループで条件に当てはまった配列要素を削除する」という場合「条件に当てはまったインデックスを中間的に変数で保持→後にそのインデックスの要素を削除」するのではなく「条件に当てはまった配列要素を直接削除」すればよい。
- インデックスを中間的に保持するのは不要(ループ変数をインデックスに合わせて削除していけばいい)
- 「配列に対して、ループで条件に当てはまった配列要素を削除する」という場合「条件に当てはまったインデックスを中間的に変数で保持→後にそのインデックスの要素を削除」するのではなく「条件に当てはまった配列要素を直接削除」すればよい。
- その中間結果は本当に必要か吟味する
変数のスコープを縮める
- グローバル変数を避けるのはもちろんのこと
- ローカル変数について、クラス全体の定義をメソッド内に何とか落とし込めないかを検討する。
- 例えばメソッドの引数をうまく使う
- いっそのこと、クラスを分割してみる、なども考えてみる。
- 変数は先頭に一気に定義するのではなく、使う直前で定義すると、コードを行ったり来たりしなくていい
変数は一度だけ書き込むようにする
- constなど定数定義をうまくつかう(定数にすることで、書き換えてはいけない、ということを明示できる)
次10章です。無関係の下位問題の抽出、というタイトルです。端的に言うと、メソッドとして細かく切り分けていきますが、その際に「メソッドがやりたいことと、中の処理の関係性」に着目します。
10章
別メソッドに切り出してもいい場合(例えばループ内における値の算出など)は切り出すことでコードの見通しがよくなる
- さらに、そのメソッド単独でテストもできる
ユーティリティコード
- 標準ライブラリの不足を補うようなコードも同様(ファイルを読み取り時にちょっとした独自処理をしたいケースなど)
- プロジェクト全体の共通コードとしても利用できる
- 標準ライブラリの不足を補うようなコードも同様(ファイルを読み取り時にちょっとした独自処理をしたいケースなど)
インタフェースを簡潔にする
- ラッパー関数を作るといい。引数は少なく、簡潔なものとする
終わりに
9,10章と駆け抜けました。量もそんなに多くなく、一般的に言われていることが中心でした。そのため記載もあっさり目ですw
9章では、適切に変数を設定する、ということが中心でした。条件式の中で複雑な計算をしない、不要な変数は削減するなどは言うは易しですが、心がけないと中々難しいのかなと思いました。
10章は複雑な処理はメソッドに切り出す、という内容でした。これも言っていることは当然ですが、中々気を付けないと厳しいところになります。新規開発より保守をしていると、気がついたら一つのメソッドが膨れ上がる、みたいなことに陥るので特に注意ですね。