คำถามติดแท็ก globals

17
ทำไมรัฐโลกถึงชั่วร้าย?
ก่อนที่เราจะเริ่มสิ่งนี้ให้ฉันบอกว่าฉันตระหนักดีถึงแนวคิดของ Abstraction และ Dependency Injection ฉันไม่ต้องการตาที่เปิดอยู่ที่นี่ พวกเราส่วนใหญ่พูดกันหลายครั้งโดยไม่เข้าใจว่า "อย่าใช้ตัวแปรทั่วโลก" หรือ "ซิงเกิลตันนั้นชั่วร้ายเพราะเป็นโลก" แต่จริงๆสิ่งที่เป็นเลวร้ายเกี่ยวกับสถานะทั่วโลกเป็นลางไม่ดี? สมมติว่าฉันต้องการการกำหนดค่าทั่วโลกสำหรับแอปพลิเคชันของฉันเช่นเส้นทางของโฟลเดอร์ระบบหรือหนังสือรับรองฐานข้อมูลทั่วทั้งแอปพลิเคชัน ในกรณีนี้ฉันไม่เห็นวิธีแก้ปัญหาที่ดีนอกจากการจัดเตรียมการตั้งค่าเหล่านี้ในพื้นที่ส่วนกลางบางประเภทซึ่งโดยทั่วไปจะพร้อมใช้งานสำหรับแอปพลิเคชันทั้งหมด ฉันรู้ว่ามันไม่ดีที่จะละเมิดมัน แต่เป็นพื้นที่ทั่วโลกจริงๆที่ชั่ว? และถ้าเป็นเช่นนั้นมีทางเลือกอะไรที่ดีบ้าง?

22
globals ต่างจากฐานข้อมูลอย่างไร?
ฉันเพิ่งเจอคำถามเก่า ๆ ที่ถามว่าอะไรคือความชั่วร้ายเกี่ยวกับสถานะโลกและคำตอบที่ได้รับการยอมรับอันดับต้น ๆ ยืนยันว่าคุณไม่สามารถเชื่อถือรหัสใด ๆ ที่ทำงานกับตัวแปรทั่วโลกได้เพราะบางรหัสอื่นอาจมารวมกัน ค่าแล้วคุณไม่ทราบว่าพฤติกรรมของรหัสของคุณจะเป็นเพราะข้อมูลที่แตกต่างกัน! แต่เมื่อฉันดูที่ฉันไม่สามารถช่วย แต่คิดว่านั่นเป็นคำอธิบายที่อ่อนแอจริงๆเพราะวิธีการที่แตกต่างจากการทำงานกับข้อมูลที่เก็บไว้ในฐานข้อมูล? เมื่อโปรแกรมของคุณทำงานกับข้อมูลจากฐานข้อมูลคุณไม่สนใจว่ารหัสอื่นในระบบของคุณจะเปลี่ยนมันหรือแม้ว่าโปรแกรมที่แตกต่างกันอย่างสิ้นเชิงจะเปลี่ยนมันสำหรับเรื่องนั้น คุณไม่สนใจว่าข้อมูลคืออะไร; นั่นคือจุดทั้งหมด สิ่งที่สำคัญคือรหัสของคุณเกี่ยวข้องกับข้อมูลที่ถูกต้อง (เห็นได้ชัดว่าฉันกำลังคัดสรรปัญหาแคชที่นี่บ่อยครั้ง แต่ก็ไม่สนใจเลยสักครู่) แต่ถ้าข้อมูลที่คุณทำงานมาจากแหล่งภายนอกที่รหัสของคุณไม่สามารถควบคุมได้เช่นฐานข้อมูล (หรือผู้ใช้อินพุตหรือซ็อกเก็ตเครือข่ายหรือไฟล์ ฯลฯ ... ) และไม่มีอะไรผิดปกติ ถ้าอย่างนั้นข้อมูลทั่วโลกภายในโค้ดนั้น - ซึ่งโปรแกรมของคุณมีการควบคุมในระดับที่ดีกว่ามาก - สิ่งที่ไม่ดีเมื่อเห็นได้ชัดว่าเลวร้ายน้อยกว่าสิ่งปกติอย่างสมบูรณ์แบบที่ไม่มีใครเห็นว่าเป็นปัญหา
250 state  globals 

