Tôi tìm thấy bài đăng này để tìm kiếm các thành ngữ C ++ phổ biến, vì tôi đã tìm hiểu khá sâu về nó gần đây và muốn mã của tôi trông không nghiệp dư như tôi cảm thấy đó là ... :-P
Đã dành khá nhiều thời gian với Perl, tôi đã tìm thấy các thành ngữ trong ngôn ngữ đó rất giống với các ngôn ngữ tự nhiên, như tiếng Anh hoặc tiếng Tây Ban Nha (chỉ có hai tôi biết đủ để biết một số thành ngữ).
Tôi không đồng ý rằng một thành ngữ giống như một "mẫu thiết kế nhỏ". Tôi vẫn không đồng ý, mặc dù ít hơn, rằng một thành ngữ là một cách để khắc phục sự thiếu hụt trong ngôn ngữ.
Có lẽ câu trả lời của Luc Danton là gần nhất, nhưng hãy để tôi giải thích. Tôi nghĩ rằng một thành ngữ là, tốt, thành ngữ của những người sử dụng ngôn ngữ. Thông thường, một biểu thức hoặc chuỗi biểu thức phổ biến, trong khi có lẽ không rõ ràng, thực hiện một thao tác hoặc thể hiện ý định theo cách có ý nghĩa với những người đủ thông thạo để nhìn thấy nó trước đó.
Quay lại với Perl, có lẽ thành ngữ nổi tiếng nhất là " Biến đổi Schwartzian ", một biểu thức thực hiện sắp xếp dữ liệu theo cách gọn nhẹ và hiệu quả. Nó không phải là cách rõ ràng nhất để thực hiện một hoạt động như vậy, nhưng nó ngắn gọn và những người đã nhìn thấy nó trước đó biết ngay những gì nó đang làm.
Một ví dụ đáng chú ý khác là " The Orcish Maneuver ", lợi dụng các khái niệm của perl về đúng / sai, các toán tử giàu và ưu tiên toán tử.
Một thứ mà cá nhân tôi thích khá nhiều có liên quan đến Orcish Maneuver, nhưng tôi biết không có tên cho nó:
push @{ $some_hash{$key} ||= [] }, $some_value;
Đây thực sự không phải là sự xáo trộn, mà là một biểu hiện rõ ràng, nhỏ gọn của một cái gì đó mà nếu không thì phải mất vài dòng để làm. Nếu khóa có mặt trong hàm băm và có giá trị thực, hãy hủy tham chiếu nó dưới dạng một mảng và đẩy $ some_value lên mảng đó. Nếu phần tử băm không có mặt hoặc có giá trị sai, gán cho nó một mảng trống, sau đó bỏ qua mảng đó và thực hiện việc đẩy.
Nó cũng đáng chú ý là tính đến Perl 5.14, một phần của thành ngữ này là lỗi thời - push bây giờ có thể hoạt động trực tiếp trên tham chiếu mảng, không có @ {} cần thiết! Ngoài ra, kể từ Perl 5.10, người ta có thể sử dụng // = thay vì || = kiểm tra không phải là sự thật mà là tính xác định.