常に適切ですが、表示する内容の背後にある意図を慎重に検討してください
より良い質問は、次のように尋ねることです。
なぜ ToString() をオーバーライドするのでしょうか?
ToString() は、オブジェクトの状態へのウィンドウです。要件として状態を強調します。Java/C# のような強力な OOP 言語は、すべてをクラスにカプセル化することで OOP モデルを悪用します。強力な OOP モデルに従わない言語でコーディングしていると想像してください。クラスと関数のどちらを使用するかを検討してください。これを関数 (つまり、動詞、アクション) として使用し、内部状態が入出力間で一時的に維持されるだけの場合、ToString() は値を追加しません。
他の人が述べたように、デバッガーや他のシステムで使用される可能性があるため、ToString() で出力するものを考慮することが重要です。
私は、ToString メソッドをオブジェクトの --help パラメーターとして想像するのが好きです。短く、読みやすく、明白で、表示しやすいものにする必要があります。オブジェクトが何をするかではなく、オブジェクトが何であるかを表示する必要があります。以上のことを踏まえて考えてみましょう...
使用例 - TCP パケットの解析:
アプリケーション レベルのみのネットワーク キャプチャではなく、pcap キャプチャのようなより機能的なものです。
コンソールにデータを出力できるように、TCP 層だけに ToString() をオーバーロードします。それには何が含まれますか?あなたは気が狂って、すべての TCP 詳細を解析することができます (つまり、TCP は複雑です)...
これには以下が含まれます:
- ソース ポート
- 宛先ポート
- シーケンス番号
- 承認番号
- データオフセット
- フラグ
- ウィンドウ オフセット
- チェックサム
- 緊急ポインター
- オプション(私もそこに行くつもりはありません)
しかし、100 パケットで TCP.ToString() を呼び出していた場合、そのジャンクをすべて受信したいと思いますか? もちろんそうではありません。それは情報過多です。簡単で明白な選択は、最も賢明な選択でもあります...
人々が期待するであろうことを明らかにする:
私は、人間が解析しやすいがYMMVである賢明な出力を好みます。
TCP:[destination:000, source:000]
複雑なことは何もありません。出力はマシンが解析するためのものではありません (つまり、コードを悪用されている場合を除きます)。本来の目的は、人間が読みやすくすることです。
しかし、前に話したその他の有益な情報についてはどうですか? それも役に立ちませんか? いきますが、まずは…
ToString() は、これまでで最も価値があり、あまり使用されていないメソッドの 1 つです。
理由は 2 つあります。
- 人々は ToString() の目的を理解していません
- 基本の「オブジェクト」クラスには、同様に重要な別の文字列メソッドがありません。
理由 1 - ToString() の有用性を悪用しないでください。
多くの人が ToString() を使用して、オブジェクトの単純な文字列表現を取得します。C# のマニュアルには、次のように記載されています。
ToString は、.NET Framework の主要な書式設定メソッドです。オブジェクトを表示に適した文字列表現に変換します。
それ以上の処理ではなく、表示します。上記の TCP パケットの素敵な文字列表現を使用して、正規表現 ::cringe:: を使用して送信元ポートを取得するという意味ではありません。
正しい方法は、SourcePort プロパティで直接 ToString() を呼び出すことです (ところで、これは ushort であるため、ToString() は既に使用可能になっているはずです)。
機械解析のために複雑なオブジェクトの状態をパッケージ化するために、より堅牢なものが必要な場合は、構造化されたシリアル化戦略を使用する方がよいでしょう。
幸いなことに、そのような戦略は非常に一般的です。
- ISerializable (C#)
- ピクルス (パイソン)
- JSON (Javascript またはそれを実装する任意の言語)
- 石鹸
- 等...
注: PHP を使用していない限り、herp-derp には ::snicker:: 用の関数があります。
理由 2 - ToString() では不十分:
これをコアに実装する言語はまだ見ていませんが、このアプローチのバリエーションを実際に見たり使用したりしています。
その一部は次のとおりです。
- ToVerboseString()
- ToString(verbose=true)
基本的に、TCP パケットの状態の毛むくじゃらの混乱は、人間が読みやすいように説明する必要があります。TCP について話すことで「死んだ馬を打ち負かす」ことを避けるために、ToString() と ToVerboseString() が十分に活用されていないと思う 1 番目のケースに「指を向ける」ことにします...
ユースケース - 配列:
主に 1 つの言語を使用する場合は、その言語のアプローチに慣れているでしょう。私のようにさまざまな言語を行き来する人にとって、さまざまなアプローチの数はいらいらする可能性があります。
つまり、これが私を苛立たせた回数は、すべてのヒンズー教の神のすべての指を合わせた合計よりも多い.
言語が一般的なハックを使用するさまざまなケースと、それを正しく行ういくつかのケースがあります。車輪の再発明が必要なものもあれば、浅いダンプを行うものもあれば、深いダンプを行うものもあり、どれも私が望むようには機能しません...
私が求めているのは、非常に単純なアプローチです。
print(array.ToString());
出力: 'Array[x]' または 'Array[x][y]'
x は最初の次元のアイテム数、y は 2 番目の次元のアイテム数、または 2 番目の次元がギザギザであることを示す値 (最小/最大範囲でしょうか?) です。
と:
print(array.ToVerboseString());
私はきれいなものが好きなので、she-bang 全体を pretty-print で出力します。
うまくいけば、これは私を長い間悩ませてきたトピックに光を当てます. 少なくとも、PHPers がこの回答に反対票を投じるように、ちょっとしたトロールベイトをまき散らしました。