คุณสมบัติ C ++ ของทั้งทีม?


16

ใน C ++ คุณสมบัติเช่นข้อยกเว้นส่งผลกระทบต่อโปรแกรมทั้งหมดของคุณ: คุณสามารถปิดการใช้งานพวกเขาในโปรแกรมทั้งหมดของคุณหรือคุณต้องจัดการกับพวกเขาตลอดรหัสของคุณ ในฐานะที่เป็นบทความที่มีชื่อเสียง ในรายงาน C ++ทำให้มัน:

ตอบโต้ส่วนที่ยากของข้อยกเว้นการเข้ารหัสไม่ใช่การขว้างและจับอย่างชัดเจน ส่วนที่ยากมากของการใช้ข้อยกเว้นคือการเขียนรหัสการแทรกแซงทั้งหมดในลักษณะที่ข้อยกเว้นโดยพลการสามารถแพร่กระจายจากไซต์ที่ส่งไปยังผู้จัดการของตนมาถึงอย่างปลอดภัยและไม่ทำให้ส่วนอื่น ๆ ของโปรแกรมเสียหายไปตลอดทาง

เนื่องจากแม้จะมีการnewยกเว้นข้อยกเว้นทุกฟังก์ชั่นจะต้องให้ความปลอดภัยข้อยกเว้นขั้นพื้นฐาน - ยกเว้นว่าจะเรียกเฉพาะฟังก์ชั่นที่รับประกันว่าจะไม่มีข้อยกเว้น - เว้นแต่คุณจะปิดการใช้งานข้อยกเว้นทั้งหมดในโครงการทั้งหมดของคุณจนกว่าคุณจะปิดการใช้งานข้อยกเว้นโดยสิ้นเชิงในโครงการทั้งหมดของคุณ

ดังนั้นข้อยกเว้นเป็นคุณลักษณะ "ทั้งโปรแกรม" หรือ "ทั้งทีม" เนื่องจากทุกคนในทีมต้องใช้ความเข้าใจ แต่ไม่ใช่ว่าคุณสมบัติ C ++ ทั้งหมดจะเป็นอย่างนั้นเท่าที่ฉันรู้

ตัวอย่างที่เป็นไปได้คือถ้าฉันไม่ได้รับเท็มเพลต แต่ฉันไม่ได้ใช้มันฉันจะยังสามารถเขียน C ++ ที่ถูกต้องได้หรือไม่? ฉันสามารถโทรsortหาอาเรย์ของจำนวนเต็มและเพลิดเพลินไปกับความได้เปรียบความเร็วที่น่าทึ่งของมัน C qsort(เพราะไม่มีตัวชี้ฟังก์ชั่นถูกเรียก) โดยไม่เสี่ยงต่อข้อบกพร่อง - หรือไม่? ดูเหมือนว่าเทมเพลตไม่ใช่ "ทั้งทีม"

มีฟีเจอร์ C ++ อื่น ๆ ที่ส่งผลกระทบต่อรหัสที่ไม่ได้ใช้งานโดยตรงและเป็น "ทั้งทีม" หรือไม่? ฉันสนใจคุณสมบัติพิเศษที่ไม่มีใน C.

ปรับปรุง : ฉันโดยเฉพาะอย่างยิ่งการหาคุณสมบัติที่ไม่มีป้ายภาษาบังคับใช้คุณจะต้องรู้ของพวกเขา คำตอบแรกที่ฉันได้กล่าวถึงความถูกต้อง const ซึ่งเป็นทั้งทีมดังนั้นทุกคนต้องเรียนรู้เกี่ยวกับมัน อย่างไรก็ตาม AFAICS จะส่งผลกระทบต่อคุณเฉพาะเมื่อคุณเรียกใช้ฟังก์ชันที่มีการทำเครื่องหมายconstและคอมไพเลอร์จะป้องกันไม่ให้คุณเรียกใช้บนวัตถุที่ไม่ใช่ const ดังนั้นคุณจะได้รับสิ่งที่เป็น google ด้วยข้อยกเว้นคุณจะไม่ได้รับสิ่งนั้น ยิ่งกว่านั้นพวกมันจะถูกใช้งานทันทีที่คุณใช้newดังนั้นข้อยกเว้นจึงเป็น "ร้ายกาจ" มากกว่า แต่เนื่องจากฉันไม่สามารถพูดสิ่งนี้ได้อย่างเป็นกลาง แต่ฉันจะขอบคุณคุณลักษณะทั้งหมดของทีม

