4

ビジネス ロジック関数をマクロとして実装することは良い考えですか?

いくつかのレガシー C++ コードを継承しましたが、多くのビジネス ロジック関数が長い不可解なマクロとして実装されていることがわかりました。

関数に対するマクロの利点はありますか? マクロを使用する一般的な理由は何ですか?

マクロに最適なロジックは何ですか?

これはコードの簡単なサンプルです

#define INSERT_VALUES(IN,ID,EO)     {\
    double evaluationOutput = EO;\
    int controls = 0;\
    int input_controls = m_input_controls[IN];\
    if(m_value_list[IN].ShouldProcess())\
        {\
        evaluationOutput = m_evaluationOutput[IN];\
        controls = m_controls[IN];\
        }\
    VALUE_EXIST(evaluationOutput,controls,input_controls,IN,ID,Adj);\
    m_evaluationOutput[IN] = controls > 0 ? evaluationOutput : 0.0;\
    m_controls[IN] = controls;\
    m_input_controls[IN] = input_controls;\                                 
}
4

3 に答える 3

9

効果的な C++で、Scott Meyers は項目 2 で次のように述べています。

consts、、enumsおよびinlinesを優先#defines

関数の代わりにマクロを書く慣行について特に言及して、Meyers は次のように述べています。

ディレクティブのもう 1 つの一般的な (誤) 使用は、#define関数のように見えるが関数呼び出しのオーバーヘッドを発生させないマクロを実装するために使用することです。

このようなマクロには多くの欠点があり、それらについて考えるだけでも苦痛です。

幸いなことに、このナンセンスを我慢する必要はありません。インライン関数のテンプレートを使用すると、マクロのすべての効率に加えて、通常の関数のすべての予測可能な動作と型の安全性を得ることができます。

[実機能] スコープとアクセス規則に従う。たとえば、クラスにプライベートなインライン関数について話すことは完全に理にかなっています。一般に、マクロでそれを行う方法はありません。

質問に具体的に答えるには:

  • 一部のプログラマーは、関数呼び出しの認識されるオーバーヘッドを回避するために、関数の代わりにマクロを作成します。
  • プログラマーは、定型コードを生成するためにプリプロセッサを使用していました (おそらく今でも使用しています)。最新の C++ では、プロセッサの使用は条件付きコンパイルの#includeand (おそらく) #ifdef/に制限する必要があります。#ifndef

マイヤーズが最後に述べているように:

まだプリプロセッサを廃止する時期ではありませんが、長期にわたる頻繁な休暇を確実に与える必要があります。

于 2013-04-30T18:28:57.963 に答える
6

いいえ。関数の一般的な代替品ではありません。

マクロは、コード自体にないこと、特にコンパイル前にトークン (コード) を作成および変更することができます。

代わりに、型の安全性がすべて失われ、実際のコードで使用できるほとんどすべてのシンタックス シュガーが失われます。

コードでは実行できないことを実行する必要がある場合、またはコードが条件付きで存在する必要がある場合 (メモリ トレースなどのスーパーデバッグ処理) には、マクロが役立ちます。また、特定のことを行うためのより簡潔で読みやすい方法を提供するという点でも、ある程度の価値があります (一般的な例は#define SUCCESS(x) (x >= 0).マクロのように見えるほとんどのコードは、実際のコードでより安全に表現できる可能性があり、これはビジネス ロジックにとって重要です。

あなたが得ることができる最も近い経験則は、コンパイル中に何かを行う必要があるか、または変更する必要があるかどうかです。もしそうなら、マクロを検討してください。そうでなければ、それをコーディングしてください。テンプレートはコードとしてカウントされ、マクロを使用したくなるかもしれない多くのことを行うことができますが、多少安全になる可能性があることを覚えておいてください。

于 2013-04-30T17:46:58.787 に答える
2

長くて不可解なものは良くありません。パフォーマンスの問題に対するマクロが存在する場合は、インライン関数で同じ結果を得ることができます。それらが式を単純化するために使用される場合、そのような努力のための時間とお金があれば、リファクタリングして難解性を減らし、より簡単に保守できるようにすることができます。

于 2013-04-30T18:00:11.210 に答える