Mae向きなブログ

Mae向きな情報発信を続けていきたいと思います。

リーダブルコード

非常に読みやすい本で、ほとんど理解できた思います(多分)が、今すぐ書かれていること全てを実践に活かすほど自分の知識として定着していないと思います。時間をおいて何回か読み直し、少しずつでも本書で紹介されているようなコードが書けるようになることを目標としたいと思います。

読みながら疑問に思ったのは、p107の「8.7 式を簡潔にするもう1つの創造的な方法」で紹介されているマクロを使うところです。今まで##を使ったことがなくて、以下のように書かれていた部分がどうもしっくりこなかったので実際に試してみました。

p107.cpp

void AddStats(const Stats& add_from, Stats* add_to) {
#define ADD_FIELD(field) add_to->set_##field(add_from.field() + add_to->field())
  ADD_FIELD(total_memory);
  ADD_FIELD(free_memory);
  ADD_FIELD(swap_memory);
  ADD_FIELD(status_string);
  ADD_FIELD(num_processes);
  // ...
#undef ADD_FIELD
}

上記は以下のように正しく置き換えられています。試しにadd_from.##field()、add_to->##field()と書き換えるとエラーが出力されます。なぜadd_to->set_##fieldのところだけ##が必要なんでしょうか。

$ gcc -E p107.cpp
# 1 "p107.cpp"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "p107.cpp"
void AddStats(const Stats& add_from, Stats* add_to) {

  add_to->set_total_memory(add_from.total_memory() + add_to->total_memory());
  add_to->set_free_memory(add_from.free_memory() + add_to->free_memory());
  add_to->set_swap_memory(add_from.swap_memory() + add_to->swap_memory());
  add_to->set_status_string(add_from.status_string() + add_to->status_string());
  add_to->set_num_processes(add_from.num_processes() + add_to->num_processes());


}

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)