ライブラリに戻って「デバッグ」フラグ パラメータを追加するのではなく、アプリケーションのコマンド ラインでデバッグ フラグ (0/1) が読み取られると、ref を一度設定してから任意の関数からアクセスできると考えました。デバッグフラグが設定されている場合に何かをする必要がありました。
それはパラメーターなしのデバッグを処理するための合理的な方法ですか、それとも私の考えは「禁止された」グローバル変数を持つことにあまりにも似ていますか?
ありがとう。
ライブラリに戻って「デバッグ」フラグ パラメータを追加するのではなく、アプリケーションのコマンド ラインでデバッグ フラグ (0/1) が読み取られると、ref を一度設定してから任意の関数からアクセスできると考えました。デバッグフラグが設定されている場合に何かをする必要がありました。
それはパラメーターなしのデバッグを処理するための合理的な方法ですか、それとも私の考えは「禁止された」グローバル変数を持つことにあまりにも似ていますか?
ありがとう。
コード全体で繰り返さないようにすることをお勧めします(when *debug* ...)
。これは、マクロの主要なターゲットです。そのチェックを行うマクロを作成して、次のように使用できるようにします(debug ...stuff...)
。OK、それほど短くはありませんが、コードをデバッグ フラグのチェックの詳細から切り離します。より良いのは、デバッグ フラグの実行時チェックを完全に排除し、コンパイル時にのみ実行するコードを作成する機会を提供することです。
この種のグローバルは問題ありませんが、refを使用して格納することは実際には適切ではありません。これは、トランザクションですべてのロギングを行う必要があるためです(つまり、内で(dosync)
)。
「ロギング対応」の競合状態を気にする可能性は低いため、特別な保護は必要ありません。この変数にイヤーマフを付けて、特別な意味があることを示します。
このようなもので十分です:
(def ^{:dynamic true} *debug-enabled* false)
(def ^{:dynamic true} *info-enabled* false)
(defn- log [level s]
(println (apply str (cons (str "[" level "] ") s))))
(defn debug [ & s ]
(when *debug-enabled*
(log "DEBUG" s)))
(defn info [ & s ]
(when *info-enabled*
(log "INFO" s)))
動的フラグを定義することにより、コードの一部*debug-enabled*
に対してのみデバッグをオンに切り替えることができることに注意してください。この例では、すべての関数が上記の関数を使用していると想像してください。falseに設定しましたが、のためだけにオンにします。次のように、その呼び出しのためだけにフラグを再バインドできます。(debug)
*debug-enabled*
(my-problematic-func)
(myfunc a b c)
(my-other-func d e f)
(binding [*debug-enabled* true] ; switch on debug for my-problematic-func
(my-problematic-func g h i))
このフラグの使用法は、アプリケーション構成の行に沿っています。これは問題ありません。行け!