マクロのデメリット
from 項目28:分別をもってマクロを使おう
可読性 と 保守性 の低下
たとえば マクロ を使うと DSL を作れるが、コードを理解・保守する人は Rust だけではなく DSL も(マクロ内の実装も含めて)理解する必要がある
e.g. http_codes! の場合、Status という enum を作るが、DSL からはそれが分からない
また、マクロ内のコードは Rust の構文的慣習に従わないため、rustfmt でフォーマットされない
e.g.
code:rs
macro_rules! square {
{ $e:expr } => {
{
let x = $e;
x*x // x * x とフォーマットされない
}
}
}
http_codes! の場合、Informational などの Group enum のバリアントが使われているが、接頭辞(Group::)も付いていないし、use も用いていない
コンパイラによるエラーメッセージも、必ずしもどのマクロがどのマクロを呼び出しているのか、どこで問題が発生したのかを詳細に追跡するわけではない
この場合、cargo-expand が役に立つ
コードが 肥大化 するのを助長する可能性がある
1 行のマクロ呼び出しが数百行のコードを生成する場合もあるが、呼び出し元からは分からない
そのため、呼び出しが不要になった場合でも削除されずに残り続ける可能性が高い
#Rust #Effective_Rust_―_Rustコードを改善し、エコシステムを最大限に活用するための35項目