Cách tốt nhất để cấu trúc và tên tệp có chứa các lớp chung có cùng tên là gì?


14

Trong dự án hiện tại của tôi, tôi đã bắt gặp yêu cầu tạo các lớp chung có cùng tên, nhưng số lượng tham số chung khác nhau. Ví dụ:

MyClass<T1>
MyClass<T1, T2>
MyClass<T1, T2, T3>

Cho rằng tôi muốn tất cả những thứ này trong cùng một không gian tên, tôi bối rối không biết làm cách nào để cấu trúc và đặt tên cho các lớp và tệp của mình?

Nếu chúng ta theo ý tưởng rằng chúng ta nên có các lớp giới hạn ở một tệp cho mỗi tệp và các tệp đó phải nằm trong cấu trúc thư mục đại diện cho phân cấp không gian tên và tên của tệp phải khớp với tên của lớp, làm thế nào để tôi xử lý tình huống này ?

Điều tôi thực sự hỏi ở đây là tôi nên đặt tên cho tệp chứa MyClass<T1>cái gì và tôi nên đặt tên cho tệp chứa MyClass<T1, T2>gì? Tôi không hỏi tên của các tham số loại nên là gì.


Hãy cho chúng tôi một số ví dụ cụ thể mô tả vấn đề chi tiết hơn. Các ví dụ bạn cung cấp quá ... erm, chung chung. Bạn có ý nghĩa gì bởi "cách cấu trúc và đặt tên các lớp và tệp của tôi?"
Robert Harvey

Microsoft thực hiện điều này bằng cách chỉ thêm một số vào tham số loại. Xem các tài liệu Tuple: msdn.microsoft.com/en-us/l Library / trộm
Pete

@Pete: Điều đó thực sự chỉ áp dụng cho Tuple. Microsoft cũng sử dụng TKey, TValuequy ước. Func có một TResulttham số loại. Mặc dù tôi đồng ý rằng bạn có thể sử dụng T1, T2v.v. cho một số lượng tham số đầu vào khác nhau mà không có cách sử dụng cụ thể như TKeyTValue.
Robert Harvey

@RobertHarvey Vâng, có nhưng chỉ trong bối cảnh của một bộ sưu tập khóa / giá trị thực tế, chẳng hạn như một từ điển. Đối với bất cứ điều gì bao gồm một số loại khác nhau, họ nối một số. Dưới đây là một ví dụ khác: msdn.microsoft.com/en-us/l Library / dd402872 (v = vs.110) .aspx
Pete

1
Vâng, chỉnh sửa của bạn đã lỗi thời một số ý kiến. :) Tại sao bạn không thể giữ các lớp trong cùng một tệp vật lý? Nếu chúng khác nhau đến mức bạn cần giữ chúng trong các tệp riêng biệt thì bạn có thể cho chúng tôi biết điều gì làm cho chúng khác nhau không?
Pete

Câu trả lời:


14
MyGenericClass`1.cs
MyGenericClass`2.cs
MyGenericClass`3.cs

Và như vậy, trong đó số sau backtick là số tham số loại chung. Quy ước này được sử dụng bởi Microsoft.

Ngoài ra, bạn có thể sử dụng một cái gì đó như

MyGenericCollectionClass[TKey, TValue].cs

không chỉ lưu giữ số lượng tham số loại chung mà còn cả tên cụ thể của chúng. Cấp, nó không bảo tồn dấu ngoặc góc, nhưng chúng ta không thể có mọi thứ trong cuộc sống mà chúng ta muốn, phải không?


1
Trình biên dịch bên trong xáo trộn tên của các loại chung, thêm backtick và số lượng tham số chung vì .NET không cho phép nhiều loại có cùng tên với số lượng tham số chung khác nhau nhưng C # thì có. Vì vậy, quy ước đặt tên tệp phù hợp với những gì trình biên dịch làm.
CodeInChaos

1
Tôi muốn chứng minh bạn sai, nhưng thực ra bạn đã đúng: github.com/dotnet/corefx/tree/master/src/ tựa Tôi không thích quy ước này.
Den

1
@Den, có vẻ như bây giờ họ đã hối hận từ quy ước đó. Có lẽ nó ngụ ý một số vấn đề? github.com/dotnet/corefx/commit/ Mạnh
Sam

@Sam Hy vọng, không phải là vấn đề giao tiếp giữa các nhóm của Microsoft. Bởi vì không ai khác đang làm điều đó. Ngoài ra, theo ý kiến ​​của tôi, nhóm biên dịch, không phải nhóm thư viện quyết định.
Den

Tôi không có bóng để sử dụng "` "trong tên tệp.
Cristian E.

4

Trong trường hợp TupleActionPete đã đề cập, chính Microsoft sử dụng một tệp duy nhất - xem Tuple.csAction.cs .

