ログメッセージのためだけの情報を関数引数として渡すことの是非


ある関数の内部で、処理の本質には必要ないが、エラーログやデバッグログには表示したい情報があります。  
基本的にはそれらは関数の引数として渡すしかないと思っているのですが、どうにもスマートではない気がして抵抗があります。

プログラミングの一般論として、このやり方の是非についてのご意見、もしくはもっとスマートなやり方など、ご教示いただけないでしょうか。

* * *

<例>

カレントフォルダ直下の複数のcsvファイルを1行ずつ読み込んだうえで、  
それらを1カラムずつ、あるDBテーブルに登録する処理を以下のように書きました。

関数 `read_csv()` が関数`save_recodes()` を呼び出す構造は変更しない、という前提のもとで、  
エラーログに必要な情報 `csvname` `lno` を `save_recodes()` に渡す場合、どのような方法が  
スマートでしょうか。

※サンプルコードはpythonですが、他言語の場合のご意見もお待ちしています。

[code]

    
    def save_recodes(key, values, csvname, lno):
        for value in values:
            if is_valid(value):
                save_keyvalue(key, value)
            else:
                # エラーログ
                print(f'WARNING: invalid value "{value}", file"{csvname}", line {lno}'
                    , file=sys.stderr)
    
    def read_csv(csvname):
        for lno, line in enumerate(open(csvname), 1):
            key,*values = line.strip().split(',')
            save_recodes(key, values, csvname, lno)
    
    import glob
    for csvname in glob.glob('./*.csv'):
        read_csv(csvname)
    
[/code]




`save_recodes()`の仕様が「DBにデータを登録する。無視可能なエラーが出たらログに記録する」というものであれば、ログメッセージに必要な情報を堂々と渡せばいいと思います。`save_recodes()`の仕様を満たすために必要不可欠なわけですから。

この場合はむしろ、ログに求められる要件は何かを整理してみることをお勧めします。

いつでも同じフォーマットで標準エラーにメッセージを書き出すのであれば、今のコードでも特に問題はないと思います。しかし例えば、`save_recodes()`が他の関数、`read_xml()`や`read_json()`から呼ばれ、それぞれメッセージが異なるとか、ログの出力先が変わることがあるとか、そういう要件が考えられるのなら、ログのメカニズムを、ログクラスを作るなり、グローバルなログ関数を作るなり、抽象化する必要があります。

要件を整理すれば、どこでメッセージを作るべきか、どこで実際に出力するかなど、はっきりしてくるのではないでしょうか。




`save_recodes()`の仕様が「DBにデータを登録する。無視可能なエラーが出たらログに記録する」というものであれば、ログメッセージに必要な情報を堂々と渡せばいいと思います。`save_recodes()`の仕様を満たすために必要不可欠なわけですから。

この場合はむしろ、ログに求められる要件は何かを整理してみることをお勧めします。

いつでも同じフォーマットで標準エラーにメッセージを書き出すのであれば、今のコードでも特に問題はないと思います。しかし例えば、`save_recodes()`が他の関数、`read_xml()`や`read_json()`から呼ばれ、それぞれメッセージが異なるとか、ログの出力先が変わることがあるとか、そういう要件が考えられるのなら、ログのメカニズムを、ログクラスを作るなり、グローバルなログ関数を作るなり、抽象化する必要があります。

要件を整理すれば、どこでメッセージを作るべきか、どこで実際に出力するかなど、はっきりしてくるのではないでしょうか。

