プログラミングの tips と refactoring

Menu Menu


プログラミングのルール

自分で使っているプログラミングのルールの例 プログラミング作法などにも、さまざまなルールが載っているが…

     教条的にルールを使わない

例えば、class を

    必ず実装(implementation)とインターフェースに分ける

とかは間違った選択になりやすい。


コードレビューを行う

第三者に自分のコードを見てもらう

コードレビューは、実行しながら行うほうが良い。


依存性を下げる

一つの基準は「依存性を下げる」こと。

    同じものを複数書かない
    大域変数を使わない ( Singleton Pattern を含む )
    Transactional に書く


Transaction とは

処理の成功失敗の単位。プログラムの動作の論理的な関係の単位。

永続的(あるいは一時的な)データのatomic なupdate

あとで後始末を要求しない。その場で成功失敗が決まる。

可能ならば lock ではなく atomic update とする。


Refactoring の例

    不要な変数の除去
    setter/getter の使用
    コピペコードの除去
    extract method
    extract interface
    ad-hoc な port の除去


不要な変数の除去

使われてない大域変数は除去する。

オブジェクトの状態以外の変数をメソッドの引数に変更する。


大域変数/インスタンス変数を経由した引数渡しの除去

オブジェクトの method を続けて呼び出す時に、パラメータを大域変数などに置かない。同時に呼ばれても干渉しないように引数渡しとする。

インスタンス変数の変更は transactional に行う。


setter/getter の使用

他のオブジェクトのインスタンス変数に直接手を出さない。そのオブジェクトには、そのオブジェクトが想定したインスタンス変数の整合性がある。

setter/getter 経由でアクセスすることにより、並行制御したり、整合性を管理することができる。


継承による依存性の除去

C++ や Java では継承により、同じようなことを複数書くことになる。このままでは、変更や拡張する場合に、その複数の部分をすべて変更する羽目になる。

インスタンスを分離して、別なインスタンスに処理を渡すことで継承を避けることができる。しかし、処理を渡す部分が増えてしまう。


コピペコードの除去

Interface ではなく、Abstract class を使って、重複した getter/setter をひとつにする。

State Pattern を使う


extract method

大きくなりすぎた method は、これを使って分割する。


extract interface

複数の実装が必要になった場合は、これを使う。


ad-hoc な port の除去

port 上に複数のプロトコルが走るようにする。

    コマンド長
    コマンド種類
    コマンド引数

のようなパケットを(MessagePack などで)作成する。


Refactoring の問題

Excercise 10.1

Shinji KONO / Tue Apr 12 11:26:08 2016