Sự khác biệt giữa thành ngữ và mẫu thiết kế?


39

Sự khác biệt giữa thành ngữ và thiết kế-mẫu là gì? Dường như những thuật ngữ này trùng lặp ở đâu đó; Chính xác thì tôi không biết. Họ có thể thay thế cho nhau? Khi nào tôi nên sử dụng cái gì?

Dưới đây là danh sách các thành ngữ C ++. Tôi có thể gọi chúng là các mẫu thiết kế không?

Wikipedia định nghĩa,

Thành ngữ lập trình như một mẫu thiết kế cấp thấp

Nó có nghĩa là gì? Không gì "cấp thấp" có nghĩa là ở đây?

Câu hỏi này được lấy cảm hứng từ một câu hỏi khác: https://stackoverflow.com/questions/7343531/are-the-some-design-potypes-lingu-depocate


Trong thực tế, sự khác biệt có thể khó xác định (và có thể có một số liên tục giữa một thành ngữ và một mẫu thiết kế). Nhưng nó có lẽ xuất phát từ thuật ngữ "thành ngữ" trong ngôn ngữ tự nhiên: en.wikipedia.org/wiki/Idiom (không thực sự phù hợp với cách sử dụng).
Merlyn Morgan-Graham

2
Điều này có lẽ phù hợp hơn cho lập trình viên SE.
Oliver Charlesworth

3
@Nawaz: "Mẫu thiết kế" là cấu trúc tương đối "cấp cao" xung quanh khiếm khuyết ngôn ngữ. Một "thành ngữ" là một cấu trúc tương đối "cấp thấp" xung quanh khiếm khuyết ngôn ngữ; )
Tristan St.

@ Nawaz- +1 cho sự hài hước.
Jennifer S

Câu trả lời:


30

Một thành ngữ là một ý tưởng để làm việc xung quanh các ngôn ngữ. Một số ví dụ xuất hiện trong tâm trí là bất kỳ thành ngữ C ++ nào bạn liên kết trong câu hỏi ban đầu. Họ giải quyết một vấn đề phổ biến trong ngôn ngữ đó theo cách đóng hộp.

Một mẫu thiết kế là tương tự, trong đó nó giải quyết một vấn đề phổ biến. Nhưng mẫu thiết kế lý tưởng dựa trên các đặc điểm ngôn ngữ phổ biến, và do đó là thuyết bất khả tri ngôn ngữ.

Tuy nhiên, có một sự liên tục giữa các thành ngữ và các mẫu thiết kế, giống như có từ các ngôn ngữ cấp thấp đến cấp cao.

Mẫu khách truy cập là một ví dụ tốt; nếu chỉ có một ngôn ngữ chỉ hỗ trợ công văn động đơn, thì chúng tôi có thể coi mẫu Khách truy cập là thành ngữ của ngôn ngữ đó. Nhưng có rất nhiều ngôn ngữ không hỗ trợ trực tiếp nhiều công văn. Do đó, mô hình khách truy cập đã được sinh ra.

Mẫu Observer cũng xuất hiện trong tâm trí - C # trực tiếp hỗ trợ nó, do đó, nó không cần hình thức chung quanh của mẫu.

Một ví dụ đi theo hướng khác là các tính năng OO (kế thừa, đa hình, v.v.). C không trực tiếp hỗ trợ họ. Nếu có nhiều ngôn ngữ giống như C, thì chúng tôi có thể phát triển các mẫu thiết kế để triển khai các bảng v, an toàn kiểu, v.v. Vì nhiều ngôn ngữ hỗ trợ tính năng đó, chúng tôi sẽ gọi bất kỳ giải pháp phổ biến nào trong C là thành ngữ, thay vì gọi chung giải pháp một mẫu thiết kế.