10
มีชื่อสำหรับรูปแบบ (ต่อต้าน -) ของพารามิเตอร์การส่งผ่านที่จะใช้หลายระดับลึกในสายการโทรหรือไม่
ฉันพยายามหาทางเลือกในการใช้ตัวแปรทั่วโลกในรหัสดั้งเดิม แต่คำถามนี้ไม่เกี่ยวกับทางเลือกทางเทคนิคผมส่วนใหญ่กังวลเกี่ยวกับคำศัพท์ ทางออกที่ชัดเจนคือการส่งผ่านพารามิเตอร์เข้าสู่ฟังก์ชั่นแทนที่จะใช้โกลบอล ใน codebase ดั้งเดิมนี้หมายความว่าฉันต้องเปลี่ยนฟังก์ชั่นทั้งหมดในสายโซ่ยาวระหว่างจุดที่จะใช้ค่าในที่สุดและฟังก์ชั่นที่ได้รับพารามิเตอร์ก่อน higherlevel(newParam)->level1(newParam)->level2(newParam)->level3(newParam) newParamก่อนหน้านี้ซึ่งเคยเป็นตัวแปรทั่วโลกในตัวอย่างของฉัน แต่มันอาจเป็นค่าฮาร์ดโค้ดที่ก่อนหน้านี้แทน ประเด็นก็คือว่าตอนนี้ค่าของ newParam จะได้รับที่higherlevel()และมีการ "เดินทาง" level3()ทุกวิธีการ ฉันสงสัยว่ามีชื่อ (s)สำหรับสถานการณ์ / รูปแบบเช่นนี้ซึ่งคุณต้องเพิ่มพารามิเตอร์ในฟังก์ชั่นมากมายที่เพียงแค่ "ส่ง" ค่าที่ไม่เปลี่ยนแปลง หวังว่าการใช้คำศัพท์ที่เหมาะสมจะช่วยให้ฉันค้นหาทรัพยากรเพิ่มเติมเกี่ยวกับโซลูชันสำหรับการออกแบบใหม่และอธิบายสถานการณ์นี้ให้เพื่อนร่วมงานทราบ

15
รหัสสะอาด: ฟังก์ชั่นที่มีพารามิเตอร์น้อย [ปิด]
ฉันอ่านบทแรกของรหัสสะอาดโดยโรเบิร์ตซีมาร์ตินและดูเหมือนว่าฉันจะค่อนข้างดี แต่ฉันมีข้อสงสัยในส่วนหนึ่งมันก็บอกว่ามันเป็นสิ่งที่ดี (ทางปัญญา) ว่าฟังก์ชั่นควรมีพารามิเตอร์น้อย เท่าที่เป็นไปได้มันยังแสดงให้เห็นว่าพารามิเตอร์ 3 ตัวหรือมากกว่านั้นมากเกินไปสำหรับฟังก์ชั่น (ซึ่งฉันคิดว่ามันพูดเกินจริงและอุดมการณ์) ดังนั้นฉันจึงเริ่มสงสัย ... ทั้งแนวปฏิบัติในการใช้ตัวแปรส่วนกลางและการส่งผ่านข้อโต้แย้งจำนวนมากในฟังก์ชั่นอาจเป็นวิธีปฏิบัติในการเขียนโปรแกรมที่ไม่ดี แต่การใช้ตัวแปรทั่วโลกสามารถลดจำนวนพารามิเตอร์ในฟังก์ชันได้อย่างมาก ... ดังนั้นฉันอยากได้ยินสิ่งที่คุณคิดเกี่ยวกับมันมันมีค่าใช้ตัวแปรทั่วโลกเพื่อลดจำนวนพารามิเตอร์ของฟังก์ชั่นหรือไม่? ในกรณีใดบ้าง สิ่งที่ฉันคิดคือมันขึ้นอยู่กับปัจจัยหลายประการ: ขนาดรหัสต้นฉบับ จำนวนพารามิเตอร์โดยเฉลี่ยของฟังก์ชั่น จำนวนฟังก์ชั่น ความถี่ที่ใช้ตัวแปรเดียวกัน ในความคิดของฉันถ้าขนาดซอร์สโค้ดมีขนาดค่อนข้างเล็ก (เช่นน้อยกว่า 600 บรรทัดของโค้ด) มีฟังก์ชั่นมากมายตัวแปรเดียวกันถูกส่งผ่านเป็นพารามิเตอร์และฟังก์ชั่นมีพารามิเตอร์มากมายจากนั้นใช้ตัวแปรทั่วโลกจะคุ้มค่า แต่ฉัน อยากรู้ว่า ... คุณแบ่งปันความคิดเห็นของฉัน? คุณคิดอย่างไรกับกรณีอื่นที่ซอร์สโค้ดใหญ่กว่า ฯลฯ ? ปล . ฉันเห็นโพสต์นี้ชื่อเรื่องนั้นคล้ายกันมาก แต่เขาไม่ถามสิ่งที่ฉันอยากรู้

2
วิธี Parametrize เทียบกับตัวแปรทั่วโลก
ฉันมีคำถามง่าย ๆ ที่หลอกหลอนฉันซักพักเมื่อรหัสของฉันเริ่มขึ้น พารามิเตอร์ควรถูกแทนที่ด้วยตัวแปรโกลบอลเมื่อพวกเขาผ่านเส้นทางยาวของการเรียกฟังก์ชันที่ซ้อนกัน? ฉันเข้าใจว่าสภาพแวดล้อมทั่วโลกสามารถทำให้สถานะของโปรแกรมไม่สามารถคาดเดาได้เพราะฟังก์ชั่นหลายอย่างสามารถปรับเปลี่ยนตัวแปรที่แชร์ได้ แต่ถึงกระนั้นโลกก็ยังทำให้สิ่งต่าง ๆ ง่ายขึ้น ให้ฉันอธิบายตัวเอง: functionA(){ x = something functionB(x) } functionB(x){ functionC(x) } functionC(x){ finallyDoSomethingWithX(x) } finallyDoSomethingWithX(x){ x += 1 //Very dummy example ignoring pass by value, not reference. } แทนที่โดย: globalX; functionA(){ globalX = something functionB() } ... ... ... finallyDoSomethingWithX(){ globalX += 1 …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.