การคิดค่าเสื่อมราคาถือว่าเป็นอันตรายหรือไม่? [ปิด]


27

ฉันเพิ่งรวบรวมรหัสของตัวเองบางอย่างกับ-std=c++0xธงใน GCC เนื่องจากฉันต้องการติดตามสิ่งที่คนหนุ่มสาวกำลังทำอยู่อย่างคลุมเครือ เกี่ยวกับauto_ptrการคัดค้าน แน่นอนฉันรู้ว่าauto_ptrเลิกใช้แล้วใน C ++ 0x แต่ ...

การเลิกใช้งานเป็นการเสียเวลาและความพยายามใช่ไหม สาเหตุของการไม่คิดค่าเสื่อมราคา (ด้วย auto_ptr เป็นตัวอย่าง):

  • มีมหาสมุทรที่เต็มไปด้วยรหัสซึ่งยังต้องได้รับการสนับสนุนการสร้างคำเตือนนับล้านจะดึงดูดผู้คนให้ปิดคำเตือนเท่านั้น

  • auto_ptr มันเป็นเรื่องเล็กน้อย แต่จริงๆแล้วมันทำในสิ่งที่มันพูดบนกระป๋อง

  • printf()ถ้าเราอยากจะเลิกใช้สิ่งที่ผมเสนอชื่อ แต่ลองจินตนาการถึงเสียงซัดทอดที่จะตามมา auto_ptrไม่มีเพื่อนมากเกินไป แต่อย่างน้อยในรหัส C ++ ของฉันมันถูกใช้มากกว่าprintfซึ่งไม่ได้ใช้เลย

  • คณะกรรมการมีประวัติไม่ดีในการได้รับสิทธินี้ - พวกเขาคัดค้านสแตติกที่ขอบเขตเนมสเปซและตอนนี้ดูเหมือนว่าจะไม่ได้รับการแก้ไข - ฉันจะไม่แปลกใจถ้าauto_ptrทำแบบเดียวกันกลับมา

  • สุดท้ายสิ่งที่คณะกรรมการกล่าวว่าผู้ดำเนินการคอมไพเลอร์ไม่สนใจพวกเขา - พวกเขาไม่สามารถเสี่ยงต่อการทำลายรหัสลูกค้าของพวกเขาสิ่งที่พวกเขาสามารถทำได้ก็คือการออกคำเตือนที่น่ารำคาญ

ดังนั้นคำถามของฉัน - คุณพิจารณาการคัดค้าน (ของอะไรไม่ใช่แค่ auto_ptrs และไม่ใช่แค่ใน C ++) เป็นความคิดที่ดีและถ้าเป็นเช่นนั้นทำไม


2
@TheLQ - ฉันอ่านมันเป็น "เหตุใดจึงคิดค่าเสื่อมราคาอะไร" แต่ใช้auto_ptrเป็นตัวอย่าง
ChrisF

4
มันบอกว่าบนกระป๋อง "จะทำลายหัวใจของคุณถ้าใช้ในภาชนะเกือบทุกชนิด"? ใช้งานunique_ptrและมีความสุขมากขึ้น
Kate Gregory

13
@ Neil - ภาษาของคุณอักเสบนิดหน่อยและ (เมื่อไตร่ตรอง) มันก็ดูคร่ำครวญมากกว่าคำถามที่จริงจัง หากคุณต้องการให้เปิดอยู่คุณอาจต้องการ "ลดเสียง"
ChrisF

4
@ Neil - ฉันซาบซึ้งที่คุณตั้งใจให้มันเป็นเรื่องตลก แต่อย่างที่ฉันบอกเมื่อเห็นว่ามันมี "ranty" มากกว่าที่ฉันคิดว่าคุณตั้งใจ
ChrisF

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

คำตอบ:


32

เหตุผลในการคัดค้าน (โดยทั่วไป):

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

ฉันไม่เห็นด้วยกับจุดสุดท้าย ผู้เรียบเรียงจะไม่เพิกเฉยต่อคณะกรรมการและในที่สุดพวกเขาก็นำสิ่งที่เลิกใช้แล้วออกไป (เช่น>?=และ<?=ใน GCC - พวกเขาเลิกใช้แล้วลบออก *)

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

(*) ใช่ฉันรู้ว่าพวกเขาเป็นส่วนขยายและไม่ได้มาตรฐาน แต่ประเด็นก็คือผู้ค้าคอมไพเลอร์จะลบสิ่งต่าง ๆ เมื่อพวกเขาเข้าสู่การคัดค้านไม่ว่ารหัสจะยังคงใช้พวกเขาอยู่หรือไม่


6
ขออภัยสำหรับ offtopic แต่ฉันไม่สามารถต้านทาน: สิ่งเหล่านั้น>?=และ<?=ผู้ประกอบการ?
brandizzi

7
ใน GCC เก่าคุณสามารถเขียนa >?= b;ซึ่งได้รับการจดชวเลขและเช่นเดียวกันสำหรับif (a > b) a = b; <?=
Peter Alexander