อัปเดต 2 : แทนที่จะใช้คุณสมบัติ C ++ ฉันควรเขียนบางอย่างเช่น "C ++ - คุณสมบัติเฉพาะ" เพื่อแยกสิ่งต่าง ๆ เช่นมัลติเธรดซึ่งใช้กับภาษาการเขียนโปรแกรมหลักจำนวนมาก

ภาคผนวก: ทำไมคำถามนี้มีวัตถุประสงค์ (ถ้าคุณสงสัย)

C ++ เป็นภาษาที่ซับซ้อนโครงการหรือคู่มือการเข้ารหัสจำนวนมากพยายามเลือกคุณสมบัติ C ++ แบบ "ง่าย" และหลาย ๆ คนพยายามที่จะรวมหรือยกเว้นบางอย่างตามเกณฑ์อัตนัยส่วนใหญ่ คำถามเกี่ยวกับการปิดอย่างถูกต้องเป็นประจำที่นี่ใน SO

ข้างต้นแทนฉันกำหนด (อย่างแม่นยำที่สุดเท่าที่จะเป็นไปได้) ว่าคุณลักษณะของภาษา "ทั้งทีม" คืออะไรให้ตัวอย่าง (ข้อยกเว้น) พร้อมหลักฐานสนับสนุนมากมายในวรรณคดีเกี่ยวกับ C ++ และขอคุณลักษณะทั้งทีมใน C ++ เกินข้อยกเว้น

ไม่ว่าคุณควรใช้คุณสมบัติ "ทั้งทีม" หรือว่าเป็นแนวคิดที่เกี่ยวข้องหรือไม่ก็ตาม แต่นั่นก็หมายความว่าความสำคัญของคำถามนี้เป็นเรื่องส่วนตัวเช่นเคย

คำตอบ:


11

ฉันจะเสนอชื่อพร้อมกันเป็นคุณลักษณะ 'ทั้งทีม'

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


ฉันยอมรับว่าเธรดเป็นคุณลักษณะที่มีทั้งทีมแม้ว่าจะไม่ใช่ C ++ ก็ตาม อย่างไรก็ตามยังมีอินเทอร์เฟซอื่น ๆ สำหรับการทำงานพร้อมกัน (ไม่ใช่แบบเธรด) ส่วนใหญ่ในภาษาอื่น ๆ และสองสามคนอนุญาตให้การทำงานพร้อมกันจะดียิ่งขึ้น encapsulated (แม้ว่านี่ยังคงเป็นหัวข้อการวิจัยในปัจจุบันในภาษาโปรแกรม) ดังนั้นจึงเป็นคำถามที่เปิดกว้างว่าจะใช้กับการเห็นพ้องด้วยต่อกันหรือไม่
Blaisorblade

@Blaisorblade - C ++ 11 นำเสนอเป็นไลบรารีเธรดของตัวเองดังนั้นใช่มันเป็นส่วนหนึ่งของ C ++ ตอนนี้
Michael Kohne

@MichaelKohne: ฉันไม่ได้อ้างว่า C ++ ไม่รองรับมัลติเธรด ฉันบอกว่ากระทู้ไม่ใช่ภาษาซีพลัสพลัสเพราะภาษาอื่น ๆ มีพวกเขาอยู่ ฉันเพิ่งสังเกตว่าปัญหาที่อธิบายไว้ใช้กับเธรดเป็นส่วนต่อประสานกับการทำงานพร้อมกัน
Blaisorblade

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