2
Một ví dụ thú vị khác: API cú pháp trôi chảy. Chúng bù cho thực tế là bạn không có hỗ trợ DSL trực tiếp bằng ngôn ngữ của mình và nó bước qua ranh giới ngôn ngữ. Tôi không chắc nó đã chuyển sang trạng thái "Mẫu thiết kế" chưa, và nó vang lên như một thành ngữ cú pháp ...
Merlyn Morgan-Graham

Thực tế là C # trực tiếp hỗ trợ các mô hình Observer sẽ dường như chỉ ra rằng nó không có một nhu cầu rất lớn đối với các mô hình, nhiều đến nỗi nó chuyển thi xa nhà phát triển và sang ngôn ngữ riêng của mình.
jaco0646

@ jaco0646 Tôi đã điều chỉnh lại dòng đó, có thể rõ ràng hơn bây giờ
Merlyn Morgan-Graham

37

Các mẫu thiết kế thường không phải là ngôn ngữ cụ thể. Thành ngữ ngôn ngữ có xu hướng phụ thuộc vào tính năng cụ thể của một ngôn ngữ (hoặc lớp ngôn ngữ) hoặc khắc phục sự thiếu hụt cụ thể trong ngôn ngữ nói.


+1 để vẽ một sự khác biệt với một vài từ và một vài điểm không chính xác.
Merlyn Morgan-Graham

1
@Merlyn Morgan-Graham: Bạn đã nhận xét về hầu hết các câu trả lời, bao gồm cả câu hỏi. Vậy tại sao bạn không đăng một câu trả lời chi tiết mà không có sự thiếu chính xác nào cả? Tôi muốn biết suy nghĩ của bạn.
Nawaz

1
@Nawaz: Nhận xét là về các câu trả lời khác. Điều này đã gần như hoàn hảo. Tôi lý tưởng như các mẫu trong một câu trả lời, nhưng dường như không ai hiểu đúng. Tôi có lẽ cũng không thể, nếu không tôi sẽ vui vẻ bắt buộc :)
Merlyn Morgan-Graham

@Nawaz: Được rồi, dù sao tôi cũng đã bắn nó rồi :)
Merlyn Morgan-Graham

12

Tôi sẽ không đặt quá nhiều tiền trong định nghĩa Wikipedia.

Ít nhất một thành ngữ là ngôn ngữ cụ thể trong khi một mẫu thiết kế phấn đấu, hoặc nên phấn đấu, là bất khả tri ngôn ngữ. Đi xa hơn, thành ngữ thường là quy ước để tăng cường khả năng đọc, hoặc là sự thay thế vượt trội (về một số giá trị kỹ thuật) khi có nhiều hơn một cách để làm một cái gì đó. Tất cả những điều đó có liên quan đến cách các ý tưởng được thể hiện (rõ ràng, dài dòng, ngắn gọn), nhưng không liên quan đến chính các ý tưởng.

Mặt khác, các mẫu thiết kế là bản chất của một ý tưởng định kỳ, một ý tưởng rằng một tiên nghiệm có thể được thể hiện bằng bất kỳ ngôn ngữ nào cho vay chính nó. Khách truy cập là một triển khai gửi hai lần dựa trên một lần gửi và quá tải và điều này có thể được sử dụng trong bất kỳ ngôn ngữ nào có một lần gửi và quá tải. Biết về mẫu không giúp viết mã biểu cảm hơn hoặc dễ đọc hơn, nó giúp giải quyết vấn đề liên quan. Không có gì thành ngữ về nó bởi vì chẳng hạn, không có hình thức chính thức nào của Khách truy cập trong ví dụ C ++.


1
+1; Câu trả lời tốt. Tôi đang có xu hướng tin tất cả mọi thứ ở đây ngoại trừ bit cuối cùng. Có những ngôn ngữ có hỗ trợ trực tiếp cho nhiều công văn, do đó, mẫu Khách truy cập sẽ không cần tồn tại ở đó. Từ quan điểm của họ, "mẫu" có thể là một thành ngữ. Từ ngôn ngữ cấp cao cuối cùng, tất cả các mẫu có thể trở thành thành ngữ ...
Merlyn Morgan-Graham

