관용구와 디자인 패턴의 차이점은 무엇입니까?


39

관용구와 디자인 패턴의 차이점은 무엇입니까? 이러한 용어는 어딘가에 겹치는 것 같습니다. 정확히, 나는 모른다. 그들은 상호 교환이 가능합니까? 언제 무엇을 사용해야합니까?

다음 은 C ++ 숙어 목록입니다. 디자인 패턴이라고 부를 수 있습니까?

Wikipedia 는 다음을 정의합니다.

저수준 디자인 패턴으로 숙어 프로그래밍

무슨 뜻인가요? 여기서 "저수준" 은 무엇을 의미합니까?

이 질문은 또 다른 질문에서 영감을 얻었습니다 : https : //.com/questions/7343531/are-the-some-design-patterns-language-dependent


실제 용어로 구별을 결정하기 어려울 수 있습니다 (이디엄과 디자인 패턴 사이에 연속체가있을 수 있음). 그러나 아마도 자연어 인 "아이디 엄"이라는 용어 인 en.wikipedia.org/wiki/Idiom (용법에 맞지 않음) 에서 유래했을 것입니다 .
Merlyn Morgan-Graham

2
프로그래머 SE에 더 적합 할 것입니다.
Oliver Charlesworth

3
@Nawaz : "디자인 패턴"은 언어 결함을 중심으로 비교적 "고수준"구성입니다. "이디엄"은 언어 결함에 대한 상대적으로 "낮은 수준의"구조입니다. )
Tristan St.

유머는 @ Nawaz- +1입니다.
Jennifer S

관용구 대 패턴 도 참조하십시오 .
MS Dousti

답변:


30

관용구는 언어의 단점을 해결하는 아이디어입니다. 염두에 두어야 할 몇 가지 예는 원래 질문에서 연결 한 C ++ 숙어 중 하나입니다. 그들은 그 언어의 일반적인 문제를 통조림으로 해결합니다.

디자인 패턴은 일반적인 문제를 해결한다는 점에서 비슷합니다. 그러나 이상적인 디자인 패턴은 일반적인 언어 기능을 기반으로하므로 언어에 구애받지 않습니다.

저급 언어에서 고급 언어에 이르기까지 숙어와 디자인 패턴 사이에는 연속체가 있습니다.

방문자 패턴이 좋은 예입니다. 단일 동적 디스패치 만 지원하는 언어가 하나 뿐인 경우 방문자 패턴을 해당 언어의 관용구로 간주 할 수 있습니다. 그러나 다중 디스패치를 ​​직접 지원하지 않는 수많은 언어가 있습니다. 따라서 방문자 패턴이 탄생했습니다.

관찰자 패턴도 염두에 두어야합니다. C #에서 직접 지원하므로 패턴의 일반적인 해결 방법이 필요하지 않습니다.

다른 방향으로가는 예는 OO 기능 (상속, 다형성 등)입니다. C는 직접 지원하지 않습니다. C와 같은 언어가 더 많으면 v- 테이블, 형식 안전성 등을 구현하는 디자인 패턴을 개발할 수 있습니다. 많은 언어가 이러한 기능을 지원하므로 일반화 된 언어를 호출하는 대신 C의 모든 관용 솔루션을 호출합니다. 솔루션 디자인 패턴.


2
또 다른 흥미로운 예 : Fluent 구문 API. 그들은 당신이 당신의 언어로 직접 DSL을 지원하지 않으며, 언어의 경계를 넘어서는 사실을 보충합니다. 나는 그것이 "디자인 패턴"상태로 아직 졸업했다고 확신하지 못하고, 그것은 구문 관용구처럼 울린다.
Merlyn Morgan-Graham

C # 직접 옵저버 패턴이 있음을 나타내는 것 같다 지원하는 사실 않습니다 너무 많은 그래서 개발자들과 언어 자체에 구현 멀리 이동하는 패턴에 대한 큰 필요가있다.
jaco0646

@ jaco0646 내가 그 라인을 재 진술보다 지금 취소 될 수 있습니다
Merlyn 모건 - 그레이엄에게