มันทำให้ฉันนึกถึงการสื่อสารผิดพลาดกับเพื่อนร่วมงานที่เกิดขึ้นเมื่อหลายปีก่อน เพื่อนร่วมงานถามเพื่อนร่วมงานคนอื่น: นี่เป็นฟังก์ชั่นที่ปลอดภัยไหม? เพื่อนร่วมงานคนอื่นตอบว่าใช่ เพื่อนร่วมงานที่ถามต่อจากนั้นก็ใช้มันจากหลาย ๆ เธรดและได้ผลลัพธ์ที่ไม่คาดคิด (มันไม่ได้ผิดพลาด แต่มีการใช้งานหลายอย่างในวัตถุเดียวกัน) ปรากฎว่าเพื่อนร่วมงานที่ถามไม่ได้มีรูปแบบจิตของสิ่งที่ "ด้ายปลอดภัย" หมายถึงและเข้าใจผิดคำตอบว่า "ฉันสามารถทำสิ่งที่ฉันต้องการ"

10

คำตอบที่ชัดเจนคือconstความถูกต้อง: เนื่องจากconst/ volatileคุณสมบัติมีการติดเชื้อเมื่อส่วนหนึ่งของรหัสเริ่มใช้มันทุกรหัส (โดยตรงหรือโดยอ้อม) รหัสการโทรจะต้องconstถูกต้องหรือทิ้งเนสconstอย่างชัดเจน

เช่นเดียวกับข้อยกเว้น แต่นี้จะเห็นได้ชัดในที่สุดสิ่งที่ดี ยิ่งไปกว่านั้นเนื่องจากไม่เหมือนกับข้อยกเว้นด้านความปลอดภัยจึงได้รับการยืนยันอย่างเข้มงวดโดยคอมไพเลอร์


2
ยิ่งไปกว่านั้น - constความถูกต้องโปร่งใส: มันเกี่ยวกับประเภทที่คุณมอบให้กับฟังก์ชั่น (ซึ่งมองเห็นได้เสมอ) และคอมไพเลอร์จะตะโกนใส่คุณถ้าคุณทำผิด ฉันคิดเกี่ยวกับสิ่งที่ขุ่นมัวมากขึ้นซึ่งคุณไม่รู้ว่ามีอะไรผิดปกติจนกระทั่งสายเกินไป (และถึงอย่างนั้นมันก็ยากที่จะคิดออก) แต่คำตอบของคุณน่าสนใจอยู่ดี
Blaisorblade

10

ตัวชี้

  • ตัวชี้ชี้ไปที่หน่วยความจำบนสแต็กหรือไม่?
  • ตัวชี้ชี้ไปที่หน่วยความจำบนฮีปหรือไม่
  • ตัวชี้ชี้ไปที่วัตถุเดียวหรือไม่?
  • ตัวชี้ชี้ไปที่อาร์เรย์หรือไม่?
  • ตัวชี้ชี้ไปยังตำแหน่งที่อยู่ตรงกลางของอาร์เรย์หรือไม่?
  • ตัวชี้ถูกต้องหรือไม่
  • พอยเตอร์อยู่ในรูป mangled หรือไม่?
  • รหัสอะไร "เจ้าของ" ตัวชี้?
  • ควรยกเลิกการจัดสรรวัตถุที่อ้างอิงด้วยตนเองหรือไม่ ถ้าเป็นเช่นนั้นได้อย่างไร

1
+1 โดยเฉพาะเนื่องจากคำถามเกี่ยวกับการเป็นเจ้าของตัวชี้ หากไม่มีพอยน์เตอร์อัจฉริยะการเป็นเจ้าของจะเผยแพร่ไปทั่วทั้งทีม
JKor

3

ความเป็นไปได้อีกอย่างก็คือ ครั้งหนึ่งเคยเป็นส่วนหนึ่งของ codebase เริ่มจรจัดกับผู้ประกอบการมากเกินไปทุกคนมีแนวโน้มที่จะเริ่มต้นที่สองคาดเดาวัตถุเพียงว่าสิ่งใดก็ตามที่พวกเขากำลังทำงานกับเป็นจริงทำ มันไม่ได้เผยแพร่ผ่าน codebase อย่างชัดเจนถึงวิธีการยกเว้นและความถูกต้องของ const แต่ก็เป็นสิ่งที่สามารถเริ่มก่อให้เกิดปัญหาได้หากทั้งทีมไม่ได้อยู่ในหน้าเดียวกันเกี่ยวกับเวลาวิธีการและสาเหตุที่ใช้งาน


