1. คงเทียบกับอินสแตนซ์
ฉันคิดว่ามีแนวทางที่ชัดเจนมากเกี่ยวกับการออกแบบ OO ที่ดีคืออะไรและไม่ใช่อะไร ปัญหาคือว่า blogosphere ทำให้ยากที่จะแยกความดีออกจากสิ่งที่ไม่ดีและน่าเกลียด คุณสามารถหาข้อมูลอ้างอิงบางประเภทที่สนับสนุนแม้กระทั่งวิธีปฏิบัติที่แย่ที่สุดที่คุณคิด
และวิธีปฏิบัติที่แย่ที่สุดที่ฉันคิดได้ก็คือรัฐทั่วโลกรวมถึงสถิตยศาสตร์ที่คุณพูดถึงและซิงเกิลตันที่ทุกคนโปรดปราน ข้อความที่ตัดตอนมาจากการ Misko Hevery ของบทความคลาสสิกเกี่ยวกับเรื่องนี้
เพื่อทำความเข้าใจการอ้างอิงที่แท้จริงนักพัฒนาจะต้องอ่านรหัสทุกบรรทัด มันเป็นสาเหตุของการกระทำที่น่ากลัวที่ระยะทาง: เมื่อเรียกใช้ชุดทดสอบสถานะโกลบอลกลายพันธุ์ในการทดสอบครั้งเดียวอาจทำให้การทดสอบครั้งต่อไปหรือแบบขนานล้มเหลวโดยไม่คาดคิด ทำลายการพึ่งพาแบบคงที่โดยใช้การฉีดด้วยตนเองหรือ Guice
Spooky Action at a Distance คือเมื่อเรารันสิ่งหนึ่งที่เราเชื่อว่าถูกแยกออก (เนื่องจากเราไม่ได้ผ่านการอ้างอิงใด ๆ ) แต่การตอบโต้ที่ไม่คาดคิดและการเปลี่ยนแปลงสถานะเกิดขึ้นในตำแหน่งที่ห่างไกลของระบบซึ่งเราไม่ได้บอกวัตถุ สิ่งนี้สามารถเกิดขึ้นได้ผ่านสถานะสากล
คุณอาจไม่เคยคิดแบบนี้มาก่อน แต่เมื่อใดก็ตามที่คุณใช้สถานะคงที่คุณจะสร้างช่องทางการสื่อสารลับและไม่ทำให้ชัดเจนใน API Spooky Action at a Distance บังคับให้นักพัฒนาอ่านรหัสทุกบรรทัดเพื่อทำความเข้าใจกับการโต้ตอบที่อาจเกิดขึ้นลดประสิทธิภาพการทำงานของนักพัฒนาและสร้างความสับสนให้กับสมาชิกในทีมใหม่
สิ่งนี้ทำให้คุณไม่ควรให้การอ้างอิงแบบคงที่กับสิ่งใด ๆ ที่มีสถานะการจัดเก็บบางประเภท ที่เดียวที่ฉันใช้สถิตยศาสตร์คือค่าคงที่ที่ระบุและฉันมีความวิตกกังวลเกี่ยวกับเรื่องนั้น
2. วิธีการที่มีพารามิเตอร์อินพุตและค่าส่งคืนเทียบกับวิธีการที่ไม่มี
สิ่งที่คุณต้องรู้ก็คือวิธีการที่ไม่มีพารามิเตอร์อินพุตและไม่มีพารามิเตอร์เอาต์พุตจะรับประกันได้มากว่าจะทำงานในสถานะที่จัดเก็บภายในบางอย่าง (ไม่เช่นนั้นพวกเขากำลังทำอะไร) มีทั้งภาษาที่สร้างขึ้นจากแนวคิดในการหลีกเลี่ยงสถานะที่เก็บไว้
เมื่อใดก็ตามที่คุณเก็บสถานะคุณมีความเป็นไปได้ที่จะเกิดผลข้างเคียงดังนั้นให้แน่ใจว่าคุณใช้มันอย่างมีสติ นี่ก็หมายความว่าคุณควรชอบฟังก์ชั่นที่มีอินพุตและ / หรือเอาท์พุทที่กำหนดไว้
และในความเป็นจริงแล้วฟังก์ชั่นที่กำหนดอินพุตและเอาต์พุตนั้นง่ายต่อการทดสอบมาก - คุณไม่ต้องเรียกใช้ฟังก์ชั่นที่นี่และไปดูที่นั่นเพื่อดูว่าเกิดอะไรขึ้นและคุณไม่ต้องตั้งค่าคุณสมบัติที่ไหนสักแห่ง อื่นก่อนที่คุณจะเรียกใช้ฟังก์ชันภายใต้การทดสอบ
นอกจากนี้คุณยังสามารถใช้ฟังก์ชันประเภทนี้เป็นสเตติกได้อย่างปลอดภัย อย่างไรก็ตามฉันจะไม่ทำเพราะถ้าหลังจากนั้นฉันต้องการใช้การใช้งานฟังก์ชั่นที่แตกต่างกันเล็กน้อยที่อื่นแทนที่จะให้อินสแตนซ์ที่แตกต่างกับการใช้งานใหม่ฉันคงไม่มีทางแทนที่ฟังก์ชั่นการใช้งานได้
3. การทับซ้อนกับความแตกต่าง
ฉันไม่เข้าใจคำถาม ข้อได้เปรียบอะไรบ้างใน 2 วิธีที่ทับซ้อนกัน
4. ส่วนตัวกับสาธารณะ
อย่าเปิดเผยสิ่งที่คุณไม่จำเป็นต้องเปิดเผย อย่างไรก็ตามฉันไม่ใช่แฟนตัวยงของความเป็นส่วนตัวเช่นกัน ฉันไม่ใช่นักพัฒนา C # แต่เป็นนักพัฒนา ActionScript ฉันใช้เวลาส่วนใหญ่กับโค้ด Flex Framework ของ Adobe ซึ่งเขียนขึ้นประมาณปี 2550 และพวกเขาเลือกสิ่งที่ไม่ดีที่จะทำให้เป็นส่วนตัวซึ่งทำให้ฝันร้ายที่พยายามขยายคลาสของพวกเขา
ดังนั้นถ้าคุณคิดว่าคุณเป็นสถาปนิกที่ดีกว่านักพัฒนาของ Adobe ประมาณปี 2007 (จากคำถามของคุณฉันจะบอกว่าคุณมีเวลาอีกไม่กี่ปีก่อนที่คุณจะมีโอกาสที่จะเรียกร้องได้) คุณอาจต้องการเริ่มต้นเพื่อป้องกัน .
มีปัญหาบางอย่างกับตัวอย่างรหัสของคุณซึ่งหมายความว่าพวกเขาไม่ได้รับการออกแบบอย่างดีดังนั้นจึงไม่สามารถเลือก A หรือ B ได้
สำหรับสิ่งหนึ่งที่คุณอาจจะแยกการสร้างวัตถุของคุณจากการใช้งาน ดังนั้นคุณมักจะไม่มีnew XMLReader()
สิทธิ์ติดกับตำแหน่งที่ใช้
นอกจากนี้ตามที่ @djna พูดว่าคุณควรสรุปวิธีการที่ใช้ในเครื่องอ่าน XML ของคุณดังนั้น API ของคุณ (ตัวอย่างเช่น) อาจทำให้เข้าใจง่ายขึ้นเพื่อ:
_document Document = reader.read(info);
ฉันไม่ทราบว่า C # ทำงานอย่างไร แต่เนื่องจากฉันทำงานกับเทคโนโลยีเว็บจำนวนมากฉันจึงสงสัยว่าคุณจะไม่สามารถส่งคืนเอกสาร XML ได้ทันที (ยกเว้นอาจเป็นสัญญาหรือประเภทในอนาคต วัตถุ) แต่ฉันไม่สามารถให้คำแนะนำคุณเกี่ยวกับวิธีจัดการโหลดแบบอะซิงโครนัสใน C #
โปรดทราบว่าด้วยวิธีการนี้คุณสามารถสร้างการใช้งานหลายอย่างที่สามารถใช้พารามิเตอร์ที่บอกพวกเขาว่า / สิ่งที่จะอ่านและส่งกลับวัตถุ XML และสลับพวกเขาตามความต้องการโครงการของคุณ ตัวอย่างเช่นคุณอาจกำลังอ่านโดยตรงจากฐานข้อมูลจากร้านค้าในพื้นที่หรือในตัวอย่างดั้งเดิมของคุณจาก URL คุณไม่สามารถทำได้ถ้าคุณใช้วิธีการคงที่