それは常に適切ですが、表示しているものの背後にある意図を慎重に検討してください
より良い質問は、尋ねることです:
なぜ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()を直接呼び出すことです(BTWはushortなので、ToString()は既に使用可能になっているはずです)。
マシン解析のために複雑なオブジェクトの状態をパッケージ化するために、より堅牢なものが必要な場合は、構造化されたシリアル化戦略を使用するほうがよいでしょう。
幸い、そのような戦略は非常に一般的です。
- ISerializable(C#)
- ピクルス(Python)
- JSON(JavaScriptまたはそれを実装する任意の言語)
- 石鹸
- 等...
注:herp-derpのためにPHPを使用しているのでない限り、そのための関数があります:: 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());
きれいなものに感謝しているので、シバン全体をきれいに出力します。
うまくいけば、これは長い間私を怒らせてきたトピックにいくつかの光を当てるでしょう。少なくとも私は、PHPersがこの回答に反対票を投じるように小さなトロールベイトを振りかけました。
Console.WriteLine(obj.GetToStringItemsHeadings); Console.WriteLine(obj);
またはを使用してオブジェクトをダンプしているように見えます。