Tôi muốn đề cập đến hai điểm ở đây. Đầu tiên là các bài kiểm tra, câu hỏi thứ hai về hiệu suất.
1) thử nghiệm
Bạn nói rằng các xét nghiệm có thể làm được rất nhiều và rằng các xét nghiệm là cách duy nhất để chắc chắn rằng mã của bạn là chính xác. Nói chung tôi sẽ nói điều này là chính xác một cách tuyệt đối. Nhưng xét nghiệm tự nó chỉ giải quyết được một vấn đề.
Nếu bạn viết mô-đun, bạn có hai vấn đề hoặc cho phép nói hai khác nhau những người sử dụng mô-đun của bạn.
Bạn là nhà phát triển và người dùng sử dụng mô-đun của bạn. Xét nghiệm giúp với các đầu tiên mô-đun của bạn là chính xác và làm điều đúng, nhưng nó không giúp người dùng chỉ sử dụng mô-đun của bạn.
Để biết sau, tôi có một ví dụ. tôi đã viết một mô-đun bằng cách sử dụng Moose và một số nội dung khác, mã của tôi đã kết thúc luôn trong lỗi Phân đoạn. Sau đó, tôi bắt đầu gỡ lỗi mã của mình và tìm kiếm sự cố. Tôi dành khoảng 4 giờ để tìm lỗi.Cuối cùng, vấn đề là tôi có đã sử dụng Moose with the Array Trait. Tôi đã sử dụng chức năng "bản đồ" và tôi đã không cung cấp chức năng chương trình con, chỉ là một chuỗi hoặc một thứ khác.
Chắc chắn đây là lỗi tuyệt đối ngu ngốc của tôi, nhưng tôi dành một thời gian dài để gỡ lỗi. Cuối cùng chỉ là một kiểm tra đầu vào mà đối số là một subref sẽ chi phí cho nhà phát triển 10 giây của thời gian, và sẽ chi phí cho tôi và propably khác rất nhiều thời gian hơn.
Tôi cũng biết các ví dụ khác. Tôi đã viết một REST Client đến một giao diện hoàn toàn OOP với Moose. Cuối cùng, bạn luôn nhận được các đối tượng, bạn có thể thay đổi các thuộc tính nhưng chắc chắn nó không gọi API REST cho mọi thay đổi bạn đã làm. Thay vào đó bạn thay đổi giá trị của mình và cuối cùng, bạn gọi phương thức update() để chuyển dữ liệu và thay đổi giá trị.
Bây giờ tôi đã có một người dùng mà sau đó đã viết:
$obj->update({ foo => 'bar' })
Chắc chắn tôi đã nhận một lỗi trở lại, rằng bản cập nhật() không hoạt động. Nhưng chắc chắn nó không làm việc , bởi vì phương thức update() không chấp nhận một hashref. Chỉ đồng bộ hóa trạng thái thực tế của đối tượng với dịch vụ trực tuyến . Mã đúng sẽ là.
$obj->foo('bar');
$obj->update();
Điều đầu tiên hoạt động vì tôi chưa bao giờ kiểm tra đối số. Và tôi không ném một lỗi nếu ai đó đưa ra nhiều lý lẽ hơn tôi mong đợi. Phương pháp chỉ bắt đầu bình thường như thế nào.
sub update {
my ($self) = @_;
...
}
Chắc chắn tất cả các thử nghiệm của tôi hoàn toàn hoạt động tốt 100%. Nhưng xử lý các lỗi này cũng không phải là lỗi khiến tôi mất thời gian. Và nó chi phí người sử dụng propably rất nhiều của thời gian hơn.
Vì vậy, cuối cùng. Có, kiểm tra là cách chính xác duy nhất để đảm bảo rằng mã của bạn hoạt động chính xác. Nhưng điều đó không có nghĩa là việc kiểm tra kiểu là vô nghĩa. Kiểm tra loại có sẵn để giúp tất cả những người không phát triển (trên mô-đun của bạn) để sử dụng mô-đun của bạn một cách chính xác. Và tiết kiệm cho bạn và những người khác tìm kiếm các lỗi kết xuất .
2) Hiệu suất
Viết tắt: Bạn không quan tâm đến hiệu suất cho đến khi bạn quan tâm.
Điều đó có nghĩa là cho đến khi mô-đun của bạn hoạt động chậm, Hiệu suất luôn nhanh chóng đủ và bạn không cần phải quan tâm đến điều này. Nếu mô-đun của bạn thực sự hoạt động để làm chậm, bạn cần điều tra thêm. Nhưng đối với những điều tra này bạn nên sử dụng một hồ sơ như Devel :: NYTProf để xem những gì là chậm.
Và tôi sẽ nói. Trong sự chậm chạp 99% không phải vì bạn gõ kiểm tra, nó là thuật toán của bạn nhiều hơn. Bạn làm rất nhiều tính toán, gọi hàm thường xuyên vv Thường thì nó sẽ giúp nếu bạn hoàn thành các giải pháp khác sử dụng một thuật toán tốt hơn, làm bộ nhớ đệm hoặc cái gì khác, và hit hiệu suất không phải là loại kiểm tra của bạn. Nhưng ngay cả khi kiểm tra là hit hiệu suất . Sau đó, chỉ cần loại bỏ nó ở những nơi quan trọng.
Không có lý do gì để loại kiểm tra ở nơi hiệu suất không vấn đề. Bạn có nghĩ rằng việc kiểm tra kiểu không quan trọng trong một trường hợp như trên? Tôi đã viết một ứng dụng khách REST ở đâu? 99% các vấn đề về hiệu suất ở đây là số lượng yêu cầu chuyển đến dịch vụ web hoặc thời gian cho yêu cầu như vậy. Không sử dụng kiểm tra kiểu hoặc MooseX :: Tuyên bố vv sẽ có thể đẩy nhanh tăng tốc một cách tuyệt đối.
Và ngay cả khi bạn thấy bất lợi về hiệu suất. Đôi khi nó được chấp nhận. Bởi vì tốc độ không quan trọng hoặc đôi khi một cái gì đó mang đến cho bạn giá trị lớn hơn. DBIx :: Class là chậm hơn sau đó SQL tinh khiết với DBI, nhưng DBIx :: Class cung cấp cho bạn rất nhiều cho các.
+1 cho thông tin Moose – DVK