1

สิ่งเดียวที่นอกเหนือจากความถูกต้องของ const (ดังที่ปรากฏด้านบน) ที่อยู่ในใจคือสถานะของกระแส หากคุณเขียนรหัส C ++ ที่คุณใช้ออบเจ็กต์และ subobjects และลำดับชั้นวัตถุที่เป็นไปได้ในที่สุดคุณจะต้องการส่งหรือรับข้อมูลไปยัง / จากผู้ดำเนินการของโปรแกรม คุณสามารถเขียนการดำเนินการสตรีมแบบง่าย ๆ ที่จะรวบรวมและจะถูกต้องตามความหมาย ...

std::ostream& operator<< (std::ostream&, MyClass const&) {...}
std::istream& operator>> (std::istream&, MyClass&) {...}

... แต่เมื่อคุณทำคุณจะไม่รับประกันว่าสิ่งที่คุณพยายามจะเขียน (หรือที่สำคัญที่สุดคืออ่าน) ตามรูปแบบเดียวกับที่ลูกค้ากำลังส่งคุณ มีกรณีแปลก ๆ มากมายที่เกิดขึ้นกับสตรีมยิ่งแย่ไปกว่านั้นถ้าคุณต้องผ่านสตรีมหรือแฟล็กสตรีมเป็นข้อโต้แย้งในห่วงโซ่การเรียกฟังก์ชั่นของคุณ…ซึ่งเป็นสิ่งที่สตรีมของชั้นเรียนมักใช้ ดังนั้นการสตรีมสามารถกำหนดเป็น "ร้ายกาจ" ตามที่คุณใช้คำดังกล่าวข้างต้นหรืออาจจะเป็น "ไวรัส" ( แม้ว่าจะไม่ได้ทุกที่ในระดับเดียวกับความถูกต้อง const - )

มีสมาชิกในลำดับชั้นของคลาสที่ลึกลงไปstring? แปลกใจที่ลูกค้าส่งคำเดียวดีกว่า มีตัวเลขที่คุณต้องการทำให้เป็นอันดับหรือไม่ คุณควรตรวจสอบบันทึกและเรียกคืนสถานะการสตรีมในทุกความลึกของการเรียกใช้ฟังก์ชั่นเพราะคุณไม่เคยรู้เลยว่าใครเป็นคนงี่เง่าที่เพิ่งตั้งค่าสตรีมของเขาเป็นเอาต์พุตแปดด้านก่อนเรียกใช้ฟังก์ชันของคุณ หรือแย่กว่านั้น - ผู้ที่เรียกสิ่งที่ชอบsetfillและsetwทำให้การจัดรูปแบบอินพุต / เอาท์พุตของสมาชิกแรกและเฉพาะสมาชิกอินทิกรัลของคุณเพราะรัฐเหล่านั้นไม่เผยแพร่ไม่ได้เผยแพร่โอ้และอย่าถามเกี่ยวกับสายน้ำและความเป็นสากล

มีคำเตือนไม่ว่ากรณีใด ๆ ในภาษาที่คุณเป็นสตรีทางขวาหรือทางที่ผิดหรือแม้กระทั่งสตรีมมิ่งเป็นที่ทั้งหมด ถามรหัสลูกค้าเพื่อให้สตรีมผ่านไปยังเขียนสำรองข้อมูลหรือไม่ คุณไม่มีทางรู้ว่ากระแสนั้นชี้ไปที่/dev/nullใด ( ในทางกลับกันคุณสามารถเรียกร้องความเร็วการสำรองข้อมูลและอัตราการบีบอัดได้อย่างไม่น่าเชื่อ! )

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.