概要
Ruby や Python などいろいろとリファクタをしていて感じたことをまとめておきます
言語の特性によってできないこともありますが考え方自体はどんな言語でも通用すると思います
とにかくクラスにする
管理する単位がしっかりするのでコードがすっきりする
DSL やデコレータと相性が悪いが可能な限りすべてのコンポーネントをクラス化したほうがいいと思う
重複を排除する
これも単純な話で同じコードを複数の箇所に書かないようにする
メンテナンス性も上がるしコード量も減るのでキレイなコードになる
理想はメソッド名や引数を直したときに一箇所だけ修正できるようなコードになっているのがベスト (なかなかそうはならないが)
IDE などを駆使すればそこまで大変にはならないが可能な限り減らすように意識する
親クラスを使って継承したりファクトリなどを使って同じ処理をまとめることで解消できる
1つのファイルに長いコードを書かない
一つのファイルには一つのクラスだけ定義するようにする
どうしても同じファイルに書きたい場合はそのファイル内でしか使わない内部クラスなどを書く
それ以外は基本的に1クラス1ファイルにしたほうが管理上よくなると思う
1つのファイルに複数のクラスを書くことを許してしまうとせっかくクラス化されているのに巨大なファイルができてしまいメンテナンス性が落ちる
モジュールのインポートなどは1つのファイルの方が楽ではあるがそれよりもいいことはおおいはず
コメントやインデント改行をちょっと工夫するだけでもいい
リファクタリングは端的に言えば第三者が見たときに見やすいコードだと思ってもらえればどんな修正でもリファクタリングになる
なのでコメントを入れて関数やその行の意味を説明してあげるだけでもOK
とにかく自分じゃなくて他人が見てどう思うかを考えてリファクタリングする
リファクタするタイミング
リファクタリングはいつでもできるがタイミングは決めたほうがいい
そうしないと機能開発とのコンフリクトが発生し大変なことになりがち
リファクタリングの粒度は大きめのほうがいいと思う
一気にやるイメージがいい
機能開発を最初にがーっとやってその後でリファクタリングだけ期間を設けてリファクタリングをがーっとやってという感じがいいと思う
意識を切り替えて集中してそれだけやったほうが効率がいいだろうと思う
循環参照を回避
特に Python の話になるがリファクタリング時に循環参照をしないように気をつける
ポイントは __init__.py
を肥大化させないことを意識すると循環参照を避けられやすい
あとは Ruby のように循環参照しないような言語を使う
フレームワークの流儀に逆らわない
一番いいのは Rails などのようにディレクトリ構成も決まっている場合
役割ごとに書く場所がだいたい決まっているのでそこまで変なコードにはならない
大変なのは Sinatra や Flask のようにルーティングの部分だけ主に提供するフレームワークの場合
ディレクトリ構成なども柔軟に決められるのでその分ごちゃごちゃになる可能性が高い
このあたりは経験だが基本は MVC を守りつつサードパーティのライブラリやエコシステムなどアプリと切り離せる部分は切り離せるようにするのがいいと思う
設計手法を使う
最近は DDD などあるのでそういった設計手法を開発の前段で使うようにする
ただあくまでも設計手法で実装となると千差万別なので結局路線から外れることもある
ちなみに DDD は学習レベルも高くかなりの経験が問われるのであまりおすすめはしない
リファクタはお金にならない
これを言っては元も子もないがリファクタしたからと言ってサービスの売上にはつながらないのでそれを意識してやる必要がある
ただ開発コストの抑制にはなる
リファクタ自体マッチポンプな感じもするのでそもそもリファクタしなくても済むようなコードにすればいいのだがそうもいかないケースがほとんどだと思うのでやる場合は計画的にやるようにする
終わりはないので気をつけること
リファクタには終わりはないやろうと思えばどこまでもできてしまう
前にも述べたがリファクタはお金にはならないのである程度で区切りをつけて機能開発に切り替えるようにする
最終的には自己満足の世界なのでどこかで妥協しないとずっとリファクタリングだけしている人になってしまう (かもしれない)
0 件のコメント:
コメントを投稿