@Merlyn Thành ngữ gì về việc thực hiện một tính năng ngôn ngữ hạng nhất? Ai làm điều đó?
Luc Danton

Đó là điểm. Người dùng ngôn ngữ đó sẽ coi "mẫu thiết kế" là một thành ngữ, bởi vì ngôn ngữ của họ mát hơn :)
Merlyn Morgan-Graham

@Merlyn Điều đó không phù hợp với cách sử dụng 'thành ngữ' của tôi. Một thành ngữ của một ngôn ngữ là một cái gì đó bạn mong đợi một người sử dụng ngôn ngữ ngẫu nhiên, thành thạo để nhận ra; thực hiện lại một tính năng hạng nhất sẽ trông xa lạ và lạc lõng. Không có thành ngữ C ++ cho một công văn, người ta chỉ sử dụng virtualở một số nơi trong khi con trỏ viết tay cho thủ thuật bảng thành viên sẽ trông thật ngớ ngẩn.
Luc Danton

1
Tôi thích nơi bạn sẽ đến với định nghĩa thành ngữ khác với "mẫu thiết kế của người nghèo", đó là cách mà mô hình của tôi đối xử với nó (xem câu trả lời của tôi). Nó ít hơn "đây là cách thực hiện điều này" và hơn nữa "đây là cách đúng đắn để thực hiện điều này". Ví dụ, tôi không thể tưởng tượng "Big Three" đang phát triển thành một mẫu thiết kế. Và cũng có thành phần cú pháp, ví dụ do_something() or die "...";(bị đánh cắp từ một nhận xét khác ở đây). Nó dựa trên các tính năng ngôn ngữ cụ thể, nhưng đó là một cách phổ biến để sử dụng các tính năng đó. Nó không phải là ngôn ngữ chéo, và có lẽ sẽ không được.
Merlyn Morgan-Graham

6

Định nghĩa tiếng Anh thông thường của Thành ngữ. Là một cụm từ mà ý nghĩa được chấp nhận không có trong các từ được sử dụng. Ví dụ sẽ là "Mưa mèo và chó" hoặc "Thịt bò ở đâu?"

Trong các ngôn ngữ lập trình, nó thường đề cập đến một phím tắt cú pháp thực hiện một cái gì đó không rõ ràng ngay từ chính mã nhưng nó được sử dụng thường xuyên đủ để các lập trình viên khác nhận ra ý nghĩa ngay lập tức.

Perl có lẽ là ngôn ngữ giàu thành ngữ nhất. Với các cấu trúc như:

while (<IN>) {
    print $_
}

Ý nghĩa rõ ràng đối với một lập trình viên perl có kinh nghiệm nhưng là một bí ẩn đối với bất kỳ ai khác


Tôi nghĩ rằng "thịt bò ở đâu" là một meme hơn là một thành ngữ. Có thể có một sự liên tục khác ở đó;) Có thể có nhiều thành ngữ hơn là việc triển khai bằng ngôn ngữ, vì mọi thứ có thể là một phần hoặc thất bại trong việc thực hiện thành ngữ đó - ví dụ như "Big Three" của C ++. Trong trường hợp đó, thành ngữ là tên và mô tả của "Big Three".
Merlyn Morgan-Graham

2
Perl có thành ngữ tốt nhất -do_something() or die "arrrrgh!";
cxfx

2

