ข้อดีของการ FindById ()
อนาคตพิสูจน์อักษร : ถ้าคุณเริ่มต้นด้วยFind(int)
และต่อมามีการเพิ่มวิธีการอื่น ๆ ( FindByName(string)
, FindByLegacyId(int)
, FindByCustomerId(int)
, FindByOrderId(int)
ฯลฯ ) FindById(int)
คนอย่างผมมักจะใช้ทุกเพศทุกวัยที่กำลังมองหา ไม่ใช่ปัญหาหากคุณสามารถและจะเปลี่ยนFind(int)
เป็นFindById(int)
เมื่อจำเป็น - การพิสูจน์ในอนาคตเกี่ยวกับสิ่งเหล่านี้ถ้า s
ให้อ่านง่ายขึ้น Find
เป็นอย่างดีดีถ้าโทรลักษณะชอบrecord = Find(customerId);
แต่จะง่ายขึ้นเล็กน้อยสำหรับการอ่านถ้ามันFindById
record = FindById(AFunction());
ความมั่นคง คุณสามารถใช้FindByX(int)
/ FindByY(int)
รูปแบบได้อย่างสม่ำเสมอทุกที่ แต่Find(int X)
/ Find(int Y)
เป็นไปไม่ได้เพราะขัดกัน
ข้อดีของการค้นหา ()
- จูบ.
Find
เรียบง่ายและตรงไปตรงมาและอยู่ข้างoperator[]
หนึ่งในสองชื่อฟังก์ชันที่คาดหวังมากที่สุดในบริบทนี้ (บางทางเลือกที่ได้รับความนิยมเป็นget
, lookup
หรือfetch
ขึ้นอยู่กับบริบท)
- ตามกฎของหัวแม่มือหากคุณมีชื่อฟังก์ชั่นซึ่งเป็นคำที่รู้จักกันดีซึ่งอธิบายถึงสิ่งที่ฟังก์ชันใช้อย่างถูกต้อง แม้ว่าจะมีชื่อหลายคำที่ยาวกว่าซึ่งดีกว่าเล็กน้อยในการอธิบายสิ่งที่ฟังก์ชั่นทำ ตัวอย่าง: ความยาว VS NumberOfElements มีการแลกเปลี่ยนกันและตำแหน่งที่จะลากเส้นนั้นเป็นเรื่องของการถกเถียง
- เป็นเรื่องปกติที่จะหลีกเลี่ยงความซ้ำซ้อน ถ้าเราดู
FindById(int id)
เราสามารถลบความซ้ำซ้อนได้อย่างง่ายดายโดยเปลี่ยนเป็นFind(int id)
แต่มีการแลกเปลี่ยน - เราสูญเสียความชัดเจน
หรือคุณจะได้รับประโยชน์จากทั้งคู่โดยใช้รหัสที่พิมพ์อย่างมาก:
CustomerRecord Find(Id<Customer> id)
// Or, depending on local coding standards
CustomerRecord Find(CustomerId id)
การติดตั้งใช้งานId<>
: พิมพ์ค่า ID อย่างมากใน C #
ความคิดเห็นที่นี่รวมทั้งในลิงก์ด้านบนทำให้เกิดข้อกังวลหลายประการเกี่ยวกับการId<Customer>
ที่ฉันต้องการจะกล่าวถึง:
- ข้อกังวลที่ 1: เป็นการใช้ชื่อสามัญอย่างไม่เหมาะสม
CustomerId
และOrderID
เป็นประเภทที่แตกต่างกัน ( customerId1 = customerId2;
=> ดี, customerId1 = orderId1;
=> ไม่ดี) แต่การใช้งานของพวกเขาเกือบจะเหมือนกันดังนั้นเราจึงสามารถนำไปใช้งานได้ด้วยการคัดลอกหรือวาง ในขณะที่มีค่าในการอภิปรายเกี่ยวกับการเปิดเผยหรือซ่อนทั่วไป metaprogramming เป็นสิ่งที่ generics มีไว้สำหรับ
- ความกังวลที่ 2: มันไม่ได้หยุด mistakes./It's ง่ายวิธีการแก้ปัญหาในการค้นหาของปัญหา
DoSomething(int customerId, int orderId, int productId)
ปัญหาหลักที่ถูกลบออกโดยใช้ขอพิมพ์รหัสเป็นคำสั่งอาร์กิวเมนต์ไม่ถูกต้องในการเรียกไปยัง รหัสที่พิมพ์อย่างมากยังป้องกันปัญหาอื่น ๆ รวมถึง OP ที่ถามด้วย
- ข้อกังวลที่ 3: มันเป็นการปิดบังรหัสจริงๆ เป็นการยากที่จะบอกว่ามี ID อยู่
int aVariable
หรือไม่ ง่ายที่จะบอกว่ามีการถือครองรหัสId<Customer> aVariable
และเราสามารถบอกได้ว่าเป็นรหัสลูกค้า
- ข้อกังวลที่ 4: รหัสเหล่านี้ไม่มีประเภทที่แข็งแกร่งเพียงแค่ห่อหุ้ม เป็นเพียงเสื้อคลุมรอบ
String
byte[]
การห่อหุ้มหรือการห่อหุ้มไม่ได้ขัดแย้งกับการพิมพ์ที่รัดกุม
- ข้อกังวลที่ 5: มันผ่านการออกแบบมา ต่อไปนี้เป็นรุ่นที่น้อยที่สุด แต่ฉันขอแนะนำให้เพิ่ม
operator==
และoperator!=
เช่นกันถ้าคุณไม่ต้องการพึ่งพาเฉพาะในEquals
:
.
public struct Id<T>: {
private readonly int _value ;
public Id(int value) { _value = value; }
public static explicit operator int(Id<T> id) { return id._value; }
}
T Find<T>(string name)
หรือ(int size)
คุณวางแผนที่จะแก้ไขปัญหาที่หลีกเลี่ยงไม่ได้อย่างไร