Có một số lý do tại sao tôi không thích tự động cho sử dụng chung:
- Bạn có thể cấu trúc lại mã mà không sửa đổi nó. Vâng, đây là một trong những điều thường được liệt kê là một lợi ích của việc sử dụng tự động. Chỉ cần thay đổi kiểu trả về của hàm và nếu tất cả các mã gọi nó sử dụng tự động, thì không cần nỗ lực thêm! Bạn nhấn biên dịch, nó xây dựng - 0 cảnh báo, 0 lỗi - và bạn chỉ cần tiếp tục và kiểm tra mã của mình mà không phải đối phó với sự lộn xộn khi xem qua và có khả năng sửa đổi 80 vị trí mà chức năng được sử dụng.
Nhưng chờ đã, đó có thực sự là một ý tưởng tốt? Điều gì xảy ra nếu loại quan trọng trong nửa tá các trường hợp sử dụng đó và bây giờ mã đó thực sự hoạt động khác nhau? Điều này cũng có thể phá vỡ đóng gói, bằng cách sửa đổi không chỉ các giá trị đầu vào, mà chính hành vi của việc thực hiện riêng tư của các lớp khác gọi hàm.
1a. Tôi là người tin tưởng vào khái niệm "mã tự ghi". Lý do đằng sau mã tự viết tài liệu là các bình luận có xu hướng trở nên lỗi thời, không còn phản ánh những gì mã đang làm, trong khi bản thân mã - nếu được viết theo cách rõ ràng - là tự giải thích, luôn cập nhật về ý định của nó, và sẽ không khiến bạn bối rối với những bình luận cũ. Nếu các loại có thể được thay đổi mà không cần phải sửa đổi chính mã, thì chính mã / biến có thể trở nên cũ. Ví dụ:
tự động bThreadOK = CheckThreadHealth ();
Ngoại trừ vấn đề là CheckThreadHealth () tại một số điểm đã được tái cấu trúc để trả về giá trị enum cho biết trạng thái lỗi, nếu có, thay vì bool. Nhưng người thực hiện thay đổi đó đã bỏ lỡ việc kiểm tra dòng mã đặc biệt này và trình biên dịch không giúp ích được gì vì nó được biên dịch mà không có cảnh báo hoặc lỗi.
- Bạn có thể không bao giờ biết các loại thực tế là gì. Điều này cũng thường được liệt kê như là một "lợi ích" chính của ô tô. Tại sao tìm hiểu những gì một chức năng đang cung cấp cho bạn, khi bạn chỉ có thể nói, "Ai quan tâm? Nó biên dịch!"
Nó thậm chí là loại công trình, có lẽ. Tôi nói là loại công việc, bởi vì mặc dù bạn đang tạo một bản sao cấu trúc 500 byte cho mỗi lần lặp, vì vậy bạn có thể kiểm tra một giá trị duy nhất trên đó, mã vẫn hoàn toàn hoạt động. Vì vậy, ngay cả các bài kiểm tra đơn vị của bạn cũng không giúp bạn nhận ra rằng mã xấu đang ẩn đằng sau chiếc ô tô trông đơn giản và ngây thơ đó. Hầu hết những người khác quét qua tệp sẽ không nhận thấy nó ngay từ cái nhìn đầu tiên.
Điều này cũng có thể trở nên tồi tệ hơn nếu bạn không biết loại đó là gì, nhưng bạn chọn một tên biến đưa ra một giả định sai về nó là gì, thực tế đạt được kết quả tương tự như trong 1a, nhưng ngay từ đầu thay vì hậu tái cấu trúc.
- Nhập mã khi ban đầu viết nó không phải là phần tốn thời gian nhất của lập trình. Có, tự động làm cho việc viết một số mã nhanh hơn ban đầu. Từ chối trách nhiệm, tôi gõ> 100 WPM, vì vậy có lẽ nó không làm phiền tôi nhiều như những người khác. Nhưng nếu tất cả những gì tôi phải làm là viết mã mới cả ngày, tôi sẽ là một người cắm trại hạnh phúc. Phần tốn thời gian nhất của lập trình là chẩn đoán các lỗi khó tái tạo, trường hợp biên trong mã, thường xuất phát từ các vấn đề không rõ ràng - chẳng hạn như việc lạm dụng tự động có thể được đưa ra (tham chiếu so với sao chép, đã ký so với không dấu, float so với int, bool vs. con trỏ, v.v.).
Đối với tôi có vẻ rõ ràng rằng auto được giới thiệu chủ yếu như một cách giải quyết cho cú pháp khủng khiếp với các kiểu mẫu thư viện chuẩn. Thay vì cố gắng sửa cú pháp mẫu mà mọi người đã quen thuộc - điều này cũng gần như không thể thực hiện được vì tất cả các mã hiện có mà nó có thể phá vỡ - hãy thêm vào một từ khóa về cơ bản che giấu vấn đề. Về cơ bản những gì bạn có thể gọi là "hack".
Tôi thực sự không có bất kỳ sự bất đồng nào với việc sử dụng tự động với các thùng chứa thư viện tiêu chuẩn. Đó rõ ràng là những gì từ khóa được tạo ra và các chức năng trong thư viện tiêu chuẩn không có khả năng thay đổi về cơ bản mục đích (hoặc loại cho vấn đề đó), làm cho tự động tương đối an toàn để sử dụng. Nhưng tôi sẽ rất thận trọng khi sử dụng nó với mã và giao diện của riêng bạn có thể biến động hơn nhiều và có thể chịu những thay đổi cơ bản hơn.
Một ứng dụng hữu ích khác của tự động giúp tăng cường khả năng của ngôn ngữ là tạo ra các thời gian trong các macro không xác định kiểu. Đây là điều bạn không thể thực sự làm trước đây, nhưng bạn có thể làm ngay bây giờ.
auto
thường có thể làm cho mọi thứ khó đọc hơn khi chúng khó đọc, nghĩa là các hàm quá dài, các biến được đặt tên kém, v.v.