2011-08-10 30 views
6

Tôi chỉ gặp một số mã ghi đè ToString() và trả về một số thông tin quan trọng (không chỉ thông tin gỡ lỗi). Người dùng loại này được gọi là ToString() và phân tích dữ liệu quan trọng đó.Nên ToString được sử dụng cho thông tin quan trọng?

Ý kiến ​​của tôi, từ việc đọc bit khác nhau và mảnh trong những năm qua, đó là ToString() có khá yếu contract, ví dụ: ghi đè lên nó (nếu bạn muốn) để hiển thị một số nội dung có ý nghĩa.

Xem Tôi đã nói hiển thị ở đó? Mã mà tôi bắt gặp dựa vào việc trình bày văn bản các thể hiện của loại này là rất cụ thể; thêm bất cứ điều gì khác ngoài những gì được mong đợi sẽ gây ra tất cả các loại vấn đề.

Vì vậy, câu hỏi của tôi là, nếu đại diện văn bản của một đối tượng là rất quan trọng, nên sử dụng ToString() hoặc nên sử dụng phương pháp/thuộc tính rõ ràng hơn, ví dụ: AsText?

Trả lời

4

Cá nhân tôi chia sẻ mối quan tâm của bạn. Microsoft's documentation tuyên bố rằng phương pháp ToString()

[...] chuyển đổi một đối tượng thành biểu diễn chuỗi sao cho nó phù hợp để hiển thị.

Oracle's documentation cho Object.toString() Java thậm chí còn chút mạnh mẽ hơn:

Kết quả sẽ là một đại diện súc tích nhưng thông tin đó là dễ dàng cho một người đọc.

Tôi thấy đây là dấu hiệu mạnh mẽ rằng ToString() nên truyền tải thông tin thuận tiện cho con người. Phương thức trả về dữ liệu được thao tác bởi các phần khác của ứng dụng phải có tên thông tin hơn. Theo tôi, thậm chí AsText() là quá chung chung.

6

Điều này có vẻ như một kế hoạch khá tệ. Nếu người dùng loại cần dữ liệu, thì loại đó sẽ hiển thị các phương thức để trả về dữ liệu đó. Tại sao mọi người phân tích cú pháp biểu diễn chuỗi của một đối tượng khi họ có quyền truy cập vào đối tượng?

Có các trường hợp tuần tự hóa khóa học, nhưng các trường hợp này được xác định rõ và hiếm khi sử dụng .ToString() để thực hiện công việc của mình.

Nếu bắt buộc phải trình bày văn bản của chuỗi cho mục đích không đầu ra, thì tôi muốn một phương thức riêng biệt (có thể hoặc không thể sử dụng ToString() để thực hiện công việc của mình.) Điều này giúp người tiêu dùng cũng như người triển khai; nó sẽ thực sự không may nếu một coder mới muốn thêm một số thông tin kết xuất gỡ lỗi trong ToString() và phá vỡ người tiêu dùng của lớp.

CẬP NHẬT: Như MattDavey chỉ ra, nếu bạn thực hiện IFormattable, thì đó là một sự thỏa hiệp tốt: người tiêu dùng của bạn gọi ToString(), nhưng với các định dạng cụ thể trong tâm trí, và hợp đồng đáng tin cậy của điều đó có nghĩa. Vẫn khác với những gì đồng nghiệp của bạn đang làm, nhưng một tùy chọn có thể phù hợp hơn với họ.

+1

Tôi đồng ý hoàn toàn nhưng sẽ cho rằng phương pháp ToString có thể là một ứng cử viên tốt để xuất dữ liệu văn bản miễn là đối tượng của bạn triển khai IFormattable. Có nhiều khung dữ liệu ràng buộc ra khỏi đó sẽ làm việc tốt hơn nhiều với IFormattable.ToString hơn với MyCustomTextOutputMethod() .. nhưng đó không phải để nói rằng bạn không thể có cả hai :) – MattDavey

+0

@ MattDavey Điểm công bằng, mặc dù đó là rất nhiều khác biệt so với chỉ ghi đè phương thức 'ToString()' chuẩn. Tôi sẽ cập nhật để giải quyết rằng, mặc dù. – dlev

+0

Vâng, điều quan trọng là nhấn mạnh sự khác biệt giữa hai phương pháp. Những gì tôi thích về IFormattable là trong mô hình thực hiện tiêu chuẩn Object.ToString của bạn defers để IFormattable.ToString ("G"), cung cấp cho bạn một con đường tiến triển tốt đẹp :) – MattDavey

0

Theo tôi ToString() sau khi tất cả là một phương pháp mà chúng ta có thể sử dụng nó trong bất kỳ mong muốn cách, ví dụ 5.ToString() chuyển đổi int để chuỗi và trả lại nó không có vấn đề nếu nó là sử dụng để trưng bày hay không, trên ngược lại, trong nhiều trường hợp, chúng tôi là dựa trên thông tin đó được trả lại từ int.ToString() để thực hiện các thao tác khác.

1

Tôi không nghĩ rằng có một câu trả lời rõ ràng.

Tôi sẽ tranh luận về trường hợp sử dụng ToString(), vì khi tạo API trong .NET, nó được đánh giá cao khi sử dụng quy ước đặt tên phổ biến trong .NET thay vì sử dụng các tên ít quen thuộc hơn như AsText(). Quy ước này được thực hiện theo ví dụ của lớp StringBuilder, vì ToString() của nó đang trả về thông tin quan trọng.

+1

Đồng ý, cùng một kịch bản áp dụng cho System.IO.StringWriter. Có vẻ như khi mục đích duy nhất của đối tượng là tạo ra các chuỗi, sử dụng phương thức ToString là một cách hợp lý để phơi bày kết quả cuối cùng. – MattDavey

0

Không có câu hỏi, không có câu trả lời rõ ràng cho câu hỏi của bạn. Theo các phương pháp của tôi như ToString hoặc AsText chỉ nên được sử dụng để cung cấp trạng thái nội bộ của một đối tượng, ví dụ: để đăng nhập.Trong một khía cạnh chức năng ngôn ngữ hướng đối tượng nên được bắt nguồn bằng cách sử dụng một giao diện được xác định rõ, ví dụ: GetOrderId, GetUserName.

0

Không, tôi sẽ không làm điều đó. Ví dụ, nếu tôi có một đối tượng người, ToString() có thể trả về this.firstname + " " + this.lastname. Nó đang sử dụng nó cho mục đích hiển thị tự động, như thêm các mục vào một hộp danh sách. Khi đối tượng được thêm vào, tên của người đó sẽ được hiển thị. Tôi không nghĩ rằng tôi sẽ đưa thông tin quan trọng hoặc senstive vào việc ghi đè.

+0

Một ngoại lệ cho quy tắc này sẽ là nếu đối tượng được triển khai IFormattable, trong trường hợp đó phương thức ToString trở nên linh hoạt hơn và mạnh mẽ hơn để hiển thị dữ liệu như thế này ... – MattDavey

+0

@MattDavey - Đồng ý –

1

Câu hỏi hay.

Để rõ ràng hơn, tôi sẽ tạo phương thức khác cho định dạng khác.

Ví dụ: toJson() -> Biểu diễn JSON của đối tượng toXML() -> Biểu diễn XML của đối tượng. ... etc

Lưu ý: có thể là Thư viện thực hiện điều đó cho bạn .. trong java có. Bạn không biết trong C#

Như bạn nói, phân tích cú pháp toString() có thể dẫn đến vấn đề theo thời gian, vì nhà phát triển mới có thể không biết rằng toString() có định dạng cụ thể.

Các vấn đề liên quan