ฉันกำลังเขียนชั้นเรียนที่ "ต้องใช้ในทางที่เฉพาะเจาะจง" (ฉันเดาว่าชั้นเรียนทั้งหมดต้อง ... )
ตัวอย่างเช่นผมสร้างfooManager
ชั้นซึ่งต้องมีInitialize(string,string)
การเรียกร้องให้พูดให้ และเพื่อผลักดันตัวอย่างต่อไปอีกเล็กน้อยชั้นเรียนจะไร้ประโยชน์หากเราไม่ฟังการThisHappened
กระทำของมัน
ประเด็นของฉันคือชั้นเรียนที่ฉันเขียนต้องใช้วิธีการโทร แต่มันจะรวบรวมได้ดีถ้าคุณไม่เรียกวิธีการเหล่านั้นและจะจบลงด้วย FooManager ใหม่ที่ว่างเปล่า ในบางจุดมันอาจจะไม่ทำงานหรืออาจผิดพลาดขึ้นอยู่กับคลาสและสิ่งที่ทำ โปรแกรมเมอร์ที่ใช้ชั้นเรียนของฉันจะมองเข้าไปข้างในอย่างชัดเจนและตระหนักว่า "โอ้ฉันไม่ได้เรียก Initialize!" และมันก็ใช้ได้
แต่ฉันไม่ชอบมัน สิ่งที่ฉันต้องการนึกคิดคือรหัสที่จะไม่คอมไพล์หากไม่มีการเรียกใช้เมธอด ฉันเดาว่ามันเป็นไปไม่ได้ หรือบางสิ่งที่จะมองเห็นได้ชัดเจนทันที
ฉันพบว่าตัวเองมีปัญหาด้วยวิธีการปัจจุบันที่ฉันมีที่นี่ซึ่งต่อไปนี้:
เพิ่มค่าบูลีนส่วนตัวในชั้นเรียนและตรวจสอบทุกที่ที่จำเป็นหากมีการเริ่มต้นชั้นเรียน ถ้าไม่ฉันจะโยนข้อยกเว้นว่า "ชั้นไม่ได้เริ่มต้นคุณแน่ใจหรือว่าคุณโทร.Initialize(string,string)
?"
ฉันค่อนข้างโอเคกับวิธีการนี้ แต่มันนำไปสู่โค้ดจำนวนมากที่ถูกคอมไพล์และในที่สุดก็ไม่จำเป็นสำหรับผู้ใช้ปลายทาง
นอกจากนี้บางครั้งรหัสก็ยิ่งมากขึ้นเมื่อมีวิธีการมากกว่าการInitiliaze
โทร ฉันพยายามทำให้ชั้นเรียนของฉันมีวิธีการ / การกระทำสาธารณะไม่มากเกินไป แต่นั่นก็ไม่ได้แก้ปัญหา แต่ก็ทำให้มันสมเหตุสมผล
สิ่งที่ฉันกำลังมองหาคือ
- วิธีการของฉันถูกต้องหรือไม่
- มีดีกว่าไหม
- พวกคุณทำอะไร / ให้คำแนะนำ?
- ฉันพยายามที่จะแก้ปัญหาที่ไม่ใช่ปัญหาหรือไม่? ฉันได้รับการบอกเล่าจากเพื่อนร่วมงานว่าเป็นโปรแกรมเมอร์ที่จะตรวจสอบชั้นเรียนก่อนที่จะพยายามใช้ ฉันไม่เห็นด้วยอย่างเคารพ แต่นั่นเป็นอีกเรื่องที่ฉันเชื่อ
พูดง่ายๆก็คือฉันกำลังพยายามหาวิธีที่จะไม่ลืมที่จะโทรออกเมื่อมีการนำคลาสนั้นมาใช้ในภายหลังหรือโดยคนอื่น
การจำแนก:
เพื่อชี้แจงคำถามมากมายที่นี่:
ฉันไม่เพียง แต่พูดถึงส่วนเริ่มต้นของชั้นเรียนเท่านั้น แต่ยังเป็นตลอดชีวิต ป้องกันไม่ให้เพื่อนร่วมงานเรียกวิธีการสองครั้งตรวจสอบให้แน่ใจว่าพวกเขาเรียก X ก่อน Y และอื่น ๆ สิ่งใดที่จะต้องถูกบังคับและเป็นเอกสาร แต่ฉันต้องการรหัสและเรียบง่ายและเล็กที่สุด ฉันชอบความคิดของ Asserts จริงๆ แต่ฉันค่อนข้างแน่ใจว่าฉันจะต้องผสมผสานความคิดอื่น ๆ เข้าด้วยกันเพราะ Asserts จะไม่สามารถทำได้เสมอไป
ฉันใช้ภาษา C #! ฉันไม่ได้พูดถึงสิ่งนั้นได้อย่างไร! ฉันอยู่ในสภาพแวดล้อม Xamarin และการสร้างแอพมือถือมักจะใช้เวลาประมาณ 6 ถึง 9 โครงการในการแก้ปัญหารวมถึงโครงการ PCL, iOS, Android และ Windows ฉันเป็นนักพัฒนามาประมาณหนึ่งปีครึ่ง (รวมโรงเรียนและที่ทำงาน) ดังนั้นบางครั้งข้อความ / คำถามที่ไร้สาระของฉัน สิ่งที่อาจไม่เกี่ยวข้องในที่นี้ แต่ข้อมูลที่มากเกินไปไม่ได้เป็นเรื่องเลวร้ายเสมอไป
ฉันไม่สามารถวางทุกอย่างที่จำเป็นใน Constructor ได้เสมอเนื่องจากข้อ จำกัด ของแพลตฟอร์มและการใช้ Dependency Injection การมีพารามิเตอร์อื่นนอกเหนือจากอินเตอร์เฟสจะปิดใช้งานตาราง หรือบางทีความรู้ของฉันไม่เพียงพอซึ่งเป็นไปได้สูง ส่วนใหญ่แล้วไม่ใช่ปัญหาการเริ่มต้น แต่มีมากกว่านั้น
ฉันจะแน่ใจได้อย่างไรว่าเขาลงทะเบียนกับกิจกรรมนั้น
ฉันจะแน่ใจได้อย่างไรว่าเขาไม่ลืมที่จะ "หยุดกระบวนการในบางจุด"
ที่นี่ฉันจำคลาสที่เรียกโฆษณาได้ ตราบใดที่มุมมองที่มองเห็นโฆษณาปรากฏให้เห็นชั้นจะดึงโฆษณาใหม่ทุกนาที คลาสนั้นต้องการมุมมองเมื่อสร้างที่ซึ่งสามารถแสดงโฆษณาซึ่งสามารถไปในพารามิเตอร์ได้อย่างชัดเจน แต่เมื่อมุมมองหายไปต้องเรียกใช้ StopFetching () มิฉะนั้นชั้นจะดึงโฆษณาสำหรับมุมมองที่ไม่ได้มีและยังไม่ดี
นอกจากนี้คลาสนั้นยังมีกิจกรรมที่ต้องรับฟังเช่น "AdClicked" เป็นต้น ทุกอย่างทำงานได้ดีถ้าไม่ฟัง แต่เราสูญเสียการติดตามการวิเคราะห์ที่นั่นหากไม่ได้ลงทะเบียนก๊อก โฆษณายังคงทำงานอยู่ดังนั้นผู้ใช้และนักพัฒนาจะไม่เห็นความแตกต่างและการวิเคราะห์จะมีข้อมูลที่ไม่ถูกต้อง จำเป็นต้องหลีกเลี่ยง แต่ฉันไม่แน่ใจว่านักพัฒนาจะรู้ได้อย่างไรว่าพวกเขาจะต้องลงทะเบียนกับกิจกรรมเต่า นั่นเป็นตัวอย่างที่เรียบง่าย แต่มีแนวคิดอยู่ที่นั่น "ให้แน่ใจว่าเขาใช้การกระทำสาธารณะที่มีให้" และในเวลาที่ถูกต้องแน่นอน!
initialize
สายหลังจากการสร้างวัตถุหรือไม่ ctor จะ "เสี่ยงเกินไป" ในแง่ที่มันสามารถโยนข้อยกเว้นและทำลายห่วงโซ่การสร้างได้หรือไม่?
new
ถ้าไม่พร้อมที่จะใช้งาน การใช้วิธีการเริ่มต้นต้องกลับมาหลอกหลอนคุณและควรหลีกเลี่ยงหากจำเป็นจริงๆอย่างน้อยนั่นก็เป็นประสบการณ์ของฉัน