コードの関数設計

記事タイトルとURLをコピーする

はじめに

PE部の谷です。
関数名や変数名、ファイル名をどうすれば良いか悩むことが多々あるので、調べてみました。

関数名

処理内容を想像できる名前をつける

関数名で処理内容を表せれば、関数の実装を見る必要がなくなり、コードを読む人が楽になります。

def item_csv(item):
    with open('item.csv', mode='w') as f:
        f.write(item.name)

これでは処理内容が伝わりません。

def write_item_csv(item):
  ...

とするとitem_csvを書き込む関数だと一目でわかります。

動詞を頭につけたり、取得できるものや役割の名詞にすると明確に表すことができます。

動詞:get_item_list、calc_tax、merge_data
item_listを取得する、税を計算する、データを合わせて1つのデータにする

取得できるものの名詞:current_date、analysis_result
今日の日付を取得する、分析結果を取得する

役割の名詞:json_parser
jsonをパースする

また、処理内容を明確にするためには、関数内の処理を複雑にしないことも大切です。

具体的な意味の英単語を使う

何かを取得する関数全てにgetばかりつけていませんか?
私はやってしまいます。

def get_exchange_rate():
  ...
def get_tax_including():
  ...
def get_user_info():
  ...

このような場合は、より狭義な英単語を使います。

def fetch_exchange_rate():
  ...
def calc_tax_including():
  ...
def filter_user_info()
  ...

fetchは、外部からデータを取ってくるという意図があるので、為替レートの値を外部サイトから取ってくることがわかります。
calcは、計算を行うという意図があるので、税込の値を取得することがわかります。
filterは、要素を絞り込むという意図があるので、複数のデータからユーザー情報を絞り込むことがわかります。

他にも、 saveの代わりに
dump:データソースから別ファイルにデータをまとめて保存する
patch:部分的に情報を更新する
memoize:メモリ上に一時的に記録

sendの代わりに
notify:通知する

処理内容を日本語で表してみると、置き換える英単語がわかるかもしれません。

まとめ

あまり意識しすぎて難しい英単語をつけてしまうと、逆に読む人が理解しづらくなってしまうので、注意してください。

やりたい処理を日本語で入力すると関数名のように英語に翻訳してくれるサービスがあるので、使ってみてください。

codic.jp