Mã thành ngữ là gì?


85

Tôi muốn quan tâm đến một số ví dụ trước và sau c #, một số ví dụ không thành ngữ và có thành ngữ. Các ví dụ không phải c # cũng sẽ ổn nếu chúng hiểu được ý tưởng. Cảm ơn.


3
Các tính năng ẩn của C # chứa đầy thành ngữ C #. Không phải tất cả đều khiến bạn bận tâm, nhưng nhiều câu nói đơn giản có số phiếu ủng hộ cao có thể được coi là thành ngữ. Và một số câu trả lời cũng mô tả các lựa chọn thay thế không thành ngữ.
Michiel van Oosterhout

Câu trả lời:


119

Idiomatic có nghĩa là tuân theo các quy ước của ngôn ngữ. Bạn muốn tìm những cách dễ nhất và phổ biến nhất để hoàn thành một nhiệm vụ hơn là chuyển kiến ​​thức của bạn từ một ngôn ngữ khác.

python không phải thành ngữ bằng cách sử dụng vòng lặp với append:

mylist = [1, 2, 3, 4]
newlist = []
for i in mylist:
    newlist.append(i * 2)

idiomatic python sử dụng khả năng hiểu danh sách:

mylist = [1, 2, 3, 4]
newlist = [(i * 2) for i in mylist] 

36

Vài ví dụ:

Quản lý tài nguyên , không thành ngữ:

string content;
StreamReader sr = null;
try {
    File.OpenText(path);
    content = sr.ReadToEnd();
}
finally {
    if (sr != null) {
        sr.Close();
    }
}

Thành ngữ:

string content;
using (StreamReader sr = File.OpenText(path)) {
    content = sr.ReadToEnd();
}

Lặp lại , không thành ngữ:

for (int i=0;i<list.Count; i++) {
   DoSomething(list[i]);
}

Cũng không phải thành ngữ:

IEnumerator e = list.GetEnumerator();
do {
   DoSomenthing(e.Current);
} while (e.MoveNext());

Thành ngữ:

foreach (Item item in list) {
   DoSomething(item);
}

Lọc , không thành ngữ:

List<int> list2 = new List<int>();
for (int num in list1) {
  if (num>100) list2.Add(num);
}

thành ngữ:

var list2 = list1.Where(num=>num>100);

13
Các niềng răng là thành ngữ Java ;-)
Mathieu Guindon

15

Mã tự động là mã thực hiện một nhiệm vụ chung theo cách chung cho ngôn ngữ của bạn. Nó tương tự như một mẫu thiết kế, nhưng ở quy mô nhỏ hơn nhiều. Các thành ngữ khác nhau nhiều theo ngôn ngữ. Một thành ngữ trong C # có thể là sử dụng trình lặp để lặp qua một tập hợp thay vì lặp qua nó. Các ngôn ngữ khác không có trình lặp có thể dựa vào thành ngữ vòng lặp.


6

Trong PHP, đôi khi tôi gặp mã như:

foreach ($array as $value) {
    $trimmed[] = trim($value);
}
return $trimmed;

Thành ngữ nào có thể được triển khai với:

return array_map('trim', $array);

5

Thực tế mà nói, nó có nghĩa là viết mã theo một cách nhất quán, tức là tất cả các nhà phát triển làm việc trên cơ sở mã của bạn phải tuân theo các quy ước giống nhau khi viết các cấu trúc mã tương tự.

Vì vậy, cách thành ngữ là cách phù hợp với phong cách của mã khác, cách không thành ngữ có nghĩa là bạn đang viết loại hàm nhưng theo một cách khác.

Ví dụ: nếu bạn đang lặp lại một số mục nhất định, bạn có thể viết vòng lặp theo một số cách:

for (int i = 0; i < itemCount; i++)

for (int i = 1; i <= itemCount; i++)

for (int i = 0; i < itemCount; ++i)

Vân vân

Điều quan trọng nhất là phong cách đã chọn được sử dụng nhất quán. Bằng cách đó, mọi người trở nên rất quen thuộc và tự tin với cách sử dụng nó, và khi bạn phát hiện ra một cách sử dụng trông khác, đó có thể là dấu hiệu của một sai lầm được đưa ra, có thể là do một lỗi, ví dụ:

for (int i = 1; i < itemCount; i++)

2
Tôi đoán tôi đã nghĩ thành ngữ có nghĩa là "cách tốt nhất" thay vì chỉ là một tiêu chuẩn tùy ý. Nhưng tôi đoán cách tốt nhất là tùy thuộc vào ngữ cảnh.
MrBoJangle
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.