今度は、各式で多くのことが起こっている別の例があります。今回はC++での例です:
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()); ... }
繰り返しになりますが、あなたの目は長くて似ているがまったく同じではないコードに直面しています。
10秒間の綿密な調査の結果、各行が毎回異なるフィールドに対してだけ同じことを実行していることに気付くかもしれません。
add_to->set_XXX(add_from.XXX() + add_to->XXX());
C++では、これを実装するマクロを定義できます:
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 }
煩雑さを取り除いたので、コードを見て、何が起こっているのかをすぐに理解できます。 各行が同じことをしているのは明らかです。
マクロの使用を頻繁に推奨しているわけではないことに注意してください。実際、マクロはコードを混乱させ、微妙なバグを招く可能性があるため、通常は回避します。
ただし、この場合のように、シンプルで読みやすさに明確なメリットをもたらす場合があります。
参考文献:
リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック
The Art of Readable Code: Simple and Practical Techniques for Writing Better Code (English Edition)
The Art of Readable Code: Simple and Practical Techniques for Writing Better Code Kindle (English Edition)