37

디자인 패턴은 일반적으로 언어별로 다릅니다. 언어 숙어는 언어 (또는 언어 클래스)의 특정 기능에 의존하거나 해당 언어 (들)의 특정 결함을 해결하는 경향이 있습니다.


단어가 적고 부정확성이 적은 구별을 그리기 위해 +1.
Merlyn Morgan-Graham

1
@Merlyn Morgan-Graham : 질문을 포함하여 거의 모든 답변 에 댓글을 달았습니다 . 그렇다면 부정확하지 않은 세부 답변을 게시하지 않으 시겠습니까? 당신의 생각을 알고 싶습니다.
Nawaz

1
@ 나와 즈 : 의견은 다른 답변에 관한 것이었다. 이것은 이미 거의 완벽합니다. 나는 대답에서 샘플을 이상적으로 원하지만 아무도 그것을 올바르게 얻지 못하는 것 같습니다. 아마 그렇지 않으면 내가 :) 행복하게 오블리주 거라고, 아니 두 수
Merlyn 모건 - 그레이엄

@Nawaz : 좋아 나는 :) 어쨌든 그것에게 주사를 놓았다
Merlyn 모건 - 그레이엄에게

12

Wikipedia 정의에 너무 많은 통화를 넣지 않을 것입니다.

최소한 관용구는 언어에 따라 다르지만 디자인 패턴은 언어에 구애받지 않기 위해 노력하거나 노력해야합니다. 더 나아가서, 관용구는 일반적으로 가독성을 향상시키기위한 관습이거나, 무언가를 수행하는 방법이 여러 가지있을 때 우수한 기술 대안 (일부 기술적 장점)입니다. 이러한 모든 것들은 아이디어가 표현되는 방식 (명확성, 상세 성, 간결성)과 관련이 있지만 아이디어 자체 와는 관련이 없습니다.

다른 한편으로, 디자인 패턴은 반복되는 아이디어의 본질 있다는 생각입니다 사전은 그것을 빌려 준다 어떤 언어로 표현 될 수있다. 방문자는 단일 디스패치 및 오버로드에 의존하는 이중 디스패치의 구현이며 단일 디스패치 및 오버로드가있는 모든 언어에서 사용할 수 있습니다. 패턴에 대해 알면 표현력이 뛰어나고 읽기 쉬운 코드를 작성하는 데 도움이되지 않으며 관련 문제를 해결하는 데 도움이됩니다. 예를 들어 C ++에는 방문자의 정식 형태가 없기 때문에 관용적 인 것은 없습니다.


1
+1; 좋은 대답입니다. 나는 마지막 비트를 제외한 모든 것을 믿는 경향이 있습니다. 다중 디스패치를 ​​직접 지원하는 언어가 있으므로 방문자 패턴이 존재하지 않아도됩니다. 그들의 관점에서 볼 때 "패턴"은 관용구가 될 수 있습니다. 궁극적 인 고급 언어에서, 모든 패턴은 ... 숙어 될 수도
Merlyn 모건 - 그레이엄

@Merlyn 일급 언어 기능을 다시 구현하는 데 관용적 인 표현은 무엇입니까? 누가합니까?
Luc Danton

그게 요점입니다. 그들의 언어는 : 쿨러이기 때문에 해당 언어의 사용자는 "디자인 패턴"관용구를 고려할 것
Merlyn 모건 - 그레이엄

@Merlyn 그것은 '용어'의 사용에 맞지 않습니다. 언어의 관용구는 언어의 임의의 능숙한 사용자가 인식하기를 기대하는 것입니다. 일급 기능을 다시 구현하면 외계인과 제자리가 아닌 것처럼 보일 것입니다. 단일 디스패치에 대한 C ++ 관용구는 없으며 virtual일부 장소에서 사용 하는 반면 멤버 테이블 속임수에 대한 손으로 쓴 포인터는 어리석은 것처럼 보입니다.
Luc Danton