Tôi nghĩ rằng nó một phần phụ thuộc vào việc các chức năng cho tất cả các lớp về cơ bản là giống nhau hay không. Cá nhân tôi không thích gộp các lớp vào một tệp, nhưng đây có thể là một ngoại lệ. Trong mã nguồn nơi tôi làm việc, tôi đã thêm một NamedTuplelớp được tạo tự động (sử dụng T4) , hoạt động theo cùng một cách Tuple, nhưng với một tên chuỗi là đối số đầu tiên vào hàm tạo.

Để trả lời câu hỏi của bạn, nếu bạn không muốn sử dụng một tệp duy nhất, có thể sử dụng MyClass_1.cs cho MyClass<T1>, MyClass_2.cs cho MyClass<T1, T2>, v.v.

Mặc dù không có tùy chọn nào là lý tưởng, vì vậy tôi có khuynh hướng đề xuất đối số "Microsoft thực hiện theo cách này, vì vậy ...".


2
TupleActionđều là đại biểu; họ không có bất kỳ mã triển khai nào, do đó, việc đặt tất cả các biến thể trong các tệp riêng biệt sẽ là vô nghĩa. Chỉ cần chứng minh rằng mọi quy tắc đều có ngoại lệ.
Robert Harvey

Vâng nói chung, việc đưa nhiều đại biểu công khai vào cùng một tệp được coi là ok (miễn là chúng có liên quan).
Stephen

1
@RobertHarvey, Tuplekhông phải là đại biểu, nhưng mỗi lần thực hiện đều ngắn.
Arturo Torres Sánchez

@ ArturoTorresSánchez: Phải, tôi đã nghĩ đến Func.
Robert Harvey

0

Bạn có tự hỏi, nếu các lớp học thực sự có cùng một ý định? Nếu một lớp chung chung hơn lớp kia, thì đó sẽ là GenericClass , MoreGenericClassMostGenericClass . Hãy tưởng tượng rằng mỗi tham số loại của một lớp sẽ thêm một chiều mới cho lớp đó, vì vậy nó có thể giúp hỏi nó là kích thước nào.

Hãy lấy ví dụ này:

  • Container<Thing>
  • MetricContainer<Thing, Metric>
  • MetricTransportableContainer<Thing, Metric, Transport>

Tôi biết rằng đó không phải là ví dụ tốt nhất, nhưng rất biểu cảm để hiển thị ba chiều:

  • Kích thước bên trong, những gì nó có thể tải
  • Số liệu Kích thước, với số liệu có thể được tải, chỉ bằng cách đếm số thứ hoặc bằng số đo vuông hoặc theo công suất hình khối hoặc theo trọng lượng
  • Kích thước bên ngoài, nơi nó có thể được tải.

Vì vậy, bạn có thể mô hình vận chuyển ô tô:

Container<Cars>
MetricContainer<Cars, CountMetric>
MetricTransportableContainer<Cars, CountMetric, Ship>

Vận chuyển chất lỏng:

Container<Fluid>
MetricContainer<Fluid, Volume>
MetricTransportableContainer<Fluid, Volume, Shelf>

Vận chuyển năng lượng:

Container<Energy>
MetricContainer<Energy, ElectricPower>
MetricTransportableContainer<Energy, ElectricPower, Box>

Vận chuyển đường, ngũ cốc:

Container<CrumblyMaterial>
MetricContainer<CrumblyMaterial, Weight>
MetricTransportableContainer<CrumblyMaterial, Weight, Silo>

Ôi, thật bất ngờ: a List<T>có một chiều đại diện cho những thứ mà danh sách có thể nắm giữ; và đây là Map<T, S>hai chiều đại diện cho những thứ mà bản đồ có thể giữ và các phím truy cập.


1
Tôi không nghĩ bạn đã hiểu câu hỏi. Nhìn vào đoạn cuối của câu hỏi.
Robert Harvey

1
@RobertHarvey Vui lòng đọc kỹ câu hỏi: tên lớp nên được bổ sung cho tên tệp. Nó có thể thay thế cho nhau. Vấn đề nằm ở việc phân tích sai về lớp và đặt tên sai của các lớp chung nói chung. Tóm lại câu trả lời của tôi: "Đặt tên cho nó là gì và không phải là gì."
shylynx


1
@RobertHarvey Đọc câu trả lời của tôi: Đặt một lớp vào một tệp!
shylynx

1
Tôi nghĩ rằng bạn đang thiếu điểm. Câu hỏi đặt ra câu hỏi: Làm thế nào để tôi đặt Tuple<T1>, Tuple<T1, T2>Tuple<T1, T2, T3>vào các tập tin CS riêng biệt trong một cách tiêu chuẩn, không có đụng độ tên?
Robert Harvey
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.