คำถามที่กว้างขึ้น:
คุณเคยได้ยินเกี่ยวกับมาตรฐานดังกล่าวหรือไม่? ถ้าเป็นเช่นนั้นอะไรคือเหตุผลที่อยู่เบื้องหลัง
ใช่ฉันเคยได้ยินเรื่องนี้แล้วและการใช้ชื่อออบเจ็กต์ที่ผ่านการรับรองอย่างสมบูรณ์ช่วยป้องกันการชนกันของชื่อ แม้ว่าจะเกิดขึ้นได้ยากเมื่อพวกเขาเกิดขึ้นพวกเขาสามารถที่จะเข้าใจหนามเป็นพิเศษ
ตัวอย่าง:
สถานการณ์ประเภทนั้นน่าจะอธิบายได้ดีกว่าด้วยตัวอย่าง
สมมติว่าเรามีสองโครงการLists<T>
ที่เป็นของสองโครงการ
System.Collections.Generic.List<T>
MyCorp.CustomCollections.Optimized.List<T>
เมื่อเราใช้ชื่อออบเจ็กต์ที่ผ่านการรับรองอย่างสมบูรณ์จะเห็นได้ชัดว่าList<T>
กำลังใช้งานอะไรอยู่ ความชัดเจนนั้นมาจากต้นทุนของการใช้คำฟุ่มเฟือย
และคุณอาจโต้เถียงว่า "เดี๋ยวก่อน! ไม่มีใครจะใช้สองรายการแบบนั้น!" สิ่งใดที่ฉันจะชี้ให้เห็นสถานการณ์การบำรุงรักษา
คุณกำลังเขียนโมดูลFoo
สำหรับ บริษัท ของคุณซึ่งใช้ บริษัท List<T>
ที่ได้รับการอนุมัติการเพิ่มประสิทธิภาพ
using MyCorp.CustomCollections.Optimized;
public class Foo {
List<object> myList = ...;
}
ในภายหลังผู้พัฒนารายใหม่ตัดสินใจที่จะขยายงานที่คุณทำ ไม่ทราบถึงมาตรฐานของ บริษัท พวกเขาอัปเดตusing
บล็อก:
using MyCorp.CustomCollections.Optimized;
using System.Collections.Generic;
และคุณสามารถเห็นว่าสิ่งต่าง ๆ เป็นไปอย่างรวดเร็ว
ควรชี้ให้เห็นว่าคุณอาจมีคลาสที่เป็นกรรมสิทธิ์สองชื่อที่เหมือนกัน แต่ในเนมสเปซที่ต่างกันภายในโครงการเดียวกัน ดังนั้นจึงไม่ใช่แค่ความกังวลเกี่ยวกับการชนกับ. NET framework ที่จัดหาให้
MyCorp.WeightsAndLengths.Measurement();
MyCorp.TimeAndSpace.Measurement();
ความจริง:
ตอนนี้สิ่งนี้น่าจะเกิดขึ้นในโครงการส่วนใหญ่หรือไม่? ไม่ไม่ได้จริงๆ แต่เมื่อคุณทำงานในโครงการขนาดใหญ่ที่มีอินพุตจำนวนมากคุณทำอย่างดีที่สุดเพื่อลดโอกาสที่สิ่งต่าง ๆ จะระเบิดใส่คุณ
โครงการขนาดใหญ่ที่มีทีมที่ช่วยเหลือหลายคนเป็นสัตว์ร้ายชนิดพิเศษในโลกใบสมัคร กฎที่ดูเหมือนไม่มีเหตุผลสำหรับโครงการอื่น ๆ จะมีความเกี่ยวข้องมากขึ้นเนื่องจากมีการป้อนข้อมูลเข้าสู่โครงการและโอกาสที่ผู้มีส่วนร่วมไม่ได้อ่านแนวทางของโครงการ
สิ่งนี้สามารถเกิดขึ้นได้เมื่อรวมสองโครงการขนาดใหญ่เข้าด้วยกัน หากโครงการทั้งสองมีคลาสที่มีชื่อคล้ายกันคุณจะเห็นการชนกันเมื่อคุณเริ่มอ้างอิงจากโครงการหนึ่งไปยังอีกโครงการหนึ่ง และโครงการอาจใหญ่เกินไปที่จะทำการปรับโครงสร้างใหม่หรือการจัดการจะไม่อนุมัติค่าใช้จ่ายในการจัดสรรเวลาที่ใช้ในการปรับโครงสร้างใหม่
ทางเลือก:
ในขณะที่คุณไม่ได้ถามก็คุ้มค่าที่ชี้ให้เห็นว่านี่คือไม่ได้เป็นทางออกที่ดีในการแก้ไขปัญหา ไม่ใช่ความคิดที่ดีที่จะสร้างคลาสที่จะชนกันโดยไม่มีการประกาศเนมสเปซ
List<T>
โดยเฉพาะอย่างยิ่งควรถือว่าเป็นคำสงวนและไม่ใช้เป็นชื่อสำหรับชั้นเรียนของคุณ
เช่นเดียวกันเนมสเปซแต่ละรายการภายในโครงการควรพยายามมีชื่อคลาสที่ไม่ซ้ำกัน ต้องลองและจำชื่อที่Foo()
คุณกำลังทำงานกับnamespace ที่เป็นค่าใช้จ่ายทางจิตที่หลีกเลี่ยงที่ดีที่สุด กล่าวอีกวิธีหนึ่งคือการมีMyCorp.Bar.Foo()
และMyCorp.Baz.Foo()
กำลังจะไปพัฒนานักพัฒนาของคุณและหลีกเลี่ยงที่ดีที่สุด
หากไม่มีอะไรอื่นคุณสามารถใช้เนมสเปซบางส่วนเพื่อแก้ไขความกำกวม ตัวอย่างเช่นหากคุณไม่สามารถเปลี่ยนชื่อFoo()
คลาสได้คุณสามารถใช้เนมสเปซบางส่วนได้:
Bar.Foo()
Baz.Foo()
เหตุผลเฉพาะสำหรับโครงการปัจจุบันของคุณ:
คุณอัปเดตคำถามของคุณด้วยเหตุผลเฉพาะที่คุณได้รับสำหรับโครงการปัจจุบันของคุณตามมาตรฐานนั้น ลองมาดูพวกเขาแล้วขุดลงไปตามทางกระต่าย
เป็นเรื่องยุ่งยากที่จะวางเมาส์เหนือชื่อเพื่อให้ได้ชนิดที่ผ่านการรับรองโดยสมบูรณ์ มันจะดีกว่าที่จะมีประเภทที่มีคุณสมบัติครบถ้วนมองเห็นได้ตลอดเวลา
"ยุ่งยาก?" อืมไม่. อาจจะน่ารำคาญ ย้ายไม่กี่ออนซ์พลาสติกในการสั่งซื้อที่จะเปลี่ยนตัวชี้บนหน้าจอไม่ยุ่งยาก แต่ฉันเชือนแช
การใช้เหตุผลในแนวนี้ดูเหมือนจะเป็นการปกปิดมากกว่าสิ่งอื่นใด ด้วยมือของฉันฉันเดาว่าคลาสภายในแอปพลิเคชันนั้นมีชื่อที่อ่อนแอและคุณต้องพึ่งพาเนมสเปซเพื่อที่จะรวบรวมข้อมูลเชิงความหมายในปริมาณที่เหมาะสมรอบ ๆ ชื่อคลาส
นี่ไม่ใช่เหตุผลที่ถูกต้องสำหรับชื่อคลาสที่ผ่านการรับรองอย่างสมบูรณ์อาจเป็นเหตุผลที่ถูกต้องสำหรับการใช้ชื่อคลาสที่ผ่านการรับรองบางส่วน
ตัวอย่างโค้ดที่ส่งทางอีเมลนั้นไม่มีชื่อที่ผ่านการรับรองดังนั้นจึงเป็นเรื่องยากที่จะเข้าใจ
บรรทัดการให้เหตุผล (ต่อนี้) ตอกย้ำความสงสัยของฉันว่าชั้นเรียนมีชื่อไม่ดีในขณะนี้ อีกครั้งการมีชื่อคลาสที่ไม่ดีไม่ใช่เหตุผลที่ดีที่ต้องการให้ทุกสิ่งใช้ชื่อชั้นที่มีคุณสมบัติครบถ้วน หากชื่อชั้นเรียนเข้าใจยากมีความผิดพลาดมากกว่าชื่อชั้นที่มีคุณสมบัติครบถ้วนที่สามารถแก้ไขได้
เมื่อดูหรือแก้ไขรหัสด้านนอกของ Visual Studio (ตัวอย่างเช่น Notepad ++) เป็นไปไม่ได้ที่จะได้รับชื่อประเภทที่ผ่านการรับรองโดยสมบูรณ์
ด้วยเหตุผลทั้งหมดสิ่งนี้ทำให้ฉันเกือบจะคายเครื่องดื่มของฉัน แต่อีกครั้งฉันพูดนอกเรื่อง
ฉันเหลือสงสัยว่าทำไมทีมแก้ไขหรือดูรหัสนอก Visual Studio บ่อยๆ และตอนนี้เรากำลังดูเหตุผลที่ค่อนข้างฉากกับสิ่งที่ namespaces มีความหมายที่จะให้ นี่คืออาร์กิวเมนต์ที่ได้รับการสนับสนุนด้านเครื่องมือในขณะที่ namespaces อยู่ที่นั่นเพื่อจัดเตรียมโครงสร้างองค์กรให้กับโค้ด
ดูเหมือนว่าโครงการของคุณจะได้รับผลกระทบจากข้อตกลงการตั้งชื่อที่ไม่ดีพร้อมกับนักพัฒนาที่ไม่ได้ใช้ประโยชน์จากสิ่งที่เครื่องมือสามารถให้ได้ และแทนที่จะแก้ไขปัญหาที่เกิดขึ้นจริงพวกเขาได้พยายามที่จะตบวงช่วยเหลือมากกว่าหนึ่งในอาการและต้องการชื่อชั้นที่มีคุณสมบัติครบถ้วน ฉันคิดว่ามันปลอดภัยที่จะจัดหมวดหมู่นี้เป็นแนวทางที่เข้าใจผิด
ระบุว่ามีคลาสที่มีชื่อไม่ดีและสมมติว่าคุณไม่สามารถสร้างซ้ำได้คำตอบที่ถูกต้องคือการใช้ Visual Studio IDE เพื่อประโยชน์เต็มที่ อาจพิจารณาเพิ่มในปลั๊กอินเช่นแพ็คเกจ VS PowerTools จากนั้นเมื่อฉันดูที่AtrociouslyNamedClass()
ฉันสามารถคลิกที่ชื่อคลาสกด F12 และนำไปสู่คำจำกัดความของคลาสโดยตรงเพื่อให้เข้าใจสิ่งที่พยายามทำดีขึ้น ในทำนองเดียวกันฉันสามารถคลิก Shift-F12 เพื่อค้นหาจุดทั้งหมดในรหัสที่กำลังใช้งานAtrociouslyNamedClass()
อยู่
เกี่ยวกับข้อกังวลด้านเครื่องมือภายนอก - สิ่งที่ดีที่สุดที่ควรทำคือหยุดมันไว้ อย่าส่งตัวอย่างข้อมูลอีเมลไปๆมาๆหากไม่ชัดเจนทันทีถึงสิ่งที่อ้างอิง อย่าใช้เครื่องมืออื่นนอกเหนือจาก Visual Studio เนื่องจากเครื่องมือเหล่านั้นไม่มีสติปัญญารอบ ๆ รหัสที่ทีมของคุณต้องการ Notepad ++ เป็นเครื่องมือที่ยอดเยี่ยม แต่ก็ไม่ได้ถูกตัดออกสำหรับงานนี้
ดังนั้นฉันเห็นด้วยกับการประเมินของคุณเกี่ยวกับเหตุผลเฉพาะสามประการที่คุณได้รับ ที่กล่าวว่าสิ่งที่ฉันคิดว่าคุณบอกว่า "เรามีปัญหาพื้นฐานในโครงการนี้ที่ไม่สามารถ / ไม่ได้อยู่และนี่คือวิธีที่เรา 'แก้ไข' พวกเขา" และเห็นได้ชัดว่าพูดถึงปัญหาที่ลึกกว่าภายในทีมที่อาจทำหน้าที่เป็นธงสีแดงสำหรับคุณ