hitode909の日記

趣味はマリンスポーツですの日記です

はてなでコードを書くときに気をつけていること

こんにちは,はてなでPerlを書いているhitode909です.
趣味はマリンスポーツです.

この記事は,Hatena::Staff Advent Calendar 2011とは全く関係なくて,id:nanto_viさんから何かバトンが回ってきたので書いています.


最近クールだと思っているテクニックを皆様にお伝えしようと思います.

メソッド名に引数の情報を含める

引数に何を期待しているかよくわからないことがあります.
$fooと$barは何でしょうか.

sub new {
  my ($class, $foo, $bar) = @_;


こうなると少しましです.userとcategory_idです.

sub new {
  my ($class, $user, $category_id) = @_;

呼び出すときに,どの順だったか忘そうですね.

TheClass->new($user, 3);
TheClass->new(3, $user);


あきらめて,メソッド名に,引数として何を渡せばよいかも書くと,呼び出し時にも間違いにくくなって,安心です.

sub new_from_user_and_category_id {
  my ($class, $user, $category_id) = @_;

呼び出しも安心です.

TheClass->new_from_user_and_category_id($user, $category_id);


引数が増えるときはハッシュで渡せるようにすると少しまし,という話もありますが,これだと,userとcategory_idを渡す,ということは覚えてないといけないですね.

TheClass->new(user => $user, category_id => $category_id);

変数名をクラス名にする

変数を宣言するときに型を書かないので,その変数に何が入っているかよく分からなくなることがあります.

my $foo = User->new;
my $bar = User->new;

$fooが何で,$barが何なのか,よく分かりません.


あきらめて,変数名をクラス名にして,以下のように書きます.

my $user_a = User->new;
my $user_b = User->new;


こうすると,user_aはUserクラスのインスタンスのような気がしてきますし,全然関係ないものを再代入しようとしたときに,おかしいことに気付けます.
ハンガリアン記法みたいな感じです.
wikipedia:ハンガリアン記法


何でもuser_とつければよいわけではなくて,役割がちがうときは,以下のように書いてもよいと思います.

my $author = User->new;
my $guest  = User->new;

メソッド名をプロジェクト内でユニークにする

使ってなさそうなメソッドを発見したとします.
置いといてもいいですが,使ってないコードは消したいと思います.
ためしに消してみて,テストを実行してみてもよいですが,僕はよくメソッド名でgit grepします.
メソッド名について,git grepしやすさを考えます.次の2つなら,どちらが探しやすいでしょうか.


getというメソッドはプロジェクトに複数ありそうで,どこの呼び出しが,どのクラスへの呼び出しかを機械的に調べる方法はなく,1つずつ見ていくことになります.
一方,get_rss_2011_summerという文字がプロジェクト内になければ,get_rss_2011_summerメソッドは消していいと判断できます.
このように,メソッド名をプロジェクト内でユニークにすることで,そのメソッドがプロジェクト内のどこかから呼ばれているかどうかを,grepだけで探せるようになります.


ただし,この技は,オーバーロードやダックタイピングとの相性が最悪です.
また,開いたり閉じたりするクラスには,openやcloseといったメソッドがあって当然なので,そういったクラスをどう扱うかも悩みます.
しかし,メソッド名を見るだけで,どのクラスのインスタンスか分かるのは便利です.

まとめ

クールなテクニックを紹介しました.
JavaにはEclipseがあって,自動的に,どこから呼ばれているかなど教えてくれるので,こういう技は要らなさそうですが,PythonRubyなど,まともなIDEがない言語では使えると思います.
次はid:shiba_yu36です.