2
ฮึ ... ฉันเห็นว่าทำไมพวกเขาเพิ่ม แล้วทำไมพวกเขาลบมันออก การเลิกใช้งานอาจจำเป็นสำหรับฟีเจอร์ "เรียบร้อย" ที่จะเปิดเผยว่าปัญหาเหล่านี้เป็นปัญหาได้อย่างไรหลังจากถูกเผยแพร่สู่สาธารณะ
Phil

25

API ที่ซับซ้อนพอสมควรอาจมีข้อบกพร่องที่ไม่ได้ค้นพบจนกว่าจะถูกใช้มาระยะหนึ่ง ตัวเลือกของเรา:

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

การคัดค้านเป็นทางเลือกที่ดีที่สุด


12

Nah การเลิกใช้งานอาจเป็นสิ่งที่ดีจริงๆ มันทำให้เทคโนโลยีไม่ติดกับสัมภาระไร้ประโยชน์แบบเก่า

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

โดยทั่วไปแล้ว Apple มีนิสัยตั้งแต่ยุค 80 ของการทำเครื่องหมาย API เก่า ๆ ที่เป็น "เลิก" เป็นเวลา 5-7 ปีก่อนที่จะดึงมันออกมา ฉันเพิ่งพูดคุยกับวิศวกรของ Apple ที่ WWDC เกี่ยวกับการเลิกใช้ QuickTime C APIs โบราณและรู้สึกยินดีอย่างยิ่งที่ได้ยินว่าพวกเขาทำเช่นนั้นเพราะการสนับสนุนโมเดลที่พัฒนาอย่างต่อเนื่องในช่วงปี 1990 นั้นขัดขวางสิ่งที่คาดหวังว่าจะทำได้ ทำบน CPU แบบมัลติคอร์ 64 บิตที่ทันสมัย

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


11

หากเราต้องการคัดค้านสิ่งต่าง ๆ ฉันจะเสนอชื่อ printf ()

printfเป็นฟังก์ชั่นที่มีประโยชน์ จะช่วยให้การจัดรูปแบบสิ่งต่าง ๆ สั้นกว่า iostreams และมันก็เป็นฟังก์ชั่น C เหตุผล C ++ นั้นมีอยู่และถูกใช้เพราะมันเข้ากันได้กับ C ดังนั้นการเลิกใช้printfดูเหมือนว่ามีประโยชน์น้อยกว่า

ดังนั้นมีใครอื่นอีกที่ต่อต้านสงครามครูเสด?

คณะกรรมการตระหนักถึงปัญหาบางอย่างของความหมายในปัจจุบันที่ควรจะเป็นค่าเสื่อมราคา ดูความหมายของการเลิกใช้


5

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

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

และถ้านี่เป็นโปรแกรมเก่าที่คุณไม่ต้องการอัปเดตก็ไม่มีอะไรหยุดคุณจากการใช้ API เก่า (หรือในกรณีนี้คอมไพเลอร์)


1

การลดค่ามีความหมายอย่างน้อยสองอย่าง

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

ฉันคิดว่าคงตกอยู่ในประเภทหลัง แต่เวลาเท่านั้นที่จะบอกว่า auto_ptr จริง ๆ สมควรที่จะถูกลบหรือถ้ามันจะดีกว่าที่จะเก็บไว้ในภาษา


0

การเลิกใช้ไม่เป็นอันตรายหากการย้ายไปยังทางเลือกสามารถทำได้ใน 1 วันทำงาน: เช่น ค้นหา / แทนที่ฟังก์ชั่นเก่าด้วยฟังก์ชั่นใหม่อย่างง่ายหรือเลเยอร์ความเข้ากันได้นั้นติดตั้งได้ง่าย

หากคุณต้องการเขียนซ้ำส่วนใหญ่ของซอฟต์แวร์เนื่องจากการคัดค้านแสดงว่าเป็นอันตราย

ตัวอย่างที่ดีน่าจะเป็น mysql API ของ PHP โดยทั่วไปคุณเพียงแค่ต้องแทนที่ mysql_ * ทั้งหมดด้วย mysqli_ * และให้รหัสลิงก์แก่พวกเขาและเสร็จสิ้นแล้ว

ตัวอย่างที่ไม่ดีอย่างหนึ่งคือการคัดค้านและลบ glBegin, glEnd และการคำนวณเมทริกซ์ทั้งหมดจาก OpenGL หากคุณต้องการให้โค้ดของคุณทำงานบน OpenGL3 หรือสูงกว่าคุณจะต้องเขียนรหัสการเรนเดอร์ใหม่ทั้งหมดเพื่อใช้บัฟเฟอร์จุดสุดยอด


-1

ฉันคิดว่ามันเป็นวิธีที่ดีในการให้ผู้คนรู้ว่ามีวิธีที่ดีกว่า ฉันชอบการคัดค้านที่ดีมากกว่าฟังก์ชั่นที่หายไป

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