print文って使っちゃダメなの?
Tips💡
print
文書くの禁止の職場がある。ルールはあるのだろう。
「意見がみんな違う」まあ、ブレークポイント打てなくて、デバッグができない環境があると、使うことありますけどね。
友達に聞いてみた。これは、Pythonだけかな〜と思ったが、 Dartでも同じようなログは出る???
loggingパッケージのように構造化ログ吐けないのと、ログレベルを定義できないからですね
「ほう、本当かいな???」
Pythonの経験あるけど、今回は他の言語で。Dart使いますね🎯
Loggerを追加して、やってみた。
import 'package:logger/logger.dart';
var api = {
"url": "https://api.example.com",
"key": "somerandomkey"
};
var logger = Logger();
void main() {
// logger.d("Debug log");
// logger.e("Error log");
// logger.i("Info log");
// logger.w("Warning log");
// printの場合
print(api);
// debugPrintの場合
// loggerの場合
logger.d(api);
}
実行結果
おっ構造化できてる???
debugPrint
ってのもあるが、あれはどうなのか???
import 'package:flutter/cupertino.dart';
var api = {"url": "https://api.example.com", "key": "somerandomkey"};
void main() {
// printの場合
print(api);
// debugPrintの場合
debugPrint(api.toString());
}
同じか....
「ふ〜ん、今回はこっちは置いておこう」
もしデータが複数あったら???
ダミーのJSONのデータを10件にして、リストのなかに配置して、よくログに出るので、実験してみた。確かに違うの実感できる😅
構造化されてない???
import 'package:logger/logger.dart';
// ダミーの10件のListの中にネストしたJSON
var api = {
"data": [
{
"id": 1,
"name": "name1",
"age": 20,
"address": {
"zip": "111-1111",
"city": "Tokyo",
"street": "Shinjuku"
}
},
{
"id": 2,
"name": "name2",
"age": 30,
"address": {
"zip": "222-2222",
"city": "Osaka",
"street": "Umeda"
}
},
{
"id": 3,
"name": "name3",
"age": 40,
"address": {
"zip": "333-3333",
"city": "Nagoya",
"street": "Sakae"
}
},
{
"id": 4,
"name": "name4",
"age": 50,
"address": {
"zip": "444-4444",
"city": "Fukuoka",
"street": "Tenjin"
}
},
{
"id": 5,
"name": "name5",
"age": 60,
"address": {
"zip": "555-5555",
"city": "Sapporo",
"street": "Sapporo"
}
},
{
"id": 6,
"name": "name6",
"age": 70,
"address": {
"zip": "666-6666",
"city": "Sendai",
"street": "Sendai"
}
},
{
"id": 7,
"name": "name7",
"age": 80,
"address": {
"zip": "777-7777",
"city": "Kanazawa",
"street": "Kanazawa"
}
},
{
"id": 8,
"name": "name8",
"age": 90,
"address": {
"zip": "888-8888",
"city": "Hiroshima",
"street": "Hiroshima"
}
},
{
"id": 9
},
{
"id": 10
}
]
};
var logger = Logger();
void main() {
// logger.d("Debug log");
// logger.e("Error log");
// logger.i("Info log");
// logger.w("Warning log");
// printの場合
print(api);
// debugPrintの場合
// loggerの場合
logger.d(api);
}
実行結果:
「すご、コード整形されてる???」
{data: [{id: 1, name: name1, age: 20, address: {zip: 111-1111, city: Tokyo, street: Shinjuku}}, {id: 2, name: name2, age: 30, address: {zip: 222-2222, city: Osaka, street: Umeda}}, {id: 3, name: name3, age: 40, address: {zip: 333-3333, city: Nagoya, street: Sakae}}, {id: 4, name: name4, age: 50, address: {zip: 444-4444, city: Fukuoka, street: Tenjin}}, {id: 5, name: name5, age: 60, address: {zip: 555-5555, city: Sapporo, street: Sapporo}}, {id: 6, name: name6, age: 70, address: {zip: 666-6666, city: Sendai, street: Sendai}}, {id: 7, name: name7, age: 80, address: {zip: 777-7777, city: Kanazawa, street: Kanazawa}}, {id: 8, name: name8, age: 90, address: {zip: 888-8888, city: Hiroshima, street: Hiroshima}}, {id: 9}, {id: 10}]}
┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ #0 main (package:dart_lesson/main.dart:107:10)
│ #1 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:297:19)
├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
│ 🐛 {
│ 🐛 "data": [
│ 🐛 {
│ 🐛 "id": 1,
│ 🐛 "name": "name1",
│ 🐛 "age": 20,
│ 🐛 "address": {
│ 🐛 "zip": "111-1111",
│ 🐛 "city": "Tokyo",
│ 🐛 "street": "Shinjuku"
│ 🐛 }
│ 🐛 },
│ 🐛 {
│ 🐛 "id": 2,
│ 🐛 "name": "name2",
│ 🐛 "age": 30,
│ 🐛 "address": {
│ 🐛 "zip": "222-2222",
│ 🐛 "city": "Osaka",
│ 🐛 "street": "Umeda"
│ 🐛 }
│ 🐛 },
│ 🐛 {
│ 🐛 "id": 3,
│ 🐛 "name": "name3",
│ 🐛 "age": 40,
│ 🐛 "address": {
│ 🐛 "zip": "333-3333",
│ 🐛 "city": "Nagoya",
│ 🐛 "street": "Sakae"
│ 🐛 }
│ 🐛 },
│ 🐛 {
│ 🐛 "id": 4,
│ 🐛 "name": "name4",
│ 🐛 "age": 50,
│ 🐛 "address": {
│ 🐛 "zip": "444-4444",
│ 🐛 "city": "Fukuoka",
│ 🐛 "street": "Tenjin"
│ 🐛 }
│ 🐛 },
│ 🐛 {
│ 🐛 "id": 5,
│ 🐛 "name": "name5",
│ 🐛 "age": 60,
│ 🐛 "address": {
│ 🐛 "zip": "555-5555",
│ 🐛 "city": "Sapporo",
│ 🐛 "street": "Sapporo"
│ 🐛 }
│ 🐛 },
│ 🐛 {
│ 🐛 "id": 6,
│ 🐛 "name": "name6",
│ 🐛 "age": 70,
│ 🐛 "address": {
│ 🐛 "zip": "666-6666",
│ 🐛 "city": "Sendai",
│ 🐛 "street": "Sendai"
│ 🐛 }
│ 🐛 },
│ 🐛 {
│ 🐛 "id": 7,
│ 🐛 "name": "name7",
│ 🐛 "age": 80,
│ 🐛 "address": {
│ 🐛 "zip": "777-7777",
│ 🐛 "city": "Kanazawa",
│ 🐛 "street": "Kanazawa"
│ 🐛 }
│ 🐛 },
│ 🐛 {
│ 🐛 "id": 8,
│ 🐛 "name": "name8",
│ 🐛 "age": 90,
│ 🐛 "address": {
│ 🐛 "zip": "888-8888",
│ 🐛 "city": "Hiroshima",
│ 🐛 "street": "Hiroshima"
│ 🐛 }
│ 🐛 },
│ 🐛 {
│ 🐛 "id": 9
│ 🐛 },
│ 🐛 {
│ 🐛 "id": 10
│ 🐛 }
│ 🐛 ]
│ 🐛 }
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
まとめ
ブレークポイントを打ってデバッグすることが、DartとPythonで多かったのですが、ログをコンソールに表示したいこともある。その時は、構造化した状態にすると、JSONのデータが見やすくなるのを最近知った。
あっ今回は、printの話だった😅
printを頻繁に使用しない方が良い理由はいくつかありますが、メモリ消費の増加は主な理由ではありません。主な理由は以下の通りです:
-
パフォーマンスの低下: print ステートメントは、特に大量にある場合や高速で実行されるべきコード内にある場合、プログラムの実行速度を低下させる可能性があります。出力操作は比較的時間がかかるため、パフォーマンスに影響を与えることがあります。
-
ログの乱雑: 大量の print ステートメントは、重要な情報を見つけにくくする可能性があります。特に、デバッグ情報やエラーメッセージを探している場合、不要な出力によって重要な情報が見逃されることがあります。
-
コードの可読性: print ステートメントが多用されると、コードの主要なロジックが見えにくくなり、可読性が低下します。コードの意図や動作を理解するのが難しくなる可能性があります。
-
本番環境での不適切な使用: 開発中にデバッグ目的で print を使用するのは一般的ですが、本番環境のコードに print ステートメントが残っていると、不要な出力が生成される可能性があります。これは、ログファイルのサイズを不必要に大きくするだけでなく、セキュリティ上のリスクをもたらす可能性もあります(例えば、機密情報がログに記録されるなど)。
-
代替手段の存在: ログライブラリやデバッグツールなど、printよりも適切な代替手段が存在します。これらのツールは、出力をより効果的に管理し、必要な情報のみをフィルタリングして表示する機能を提供します。
メモリ消費は、print ステートメントの使用による直接的な影響ではありませんが、上記のような理由から、print の使用は慎重に行うべきです。
Discussion