Là sử dụng lớp System.Tuple mới thiết kế xấu?


19

Tôi thích khái niệm System.Tuple ở chỗ nó cho phép tôi trả về nhiều tham số trong một lệnh gọi hàm duy nhất mà không cần khởi tạo một lớp mới, tuy nhiên điều này không thách thức bất kỳ thực hành lập trình tốt nào như Microsoft Forms & Practice, Nguyên tắc RẮN, v.v.

Tôi chỉ đang cố gắng đánh giá xem tôi nên sử dụng tính năng này một cách tự do như thế nào hoặc nếu tôi chỉ nên sử dụng nó trong các tình huống cạnh khi cần thiết.


+1: Câu hỏi xuất sắc. Ngoài ra - tôi tự hỏi nếu Anders Hejlsberg đã cân nhắc về điều này.
Jim G.

Câu trả lời:


11

Vấn đề với việc sử dụng Tuplelà các tham số loại chung không truyền đạt ý nghĩa.

Để dễ đọc, bạn có thể muốn xem xét sử dụng một lớp tùy chỉnh hoặc thậm chí một loại ẩn danh với các thành viên được đặt tên.


Điều gì về mô tả tham số XML? Không phải là nơi rõ ràng nhất để tìm, nhưng tốt hơn là không có gì.
John Bubriski

@SkippyFire - Ý bạn thế nào? Tất cả những gì bạn nhận được là loại T1, T2v.v. Không cho bạn biết ý nghĩa của chúng.
Oded

2
Tôi phải nói rằng: mỗi khi tôi (hoặc ai đó trong nhóm của chúng tôi) sử dụng Tuple làm loại, tôi liên tục tham khảo lại các phần khác trong mã để ghi nhớ .Item1, .Item2, v.v. Đối với bất cứ điều gì không hoàn toàn tầm thường, hãy tạo các lớp rời rạc. Hãy cho bản thân một cơ hội trong tương lai để biết bạn đang làm gì.
Joe

@Oded Tôi đang nói về việc thêm tài liệu XML vào một phương thức chấp nhận Tuple. Một lần nữa, không hoàn hảo, nhưng tốt hơn là không có gì nếu bạn muốn / cần sử dụng Tuples.
John Bubriski

1
@Oded Ngoài ra, tham số hoặc giá trị trả về có thể không truyền đạt ý nghĩa, nhưng tên của phương thức có thể. Giả sử bạn có một phương thức gọi là GetTopTwoPercentages()trả về a Tuple<decimal, decimal>. Điều đó có thể đủ rõ ràng.
John Bubriski

8

Một trong những phẩm chất mã quan trọng nhất là khả năng đọc. Vì vậy, hãy tự hỏi:
Khi tôi (tức là ở bất kỳ ai khác ngoài bạn) nhìn vào chữ ký phương thức, tôi có biết ý nghĩa của các thành phần tương ứng của Tuplecó không?
Ví dụ: nếu cặp phao bạn đang trả về là một tập hợp tọa độ cực, điều này có rõ không?

Điều này rõ ràng:

Tuple<Float, Float> getPolarCoords();

Điều này là sai lệch (vì người ta sẽ giả sử tọa độ Descartes):

Tuple<Float, Float> getCoords();

Và đây là ý nghĩa không có:

Tuple<Float, Float> getTuple();

Vì vậy, nói chung, bạn sẽ có đánh giá rõ ràng trên cơ sở từng trường hợp và tái cấu trúc nếu cần thiết. Nếu bạn đại diện cho cùng một loại dữ liệu như Tupleở nhiều nơi khác nhau, thì việc tạo một lớp chắc chắn là một ý tưởng tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.