มีสาเหตุหลายประการที่ฉันไม่ชอบรถยนต์สำหรับการใช้งานทั่วไป:
- คุณสามารถ refactor code โดยไม่ต้องแก้ไขมัน ใช่นี่คือสิ่งหนึ่งที่มักระบุว่าเป็นประโยชน์ของการใช้งานอัตโนมัติ เพียงแค่เปลี่ยนประเภทการคืนของฟังก์ชั่นและหากรหัสทั้งหมดที่เรียกมันว่าใช้อัตโนมัติไม่ต้องใช้ความพยายามเพิ่มเติม! คุณกดคอมไพล์มันสร้าง - 0 คำเตือน, 0 ข้อผิดพลาด - และคุณเพียงแค่ไปข้างหน้าและตรวจสอบรหัสของคุณโดยไม่ต้องจัดการกับความยุ่งเหยิงของการมองผ่านและอาจแก้ไข 80 สถานที่ใช้ฟังก์ชั่น
แต่เดี๋ยวก่อนนี่เป็นความคิดที่ดีจริงๆเหรอ? จะเป็นอย่างไรถ้าประเภทมีความสำคัญในครึ่งโหลของกรณีใช้งานและตอนนี้รหัสนั้นมีพฤติกรรมแตกต่างกันอย่างไร สิ่งนี้ยังสามารถทำลาย encapsulation โดยปริยายโดยการปรับเปลี่ยนไม่เพียง แต่ค่าอินพุต แต่พฤติกรรมของการใช้งานส่วนตัวของคลาสอื่น ๆ ที่เรียกใช้ฟังก์ชัน
1a ฉันเชื่อในแนวคิดของ "รหัสเอกสารด้วยตนเอง" เหตุผลที่อยู่เบื้องหลังรหัสการจัดทำเอกสารด้วยตนเองคือความคิดเห็นมีแนวโน้มที่จะล้าสมัยไม่สะท้อนสิ่งที่รหัสกำลังทำอยู่ในขณะที่รหัสตัวเอง - ถ้าเขียนในลักษณะที่ชัดเจน - อธิบายตนเองอยู่เสมอถึงวันที่ เกี่ยวกับความตั้งใจของมันและจะไม่ทำให้คุณสับสนกับความคิดเห็นค้าง หากประเภทสามารถเปลี่ยนแปลงได้โดยไม่จำเป็นต้องแก้ไขโค้ดเองดังนั้นรหัส / ตัวแปรนั้นสามารถค้างได้ ตัวอย่างเช่น:
auto bThreadOK = CheckThreadHealth ();
ยกเว้นปัญหาคือ CheckThreadHealth () ในบางจุดได้รับการ refactored เพื่อส่งคืนค่า enum ที่ระบุสถานะข้อผิดพลาดถ้ามีแทนที่จะเป็นบูล แต่คนที่ทำการเปลี่ยนแปลงนั้นพลาดการตรวจสอบบรรทัดของรหัสนี้โดยเฉพาะและคอมไพเลอร์ก็ไม่ช่วยเพราะมันถูกคอมไพล์โดยไม่มีคำเตือนหรือข้อผิดพลาด
- คุณอาจไม่เคยรู้ว่าประเภทจริงคืออะไร นี่มักจะถูกระบุว่าเป็น "ประโยชน์" หลักของรถยนต์ ทำไมเรียนรู้ว่าฟังก์ชั่นนี้ให้อะไรคุณเมื่อคุณสามารถพูดว่า "ใครสนใจ?
มันอาจจะเป็นผลงานก็ได้ ฉันว่างานประเภทเพราะแม้ว่าคุณจะทำสำเนาของโครงสร้าง 500 ไบต์สำหรับการวนซ้ำทุกครั้งเพื่อให้คุณสามารถตรวจสอบค่าเดียวในนั้นรหัสยังทำงานได้อย่างสมบูรณ์ ดังนั้นแม้แต่การทดสอบหน่วยของคุณก็ไม่ได้ช่วยให้คุณรู้ว่ารหัสที่ไม่ดีนั้นซ่อนอยู่ข้างหลังรถยนต์ที่ดูเรียบง่ายและไร้เดียงสา คนอื่น ๆ ส่วนใหญ่สแกนผ่านไฟล์จะไม่สังเกตเห็นเมื่อมองผ่านครั้งแรก
สิ่งนี้สามารถทำให้แย่ลงได้ถ้าคุณไม่รู้ว่าประเภทคืออะไร แต่คุณเลือกชื่อตัวแปรที่ทำให้เกิดข้อสันนิษฐานที่ผิดเกี่ยวกับสิ่งที่มันเกิดขึ้นเพื่อให้ได้ผลลัพธ์เช่นเดียวกับใน 1a แต่จากจุดเริ่มต้นมากกว่า โพสต์ refactor
- การพิมพ์รหัสเมื่อเริ่มต้นการเขียนไม่ใช่ส่วนที่เสียเวลามากที่สุดในการเขียนโปรแกรม ใช่อัตโนมัติทำให้การเขียนโค้ดเร็วขึ้นในตอนแรก ตามข้อจำกัดความรับผิดชอบฉันพิมพ์> 100 WPM ดังนั้นอาจไม่รบกวนฉันมากเท่ากับคนอื่น ๆ แต่ถ้าสิ่งที่ฉันต้องทำคือเขียนโค้ดใหม่ทุกวันฉันจะเป็นผู้ไปพักแรมที่มีความสุข ส่วนที่ใช้เวลาส่วนใหญ่ในการเขียนโปรแกรมคือการวินิจฉัยข้อผิดพลาดที่เกิดซ้ำขอบโค้ดในโค้ดซึ่งมักเกิดจากปัญหาที่ไม่ชัดเจนที่เห็นได้ชัดเช่นการใช้งานรถยนต์มากเกินไป (อ้างอิงกับสำเนา) เซ็นชื่อกับไม่ได้ลงนามลอยเทียบกับ int บูลกับตัวชี้ ฯลฯ )
ดูเหมือนว่าสำหรับฉันแล้ว auto ถูกนำมาใช้เป็นหลักในการแก้ปัญหาสำหรับไวยากรณ์แย่มากกับประเภทแม่แบบไลบรารีมาตรฐาน แทนที่จะพยายามแก้ไขไวยากรณ์ของเทมเพลตที่ผู้คนคุ้นเคยอยู่แล้วซึ่งอาจเป็นไปไม่ได้เลยที่จะทำเพราะรหัสที่มีอยู่ทั้งหมดสามารถทำลายได้ - เพิ่มคำหลักที่ซ่อนปัญหาไว้ โดยพื้นฐานแล้วสิ่งที่คุณอาจเรียกว่า "แฮ็ค"
จริง ๆ แล้วฉันไม่เห็นด้วยกับการใช้รถยนต์กับคอนเทนเนอร์ไลบรารีมาตรฐาน เห็นได้ชัดว่าคำหลักนั้นถูกสร้างขึ้นมาเพื่ออะไรและฟังก์ชั่นในไลบรารีมาตรฐานนั้นไม่น่าจะมีจุดประสงค์เพื่อเปลี่ยนแปลง (หรือพิมพ์ในเรื่องนั้น) ซึ่งจะทำให้รถยนต์ค่อนข้างปลอดภัยในการใช้งาน แต่ฉันจะต้องระมัดระวังอย่างมากเกี่ยวกับการใช้มันกับรหัสและอินเทอร์เฟซของคุณเองซึ่งอาจมีความผันผวนมากกว่าและอาจมีการเปลี่ยนแปลงขั้นพื้นฐานมากขึ้น
แอปพลิเคชันที่มีประโยชน์อีกตัวหนึ่งของรถยนต์ที่ช่วยเพิ่มความสามารถของภาษาคือการสร้างเทมเพลทในมาโครแบบผู้ไม่เชื่อเรื่องพระเจ้า นี่คือสิ่งที่คุณไม่เคยทำมาก่อน แต่คุณสามารถทำได้ตอนนี้
auto
มักจะทำให้สิ่งที่ยากต่อการอ่านเมื่ออ่านยากแล้วคือฟังก์ชั่นยาวเกินไปตัวแปรที่มีชื่อไม่ดี ฯลฯ ในฟังก์ชั่นสั้น ๆ ที่มีตัวแปรที่ตั้งชื่ออย่างเหมาะสมการรู้ประเภทควรเป็นหนึ่งใน # 1 ง่ายหรือ # 2 ไม่เกี่ยวข้อง