Có phải là thông lệ kém khi đặt tên một tài sản / thành viên giống như kiểu khai báo trong C #?


25

Ví dụ, một lớp như:

class Dog { } //never mind that there's nothing in it...

và sau đó một tài sản như:

Dog Dog { get; set; }

Tôi đã nói rằng nếu tôi không thể đưa ra một cái tên giàu trí tưởng tượng hơn cho nó, thì tôi phải sử dụng:

Dog DogObject { get; set; }

Bất kỳ suy nghĩ về làm thế nào để đặt tên này tốt hơn?


2
Yêu cầu này bạn đã được thông báo về việc dường như chết não, có lẽ do việc thực thi quá mức một hướng dẫn tốt (không chỉ sử dụng tên loại khi có tên tốt hơn).

2
Điều này thậm chí sẽ không được biên dịch trong C # vì tên thành viên không thể giống với kiểu kèm theo.
Lee

3
@Lee: Tôi nghĩ bối cảnh là tài sản thuộc loại khác. Ví dụ: một Personlớp có chứa một thuộc Dogtính được gọi làDog
goric

3
Ý tôi là, nếu cô ấy thực sự là một con chó, hãy gán cho cô ấy như vậy.
Thomas Eding

1
Làm nổi bật cú pháp IDE của bạn nên phân biệt loại và thuộc tính. Khi bạn không sử dụng IDE, bạn luôn có thể xem xét ngữ cảnh.
Cá Cyanfish

Câu trả lời:


22

Đó có thể là một thực tiễn tồi, vì thực tế không phải là điều hiển nhiên mà bạn đang nói về mã của bạn, dựa trên ngữ cảnh.

Dog = new Dog();

Đó là loại xây dựng? Đó là đối tượng nào? Không nhầm lẫn? Được rồi, thế còn

Dog = Dog.Create()?

Đó là đối tượng nào? Đó là phương pháp nhà máy tĩnh trên các loại? Vẫn không nhầm lẫn? Tôi đã không nghĩ như vậy.

Lần duy nhất tôi thấy đây là một vấn đề tiềm ẩn là khi cây không gian tên khá phức tạp và trình biên dịch không thể tìm ra sự mơ hồ, trong trường hợp bạn kết thúc với một cái gì đó như

Dog = new Some.Namespace.Dog();

Trong mọi trường hợp, điều này chỉ xảy ra với Thuộc tính tự động (và có lẽ là enums), vì tên biến cục bộ luôn được camelCase, tránh hoàn toàn sự mơ hồ.

dog = new Dog();

7
+1. Và các lựa chọn thay thế đều tệ hơn: "TheDog", "AnyDog", "MyDog", v.v. Khi không có gì để thêm, tốt nhất không nên thêm bất cứ thứ gì.
kevin cline

Tôi cho rằng cái thứ hai có thể gây nhầm lẫn nếu vì một lý do nào đó Dogcó một phương thức cá thể được gọi Create, nhưng bạn sẽ đi sâu vào một số thực tiễn mã hóa khá khủng khiếp vào thời điểm đó.
KDiTraglia

40

Đây không chỉ là một thực tiễn hợp lý, ngôn ngữ được thiết kế đặc biệt để cho phép điều này. Tìm kiếm thông số kỹ thuật C # cho "Màu màu" để biết các quy tắc và biện minh, và xem

http://bloss.msdn.com/b/ericlippert/archive/2009/07/06/color-color.aspx

cho một số trường hợp góc thú vị phát sinh từ quyết định này.

Trong mọi trường hợp, bạn không nên đặt tên một thuộc tính là "DogObject" để tránh gọi nó giống như loại của nó; mà trực tiếp mâu thuẫn với các hướng dẫn thiết kế khung.


Nếu loại thuộc tính là một loại mà các thể hiện không có danh tính (ví dụ Color), việc sử dụng đó có vẻ hợp lý. Mặc dù vậy, tôi không thích nó lắm, với IDisposablecác loại hoặc có thể thay đổi . "Kiểm soát Font" có đề cập đến các khía cạnh của trạng thái được gói gọn bởi tài sản hoặc đối với trường hợp Fontđược xác định bởi người nhận tài sản không?
supercat

7

Gọi nó là hoàn toàn tốt Dogvà đây thực tế là những gì Microsoft khuyến nghị trong hướng dẫn đặt tên Khung :

NGƯỜI TIÊU DÙNG cho một tài sản cùng tên với loại của nó.

Ví dụ: thuộc tính sau được nhận chính xác và đặt giá trị enum có tên là Màu, do đó thuộc tính được đặt tên là Màu.

Và đây là ví dụ họ sử dụng trong hướng dẫn trên:

public enum Color {...}
public class Control {
    public Color Color { get {...} set {...} }
}
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.