web-dev-qa-db-ja.com

なぜSystem.out.println()を使うのがそんなに悪いのですか?

もちろん、エラーメッセージや警告にログフレームワークを使用することは非常に有効です。しかし、短時間で何か新しいことを試したい場合は、System.out.println()を使用することがあります。

System.out.println()をいくつかの簡単なテストに使用するのは本当に悪いですか?

18
Kayser

コメントで明らかになったように、尋ねられている本当の質問は、なぜ静的コード分析ツールはSystem.out.printlnの使用にフラグを立てるのですか?

その理由は、stdoutへのメッセージの送信は、通常、実稼働環境では不適切であるためです。ライブラリをコーディングしている場合、ライブラリはstdoutに出力するのではなく、呼び出し元に情報を返す必要があります。 GUIアプリをコーディングしている場合は、stdoutが指している場所(どこにもない可能性がある)ではなく、ユーザーに情報を提示する必要があります。サーバー(またはサーバー側コンテナーで実行されるもの)をコーディングする場合は、フレームワークが提供するログ機能を使用する必要があります。などなど。

しかし、printlnをデバッグまたは開発に使用している場合、またはプログラムを作成してstdinを読み取り、stdoutに書き込む場合、printlnは完全に問題ありません。このようなケースでは、何も問題はありません。

18
Stuart Marks

すべてのstdoutはバッファリングされるため、プログラムがクラッシュするのは可能呼び出したprintln()、ただしbefore画面に到達します。

そうは言っても、このシナリオは本当にありそうもありません。先に進んで使用してください。ただし、マイナーな制限を覚えておいてください。

10
riwalk

System.outはラップされたBufferedOutputStreamです。これはおそらく、使用するロギングフレームワークに似ています。フレームワークは、ログ出力の構成および宛先の形式でより多くの機能を提供するだけです。

8
spinning_plate

重要なプログラムに取り組んでいて、

  • 自動ユニットテスト(JUnit)ではなくSystem.outを松葉杖として使用している
  • System.outステートメントの作成、削除、コメント/コメント解除に多くの時間を費やしている
7
Aaron Kurtzhals

使い捨てのコードであっても、_System.out_の使用に関していくつかの注意点があります。

大きな問題の1つは、通常遅いことです。たとえば、いくつかのコードの速度について大まかなアイデアを取得しようとしている場合( (microbenchmarks is hard であることに注意))、単一のSystem.out.println()を追加すると、どこでも本当に混乱する可能性がありますタイミング(同期中であり、実際の出力がユーザーに表示されるのを返す前に待機することが多いため)。

それ以外は、使い捨てコードではあまり心配しません。あなたがそれをコミットするつもりなら(それを本番コードまたはテストコードとして)、それを取り除き、それを適切なロギング呼び出しに置き換えてください(はい、eveninテストコード)。

7
Joachim Sauer

よくあることですが、答えは「依存する」です。アプリケーションにすでにロギングフレームワークが配置されている場合は、それを使用することもできます。 lessprintln()に対応できません。また、スタックトレース、追加のコンテキスト、より適切なフォーマットなど、それが提供する他の機能を利用できます。また、ログフレームワークがより優れたエラー回復を提供し、致命的な障害が発生した場合でもログが正常に書き込まれることを確実にする可能性もあります。

したがって、最初にログシステムを追加するタイミングが問題になります。これは判断の呼びかけです。早急に追加する必要はありません。本当に必要がないことを確認するためだけです。また、追加を遅らせたくなく、アドホックソリューションからの変換作業が多すぎます。

println()を使用して多くのログを記録していることが判明した場合、コードベースは、問題が増大していることを伝えようとしています。その時点で、適切なロギングに投資する価値はあります。

4
Jon Purdy

System.out.printが「システムデフォルト」コードページを使用するという問題がよくあります。これはLinuxでは多くの場合UTF-8ですが、WindowsではいくつかのMSの機能が壊れています。

これにより、プログラムの実行場所によっては、Unicode文字が画面に正しく印刷されるか、または正しく印刷されない可能性があります。

したがって、私はSystem.outよりもカスタムのPrintWriterを好みます

3
Ingo

全然悪くない。この概念は、非常に単純であり、アプリケーションで専用のロギングフレームワークを使用するほど洗練されていないという事実から生じている可能性があります。

ただし、これが無効なアプローチであると言っているのではありません。私は何度かそれを使用して、アプリケーションのフローをチェックした後、いくつかのblack magic voodooプログラミングhijinksをチェックしました。

1
sergserg

それを使用することに何の問題もありません、それはあなたが「地獄が何が起こっているか」を理解するのに役立ちます。

しかし、あなたの仲間/他の開発者/ツールがあなたを嘲笑しているなら、あなたはいつも Logger を使うか、または Junit テストを始めることができます!

0
lwm

私が見るように、時々起こるSystem.out.printlnの最大の問題は、それが「悪い習慣の匂い(tm)」であるということです。自分でこれを実行している場合は、お気に入りのデバッガーを使用してより快適になることで、有効性を向上させることができます。

また、デバッガーを使用すると、ブレークポイントが本番コードに挿入されないのは確かですが、System.out.printlnはそうなる可能性があります。

余談ですが、実際にクイックテストを行っているだけで、デバッガーを使用しない場合は、ロギングフレームワークを使用するよりもSystem.out.printlnの方が適していると思います。終了すると、根絶するのが難しくなります。

0
Buhb

内部状態の内容をエコーすることに関するテスト戦略全体を構築することは最も賢明な方法ではありませんが、開発中のコードの迅速でダーティーなテストでは、奇妙なprintlnがここにあり、削除することを覚えている限り問題はありません!

それらを削除するのを忘れることの危険性はおそらくそれが反対されている理由です。

0
GordonM