เป็นเรื่องยากที่จะตั้งชื่อคุณสมบัติ / สมาชิกเหมือนกับประเภทประกาศใน C # หรือไม่?


25

ตัวอย่างเช่นคลาสที่ชอบ:

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

แล้วคุณสมบัติเช่น:

Dog Dog { get; set; }

ฉันได้รับแจ้งว่าถ้าฉันไม่สามารถสร้างชื่อที่จินตนาการได้มากกว่านี้ฉันต้องใช้:

Dog DogObject { get; set; }

มีความคิดเกี่ยวกับวิธีตั้งชื่อให้ดีกว่านี้อย่างไร?


2
ข้อกำหนดนี้คุณได้รับการบอกกล่าวว่าดูเหมือนสมองตายบางทีอาจเป็นเพราะการบังคับใช้คำแนะนำที่ดีเกินไป (อย่าเพิ่งใช้ชื่อประเภทเมื่อมีชื่อที่ดีกว่า)

2
สิ่งนี้จะไม่ได้รวบรวมใน C # เนื่องจากชื่อสมาชิกจะต้องไม่เหมือนกันกับประเภทที่แนบมา
ลี

3
@ ลี: ฉันคิดว่าบริบทคืออสังหาริมทรัพย์ประเภทอื่น เช่นPersonคลาสที่มีDogคุณสมบัติที่เรียกว่าDog
goric

3
ฉันหมายความว่าถ้าเธอเป็นสุนัขแน่นอนให้ติดฉลากเธอเช่นนี้
Thomas Eding

1
การเน้นไวยากรณ์ของ IDE ของคุณควรแยกประเภทและคุณสมบัติ เมื่อคุณไม่ได้ใช้ IDE คุณสามารถดูบริบทได้ตลอดเวลา
Cyanfish

คำตอบ:


22

อาจเป็นวิธีปฏิบัติที่ไม่ดีถ้าไม่ใช่เพราะมันชัดเจนอยู่แล้วว่าคุณกำลังพูดถึงอะไรในโค้ดของคุณตามบริบท

Dog = new Dog();

ตัวสร้างประเภทใด วัตถุใด ไม่สับสน? ตกลงแล้วเป็นไง

Dog = Dog.Create()?

วัตถุใด ประเภทของโรงงานแบบคงที่ประเภทใด ยังไม่สับสนใช่ไหม ฉันไม่คิดอย่างนั้น

ครั้งเดียวที่ฉันเห็นว่านี่เป็นปัญหาที่อาจเกิดขึ้นคือเมื่อทรีเนมสเปซได้รับการอธิบายอย่างละเอียดและคอมไพเลอร์ไม่สามารถเข้าใจความคลุมเครือในกรณีนี้คุณเลิกกับสิ่งที่ชอบ

Dog = new Some.Namespace.Dog();

ไม่ว่าในกรณีใด ๆ สิ่งนี้ควรเกิดขึ้นกับคุณสมบัติอัตโนมัติ (และอาจจะนับรวม) เนื่องจากชื่อตัวแปรท้องถิ่นมักจะเป็น camelCased เสมอหลีกเลี่ยงความคลุมเครือทั้งหมด

dog = new Dog();

7
+1 และทางเลือกล้วนเลวร้ายลง: "TheDog", "AnyDog", "MyDog" ฯลฯ เมื่อไม่มีสิ่งใดที่จะเพิ่มดีที่สุดไม่ควรเพิ่มอะไรเลย
วินไคลน์

ฉันคิดว่าอันที่สองอาจสร้างความสับสนได้ด้วยเหตุผลบางอย่างที่Dogมีวิธีอินสแตนซ์ที่เรียกว่าCreateแต่คุณจะดำดิ่งลงไปในการเขียนโค้ดที่แย่มากในตอนนั้น
KDiTraglia

40

ไม่เพียงเป็นการปฏิบัติที่สมเหตุสมผลเท่านั้นภาษานี้ได้รับการออกแบบมาเป็นพิเศษเพื่อให้อนุญาต ค้นหาข้อกำหนด C # สำหรับ "Color Color" เพื่อดูกฎและข้ออ้างและดู

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

สำหรับบางกรณีมุมที่น่าสนใจที่เกิดขึ้นจากการตัดสินใจครั้งนี้

ไม่ควรตั้งชื่อสถานที่ให้บริการ "DogObject" เพื่อหลีกเลี่ยงการเรียกมันว่าเป็นประเภทเดียวกัน ที่ขัดแย้งโดยตรงกับแนวทางการออกแบบกรอบ


หากประเภทคุณสมบัติเป็นประเภทที่อินสแตนซ์ไม่มีรหัสประจำตัว (เช่นColor) การใช้งานดังกล่าวจะสมเหตุสมผล ฉันไม่ชอบมันมากนักแม้ว่ามีความไม่แน่นอนหรือIDisposableประเภท "ตัวควบคุมFont" อ้างถึงลักษณะของรัฐที่ถูกห่อหุ้มโดยทรัพย์สินหรือตามตัวอย่างที่Fontระบุโดยผู้บุกรุกทรัพย์สินหรือไม่?
supercat

7

เป็นเรื่องที่ดีพอที่จะเรียกมันว่าDogและนี่คือข้อเท็จจริงที่ Microsoft แนะนำในแนวทางการตั้งชื่อ Framework :

พิจารณาให้ชื่อเหมือนกันกับคุณสมบัติ

ตัวอย่างเช่นคุณสมบัติต่อไปนี้ได้รับและตั้งค่า enum ชื่อ Color อย่างถูกต้องดังนั้นคุณสมบัติจึงชื่อว่า Color

และนี่คือตัวอย่างที่พวกเขาใช้ในคำแนะนำข้างต้น:

public enum Color {...}
public class Control {
    public Color Color { get {...} set {...} }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.