ตกลงดังนั้นนี่เป็นคำถามสนับสนุนปีศาจจริงๆ
เมื่อใดที่ตัวแปรทั่วโลกใช้ได้และถ้าไม่เคยคุณจะใช้เป็นทางเลือกอะไร?
กรณีที่น่าสนใจสำหรับคำถามนี้ฟิลด์คลาสสแตติกสาธารณะแตกต่างจากโกลบอลอย่างไร
ตกลงดังนั้นนี่เป็นคำถามสนับสนุนปีศาจจริงๆ
เมื่อใดที่ตัวแปรทั่วโลกใช้ได้และถ้าไม่เคยคุณจะใช้เป็นทางเลือกอะไร?
กรณีที่น่าสนใจสำหรับคำถามนี้ฟิลด์คลาสสแตติกสาธารณะแตกต่างจากโกลบอลอย่างไร
คำตอบ:
เท่าที่ฉันทราบแล้วฟิลด์สแตติกสาธารณะนั้นเป็นพื้นโลกที่กำหนดว่าสามารถเรียกใช้ได้จากทุกที่โดยมีข้อยกเว้นว่าจะไม่ทำให้เกิดการปิดกั้นเนมสเปซ
ครั้งเดียวที่ฉันใช้ตัวแปร 'โกลบอล' โดยส่วนตัวในโค้ดของฉันอยู่ในรูปแบบของฟิลด์สแตติกสาธารณะที่ไม่เปลี่ยนรูป ในกรณีนี้ไม่จำเป็นต้องกังวลเกี่ยวกับค่าที่ถูกหมุนไปรอบ ๆ โดยส่วนอื่น ๆ ของโปรแกรมและแน่นอนว่ามันดีกว่าการมีตัวแปรโหลที่มีค่าถาวรเหมือนกันในแต่ละชั้นเรียน
โดยส่วนตัวแล้วฉันใช้ globals สำหรับการกำหนดค่ารันไทม์ - หากมีการโหลดคุณสมบัติการกำหนดค่าเมื่อเริ่มต้นแอปพลิเคชันและมีการเปลี่ยนแปลงไม่บ่อยนัก (และจากที่เดียวเท่านั้น) มันแย่มากและเกิดข้อผิดพลาดได้ง่าย ในบางจุด ดีกว่าการใช้สิ่งที่สามารถนำมาใช้ในขอบเขตจากทุกที่ที่จำเป็นต้องใช้เพราะจะไม่เกะกะและบดบังลายเซ็นวิธีการและไซต์การโทรของคุณ
CONFIG_
หรือCFG_
คำนำหน้า
หากไม่รวมระบบเวลาจริง / ระบบฝังตัวคุณควรใช้ globals สำหรับค่าคงที่เท่านั้นจริงๆ หากคุณรู้สึกว่าคุณไม่สามารถแก้ปัญหาได้หากไม่มีพวกเขาคุณอาจทำอะไรผิดพลาด
นอกจากนี้ให้ดูที่รูปแบบซิงเกิลมันเย็นจัดเป็นทางออกที่ดีกว่าสำหรับกลุ่มกลมในสถานการณ์เหล่านั้นเมื่อคุณต้องการบางสิ่งบางอย่างเพื่อให้มีจุดเชื่อมต่อส่วนกลาง
TIMES_TO_ITERATE_THROUGH_THIS_PARTICULAR_LOOP
มีความเกี่ยวข้องเฉพาะในไฟล์ / คลาส / ส่วนที่ 'ลูปเฉพาะนี้' ปรากฏขึ้น
ปัญหาเกี่ยวกับตัวแปรโกลบอลคือคุณต้องระวังทุกที่ในรหัสของคุณ อย่างไรก็ตามเมื่อคุณตัดสินใจว่าคุณจำเป็นต้องรู้เกี่ยวกับโลกโดยเฉพาะมีการสูญเสียการใช้งานมากขึ้นอีกเล็กน้อย ดังนั้นความคิดเห็นของฉันคือคุณควรมีตัวแปรระดับโลกน้อยมาก แต่ส่วนน้อยที่คุณมีคุณควรได้รับไมล์สะสมสูงสุดจาก
สำหรับอีกตัวอย่างหนึ่งของบางสิ่งที่ฉันรู้สึกเช่นนี้ดูที่การใช้มิกซ์อินในทับทิม
มันคือทั้งหมดที่เกี่ยวกับเนมสเปซ
ลองนึกภาพว่าทุกคนในโลกนี้มีนามสกุลเดียวกัน ช่างเป็นระเบียบ
(ในอินเดียชาวซิกข์มีนามสกุลเดียวกันทั้งหมด: ซิงห์ - ลองดู)
เวอร์ชั่นสั้น: เมื่อใดที่ทำให้มีเหตุผลเกี่ยวกับโปรแกรมง่ายขึ้น กรณีทั่วไปคือสถานะโกลบอลหรือสแตติกรีซอร์สที่ถูกใช้อย่างกว้างขวาง
รุ่นยาว: Tom Hawtin พูดว่า "ด้วยการกระทำที่น่ากลัวในระยะไกล" ... นั่นเป็นปัญหาที่เกิดขึ้นกับ globals - คุณต้องรู้ว่ามันถูกใช้ที่ไหนและอย่างไรหรือคุณจะได้รับอะไรแปลก ๆ และยากที่จะตามหา เป็นโรคจิต ชาวบ้านไม่มีอะไรมากไปกว่ากลยุทธ์ในการลดขอบเขตของสิ่งที่โปรแกรมเมอร์ต้องเข้าใจเพื่อให้เหตุผลเกี่ยวกับโปรแกรม
ปัญหาอีกด้านหนึ่งของการรู้ว่าพวกเขากำลังใช้อยู่ที่ไหนคือคุณสามารถจบลงด้วยการซ้ำซ้อนกันได้ซึ่งในกรณีนี้สิ่งต่าง ๆ จะแปลกจริง ๆ เมื่อโปรแกรมส่วนใหญ่ได้รับและตั้งค่า var1 ขณะที่ใช้ var2 สองแห่ง ข้อมูลเดียวกัน โดยเฉพาะอย่างยิ่งเมื่อมีหลายคนกำลังทำงานกับรหัสเดียวกัน IDE มีประโยชน์ในการค้นหาการใช้งานซึ่งจะช่วยลดต้นทุนของ globals แต่ไม่ได้ทำซ้ำ
ยิ่งคุณมีความลำบากมากขึ้นเท่าไหร่ก็ยิ่งต้องติดตามสิ่งที่เกิดขึ้นกับพวกมันมากขึ้นเท่านั้น พวกเขาควรจะน้อยและไกล
gotchas ทั้งสองที่มีกลมและเดี่ยวมีความสามารถในการทดสอบและการนำไปใช้งาน
สำหรับการทดสอบฉันได้เห็นชุดการทดสอบที่ซับซ้อนมากเกินไปมากเกินไปเพียงเพื่อจัดการกับอายุการใช้งานทั่วโลกและซิงเกิลซิงเกิลที่วางแผนไว้ไม่ดี ตรวจสอบให้แน่ใจว่าวัตถุใด ๆ นั้นมีกฎเริ่มต้นและเริ่มที่ชัดเจนและเรียบง่าย
สำหรับการปรับใช้มีสองกรณีที่ต้องพิจารณา ประการแรกวัตถุระดับโลกของคุณจะอยู่อย่างไร มันอยู่ในห้องสมุดคงที่หรือแบบไดนามิก? หากวัตถุส่วนกลางนั้นถูกใช้ซ้ำสำหรับปลั๊กอินคุณจะได้รับสำเนาเพิ่มเติมหรือไม่ ประการที่สองจะเกิดอะไรขึ้นเมื่อวัตถุระดับโลกนั้นถูกส่งไปยังแอปพลิเคชันแบบขนาน มันปลอดภัยไหม?
โดยรวมแล้วฉันคิดว่าเหตุผลเหล่านั้นหมายความว่ากลมและเดี่ยวถูกใช้อย่างยอดเยี่ยมเท่านั้น
การพัฒนาระบบฝังตัวที่สำคัญมักเกี่ยวข้องกับการใช้ตัวแปรทั่วโลก
ขนาดสแต็กมีขนาดเล็กทุกอย่างได้รับการจัดสรรแบบคงที่ ( malloc()
เป็นสิ่งต้องห้าม) ตัวแปรทั่วโลกจะถูกซ่อนจากภายนอกไลบรารีที่เป็นของพวกเขา
ในฐานรหัส VB6 ที่น่ากลัวซึ่งใช้ในทางที่ไม่ดีเช่นไม่มีวันพรุ่งนี้ฉันมีความผิดในการแนะนำใหม่:
Global CsExt As New TheAppBeingRewrittenInCSharpWhileVb6CodeIsStillBeingMaintained
ฉันคิดว่ามันเป็นหนึ่งในกรณีการใช้งานที่ถูกต้องสำหรับวัตถุระดับโลก