0

ライブラリに戻って「デバッグ」フラグ パラメータを追加するのではなく、アプリケーションのコマンド ラインでデバッグ フラグ (0/1) が読み取られると、ref を一度設定してから任意の関数からアクセスできると考えました。デバッグフラグが設定されている場合に何かをする必要がありました。

それはパラメーターなしのデバッグを処理するための合理的な方法ですか、それとも私の考えは「禁止された」グローバル変数を持つことにあまりにも似ていますか?

ありがとう。

4

3 に答える 3

3

コード全体で繰り返さないようにすることをお勧めします(when *debug* ...)。これは、マクロの主要なターゲットです。そのチェックを行うマクロを作成して、次のように使用できるようにします(debug ...stuff...)。OK、それほど短くはありませんが、コードをデバッグ フラグのチェックの詳細から切り離します。より良いのは、デバッグ フラグの実行時チェックを完全に排除し、コンパイル時にのみ実行するコードを作成する機会を提供することです。

于 2012-04-11T14:04:02.577 に答える
1

この種のグローバルは問題ありませんが、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))
于 2012-04-11T12:58:55.057 に答える
1

このフラグの使用法は、アプリケーション構成の行に沿っています。これは問題ありません。行け!

于 2012-04-11T12:54:26.900 に答える