Thành ngữ là ngôn ngữ cụ thể. Ví dụ: while (*dest++=*src++);một thành ngữ C / C ++. Hoàn toàn không thể viết một cái gì đó tương tự từ xa trong Pascal hoặc Java. Sử dụng từ "thành ngữ" khi bạn sử dụng nó trong tiếng Anh. "Bạn làm thế nào?" như một lời chào là một thành ngữ. Một số ngôn ngữ như tiếng Đức và tiếng Pháp có cùng thành ngữ. Nhưng nhiều ngôn ngữ khác sẽ không "hỏi" một cái gì đó như một lời chào. Mặt khác, một mẫu (hướng đối tượng) thường có thể được điều chỉnh thành bất kỳ ngôn ngữ nào hỗ trợ kế thừa và ủy quyền. Một thành ngữ có thể đơn giản như một dòng mã. Một mẫu thiết kế luôn liên quan đến một số lớp.


+1. Điểm hay:A idiom might be as simple as one line of code. A design pattern always involves several classes.
Nawaz

2

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.


trong trăn : some_dict.setdefault(key, []).append(some_value).
Jonas Kölker

0

Quan điểm của một Thành ngữ là trở thành một ý tưởng hoặc khái niệm mở rộng các ngôn ngữ lập trình, đó là một cách làm và một quá trình hoạt động mà không cần tái cấu trúc khái niệm khi bạn lấy nó từ một thứ và dán nó vào một thứ khác, như loại bong bóng thấp . Các mẫu thiết kế là các triển khai cụ thể của một thành ngữ hoặc các mức độ của ý tưởng để phù hợp với một ngôn ngữ, do đó bạn có mẫu thiết kế javascript của thành ngữ người nghe sự kiện, v.v.


trình lắng nghe sự kiện là một tính năng ngôn ngữ thực hiện tín hiệu / vị trí (mẫu?) hoặc mẫu Người quan sát. Cũng có những thứ trong C ++ được gọi là thành ngữ đơn giản là không quan trọng hoặc không phù hợp với các ngôn ngữ khác (theo như tôi biết) - ví dụ: thành ngữ sao chép và trao đổi.
Merlyn Morgan-Graham

Design patterns are specific implementations of an idiom? Thật là chính xác? Bạn có thấy các thành ngữ C ++, trong liên kết trong câu hỏi của tôi không?
Nawaz

0

Tôi không chắc chắn 100%, nhưng thành ngữ chỉ đơn giản là các thuật ngữ liên quan đến một lĩnh vực nhất định. Khi bạn nói "mẫu thiết kế", bạn nghĩ đến "Mẫu quan sát" "Chuỗi khả năng đáp ứng" "Mẫu khách truy cập" "nhà máy". Đây là những mẫu phổ biến được sử dụng để giải quyết các vấn đề phổ biến trong lập trình. Nhìn vào đây để xem danh sách toàn diện: http://en.wikibooks.org/wiki/C++_Programming/Code/Design_Potypes


0

Nó có nghĩa là gì? "Cấp thấp" nghĩa là gì ở đây?

Tôi hiểu điều đó có nghĩa là nó không phải là một cách trừu tượng, cao cấp để mô hình hóa ứng dụng hoặc các thành phần của ứng dụng của bạn, mà thay vào đó là một cách sử dụng thông minh hoặc thông dụng về ngữ nghĩa ngôn ngữ.

ví dụ: đặt biến nếu nó ước lượng thành false (thường được sử dụng để đặt biến nil theo điều kiện):

var ||= some_default_value

0

Đây là một ví dụ về một thành ngữ (trong C #) để xử lý một sự kiện. Bạn không được phép khởi động một sự kiện nếu nó không có bất kỳ trình xử lý nào được đính kèm, vì vậy thành ngữ là luôn kiểm tra điều này trước.

Do đó, thành ngữ chung để xử lý các sự kiện trở thành:

EventHandler handler = this.MyEvent;
if ( null != handler ) { handler( param1, param2 ); }

Thành ngữ này là cụ thể (mặc dù không độc quyền) đối với ngôn ngữ C #.

Tuy nhiên, nhìn chung hơn, cơ chế tạo sự kiện C # là một ví dụ về mẫu thiết kế quan sát viên có thể được thực hiện bằng bất kỳ ngôn ngữ nào.

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.