2011-08-10 15 views
6

私はちょうどToString()を上書きし、(デバッグ情報だけでなく)いくつかの重要な情報を返すいくつかのコードに出くわしました。このタイプのユーザーはToString()と呼ばれ、その重要なデータを解析します。重要な情報にToStringを使用する必要がありますか?

私の意見は、長年にわたって様々なこまごまとを読んでから、ToString()は(あなたがをしたい場合を)すなわち、contractかなり弱いが表示何らかの意味のあるものにそれをオーバーライドしていることです。

と表示されましたが表示されますか?私が遭遇したコードは、このタイプのインスタンスのテキスト表現に非常に特化しています。予想外のものを追加すると、あらゆる種類の問題が発生します。

私の質問は、オブジェクトのテキスト表現が重要な場合は、ToString()を使用するか、より明示的なメソッド/プロパティを使用する必要があります。 AsText

答えて

4

個人的に私はあなたの懸念を共有します。 Microsoft's documentationは、[...] ToString()方法

と述べ、それは表示のために適切であるように、その文字列表現にオブジェクトを変換します。 JavaのObject.toString()ため

Oracle's documentation少しでも強いです:

結果が読むために人のための簡潔で有益な情報であるべき。

これらは、ToString()が人間にとって都合のよい情報を伝えるべきであることを強く示しています。アプリケーションの他の部分によって操作されるデータを返すメソッドは、より有益な名前を持つ必要があります。私の意見でさえ、AsText()はあまりにも一般的です。

6

これはかなり悪い計画のようです。型のユーザーがデータを必要とする場合、その型はそのデータを返すメソッドを公開する必要があります。人々がオブジェクトの文字列表現を解析するのはなぜですかオブジェクトにアクセスしたとき

もちろんシリアル化のシナリオはありますが、それらは明確に定義されており、仕事をするのにほとんど.ToString()を使用しません。

非出力目的の文字列のテキスト表現が必要な場合は、個別の方法を使用することをお勧めします(ToString()を利用する場合と使用しない場合があります)。新しいコーダーがToString()にいくつかのデバッグダンプ情報を追加してクラスのコンシューマーを壊したければ、本当に残念です。

UPDATE:あなたの消費者がToString()を呼び出しますが、心の中で特定のフォーマット、およびそれが何を意味するかの信頼性の高い契約に:MattDaveyが指摘するように、あなたがIFormattableを実装する場合、その後、それは良い妥協点です。あなたの同僚がやっていることとはまだ異なりますが、おそらくより寛容な選択肢です。私の意見ToString()

+1

私は完全に同意しますが、あなたのオブジェクトがIFormattableを実装している限り、ToStringメソッドはテキストデータを出力するのに適していると主張します。 MyCustomTextOutputMethod()ではなくIFormattable.ToStringでもっとうまく動作するさまざまなデータバインディングフレームワークがありますが、それはあなたが両方を持つことができないと言っているわけではありません:) – MattDavey

+0

@MattDavey公正点標準の 'ToString()'メソッドをオーバーライドします。私はそれに対処するために更新されます。 – dlev

+0

ええ、2つの方法の違いを強調することが重要です。 IFormattableについて私が気に入っているのは、標準的な実装パターンでは、Object.ToStringがIFormattable.ToString( "G")を継承していて、良い進路を提供しているということです。 – MattDavey

0

すべてが、それは上、表示のためにかどうか使用していたならば、我々は関係なく文字列にint型に変換し、それを返すインスタンス5.ToString()のために、任意の望ましい方法でそれを使用することができます方法であり、後にそれどころか、多くの状況ではになり、その情報がint.ToString()から返され、それ以降の操作が行われます。

1

明確な回答はないと思います。

AsText()のようなあまり知られていない名前を使用する代わりに、.NETのAPIを作成するときに.NETの一般的な名前付け規則を使用すると高く評価されるので、私はToString()を使用すると主張します。 この慣例には、ToString()が重要な情報を返すため、たとえばクラスStringBuilderが続きます。

+1

同じシナリオがSystem.IO.StringWriterに適用されます。オブジェクトが文字列を生成することだけである場合、ToStringメソッドを使用することは、最終結果を公開する賢明な方法です。 – MattDavey

0

ご質問には明確な答えはありません。私の意見では、ToStringまたはAsTextのようなメソッドは、オブジェクトの内部の状態を提供するためにのみ使用する必要があります。それを記録する。オブジェクト指向言語では、機能面は明確に定義されたインターフェースを使用することによって導出されるべきである。 GetOrderId,GetUserName

0

いいえ、私はそれをしません。たとえば、人物オブジェクトがある場合、ToString()this.firstname + " " + this.lastname.を返す可能性があります。これは、アイテムをリストボックスに追加するなどの自動表示の目的で使用しています。オブジェクトが追加されると、その人物の名前が表示されます。私は、オーバーライドにクリティカル情報またはセンシティブ情報を置くとは思わない。

+0

このルールの例外は、オブジェクトがIFormattableを実装している場合です。この場合、ToStringメソッドは、このようなデータを公開するためにもっと柔軟で強力になります。 – MattDavey

+0

@MattDavey - Agreed –

1

良い質問です。

もっと明示的に言えば、私は異なるフォーマットのために異なる方法を作ります。

例:toJson() - >オブジェクトのJSON表現 toXML() - >オブジェクトのXML表現。 ...など

注:おそらくあなたのためにそれを行うライブラリがあります.. javaにあります。 c#

あなたが言うように、新しい開発者はtoString()が特定の形式を持っていることを知らないかもしれないので、toString()を解析すると問題が発生する可能性があります。

関連する問題