😇

print文って使っちゃダメなの?

2024/06/30に公開

Tips💡

print文書くの禁止の職場がある。ルールはあるのだろう。
「意見がみんな違う」まあ、ブレークポイント打てなくて、デバッグができない環境があると、使うことありますけどね。

友達に聞いてみた。これは、Pythonだけかな〜と思ったが、 Dartでも同じようなログは出る???

loggingパッケージのように構造化ログ吐けないのと、ログレベルを定義できないからですね

「ほう、本当かいな???」
Pythonの経験あるけど、今回は他の言語で。Dart使いますね🎯

Loggerを追加して、やってみた。
https://pub.dev/packages/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を頻繁に使用しない方が良い理由はいくつかありますが、メモリ消費の増加は主な理由ではありません。主な理由は以下の通りです:

  1. パフォーマンスの低下: print ステートメントは、特に大量にある場合や高速で実行されるべきコード内にある場合、プログラムの実行速度を低下させる可能性があります。出力操作は比較的時間がかかるため、パフォーマンスに影響を与えることがあります。

  2. ログの乱雑: 大量の print ステートメントは、重要な情報を見つけにくくする可能性があります。特に、デバッグ情報やエラーメッセージを探している場合、不要な出力によって重要な情報が見逃されることがあります。

  3. コードの可読性: print ステートメントが多用されると、コードの主要なロジックが見えにくくなり、可読性が低下します。コードの意図や動作を理解するのが難しくなる可能性があります。

  4. 本番環境での不適切な使用: 開発中にデバッグ目的で print を使用するのは一般的ですが、本番環境のコードに print ステートメントが残っていると、不要な出力が生成される可能性があります。これは、ログファイルのサイズを不必要に大きくするだけでなく、セキュリティ上のリスクをもたらす可能性もあります(例えば、機密情報がログに記録されるなど)。

  5. 代替手段の存在: ログライブラリやデバッグツールなど、printよりも適切な代替手段が存在します。これらのツールは、出力をより効果的に管理し、必要な情報のみをフィルタリングして表示する機能を提供します。

メモリ消費は、print ステートメントの使用による直接的な影響ではありませんが、上記のような理由から、print の使用は慎重に行うべきです。

Discussion