1
나는 당신이 관용구의 정의가 "가난한 사람의 디자인 패턴"과 다른 점을 좋아합니다. 이것은 내 모델이 그것을 처리하는 방식입니다 (내 대답을보십시오). "이것은 어떻게 구현 하는가"가 아니라 "이것을 구현하는 올바른 방법 은 여기 "입니다. 예를 들어, "Big Three"이 디자인 패턴으로 진화한다고 상상할 수 없습니다. 그리고 구문 요소도 있습니다 (예를 들어 do_something() or die "...";다른 주석에서 도난 당함). 특정 언어 기능을 기반으로하지만 이러한 기능을 사용하는 일반적인 방법입니다. 언어가 다르지 않을 수도 있습니다.
Merlyn Morgan-Graham

6

관용구의 일반적인 영어 정의. 사용 된 단어에 허용되는 의미가 포함되지 않은 문구입니다. 예를 들면 "비가 오는 고양이와 개"또는 "소고기는 어디에 있습니까?"

프로그래밍 언어에서 그것은 일반적으로 코드 자체에서 즉시 명백하지는 않지만 다른 프로그래머가 의미를 즉시 인식하기에 충분히 자주 사용되는 구문 적 단축키를 말합니다.

펄은 아마도 가장 관용구가 풍부한 언어 일 것입니다. 다음과 같은 구성으로 :

while (<IN>) {
    print $_
}

경험있는 펄 프로그래머에게는 누구의 의미가 분명하지만 다른 사람에게는 미스터리


"소고기는 어디에 있나"는 관용구보다 더 밈이라고 생각합니다. 거기에 또 다른 연속체가있을 수 있습니다. 이 경우 관용구는 "Big Three"의 이름과 설명입니다.
Merlyn Morgan-Graham

2
펄은 최고의 관용구를 가지고 있습니다 –do_something() or die "arrrrgh!";
cxfx

2

숙어는 언어마다 다릅니다. 예 while (*dest++=*src++);를 들어 C / C ++ 관용구입니다. 파스칼이나 자바에서 원격으로 비슷한 것을 쓰는 것은 완전히 불가능합니다. 영어로 "idiom"이라는 단어를 사용하십시오. "어떻게 지내?" 인사는 관용구입니다. 독일어 및 frensh와 같은 일부 언어는 동일한 관용구를 갖습니다. 그러나 다른 많은 언어들은 이와 같은 것을 인사로 "묻지"않을 것입니다. 반면에 (객체 지향) 패턴은 일반적으로 상속 및 위임을 지원하는 모든 언어로 적용 할 수 있습니다. 관용구는 한 줄의 코드만큼 간단 할 수 있습니다. 디자인 패턴에는 항상 여러 클래스가 포함됩니다.


+1. 좋은 지적 :A idiom might be as simple as one line of code. A design pattern always involves several classes.
Nawaz

2

나는 최근에 상당히 깊어지고 있고 내가 느끼는 것처럼 아마추어처럼 보이지 않도록 코드를 원하기 때문에 일반적인 C ++ 관용구를 검색하는이 게시물을 발견했습니다. :-P

Perl과 꽤 많은 시간을 보냈는데, 그 언어의 관용구가 영어 나 스페인어와 같은 자연 언어에서 사용되는 관용구와 매우 흡사하다는 것을 알았습니다.

나는 관용구가 "작은 디자인 패턴"과 같다는 것에 동의하지 않습니다. 그럼에도 불구하고, 관용구가 언어의 부족을 해결하는 방법이라는 데 여전히 동의하지 않습니다.

아마도 Luc Danton의 대답 이 가장 가깝지만 설명하겠습니다. 나는 관용구가 언어를 사용하는 사람들의 관용적 이라고 생각합니다 . 일반적으로, 아마도 명백하지는 않지만, 이전에 그것을 보았을 정도로 유창한 사람들에게 의미있는 방식으로 작업을 수행하거나 의도를 표현하는 일반적인 표현 또는 일련의 표현 .

펄로 돌아 가면 아마도 가장 잘 알려진 관용구는 " 슈바르츠 변환 (Schwartzian Transform) "인데, 이는 데이터에 대해 작고 효율적인 방식으로 정렬을 수행하는 표현입니다. 그러한 작업을 수행하는 가장 확실한 방법은 아니지만 간결하며 이전에 본 사람들은 작업을 즉시 알 수 있습니다.

또 다른 주목할만한 예는 " The Orcish Maneuver "로, 펄의 참 / 거짓, 리치 연산자 및 연산자 우선 순위 개념을 활용합니다.

개인적으로 아주 좋아하는 것은 Orcish Maneuver와 다소 관련이 있지만 이름은 없습니다.

push @{ $some_hash{$key} ||= [] }, $some_value;

이것은 실제로 난독 화가 아니라, 몇 줄이 걸리는 무언가를 명확하고 간결하게 표현한 것입니다. 키가 해시에 존재하고 실제 값을 갖는 경우, 키를 배열로 역 참조하고 $ some_value를 해당 배열로 푸시하십시오. 해시 요소가 없거나 잘못된 값이 있으면 빈 배열을 할당 한 다음 해당 배열을 역 참조하고 푸시를 수행하십시오.

또한 Perl 5.14부터이 관용구의 일부는 쓸모가 없다는 점에 주목할 필요가 있습니다. 이제 푸시 는 어레이 참조에서 직접 작동 할 수 있으며 @ {}가 필요하지 않습니다! 또한 Perl 5.10부터는 || = 대신 // =를 사용하여 진실이 아닌 정의를 검사 할 수 있습니다.


파이썬에서 : some_dict.setdefault(key, []).append(some_value).
Jonas Kölker 2016 년

0

관용구의 요점은 프로그래밍 언어를 아우르는 아이디어 또는 개념이어야하며, 기포가 낮은 종류와 같이 하나에서 가져 와서 다른 것을 집어 넣을 때 많은 개념적 구조 조정없이 작동하는 방법과 프로세스입니다. . 디자인 패턴은 관용구의 특정 구현 또는 언어에 맞는 아이디어의 범위이므로 이벤트 리스너 관용구 등의 자바 스크립트 디자인 패턴이 있습니다.


이벤트 리스너는 신호 / 슬롯 (패턴?) 또는 관찰자 패턴을 구현하는 언어 기능입니다. C ++에는 이디엄이라고하는 것들도 있습니다. 복사 및 스왑 이디엄과 같이 다른 언어에는 적합하지 않거나 다른 언어에는 맞지 않습니다.
Merlyn Morgan-Graham

Design patterns are specific implementations of an idiom? 정확히 어떻게? 내 질문의 링크에서 C ++ 관용구를 보았습니까?
Nawaz

0

100 % 확신 할 수는 없지만 관용구는 단순히 특정 분야와 관련된 용어입니다. "디자인 패턴"이라고 말하면 "관찰자 패턴" "책임 체인" "방문자 패턴" "공장"을 생각합니다. 프로그래밍의 일반적인 문제를 해결하는 데 사용되는 일반적인 패턴입니다. 포괄적 인 목록을 보려면 여기를 참조하십시오. http://en.wikibooks.org/wiki/C++_Programming/Code/Design_Patterns


0

무슨 뜻인가요? 여기서 "저수준"은 무엇을 의미합니까?

응용 프로그램이나 응용 프로그램의 구성 요소를 모델링하는 높은 수준의 추상적 인 방법이 아니라 언어 의미의 영리하거나 일반적인 사용을 의미합니다.

예를 들어, 변수가 false로 평가되면 변수 설정 (일반적으로 nil 변수를 조건부로 설정하는 데 사용됨) :

var ||= some_default_value

0

다음은 이벤트를 처리하기위한 관용구 (C #)의 예입니다. 처리기가 연결되어 있지 않으면 이벤트를 실행할 수 없으므로 관용구는 항상 이것을 먼저 확인해야합니다.

따라서 이벤트 처리를위한 일반적인 관용구는 다음과 같습니다.

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

이 관용구는 C # 언어에만 적용됩니다 (배타적이지는 않지만).

그러나 더 일반적으로 C # 이벤트 메커니즘은 모든 언어로 구현 될 수있는 관찰자 디자인 패턴 의 예입니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.