파이썬과 같은 동적 언어에서 불필요한 디자인 패턴이 있습니까?


98

GoF가 디자인 패턴 북을 읽기 시작했습니다. 약간의 개념 차이만으로도 일부 패턴이 매우 유사 해 보입니다.

파이썬과 같은 동적 언어에서는 일부 패턴이 필요하지 않다고 생각합니까 (예 : 동적 기능으로 대체되기 때문에)?


1
언어 선택이 코드 구성을 효과적으로 대체 할 수 있음을 암시하는 흥미로운 질문입니다.
joshin4colours

3
답은 아니지만 관련성-GoF 디자인 패턴은 특정 패턴과 마찬가지로 증류 할 수있는 일반적인 원리와 관련이 있다고 생각했습니다. 필자는 패턴에 대한 아이디어를 의미하지는 않지만 (고유하지만) 순진한 OOP 원칙을 위반하는 특정 방식으로 클래스를 사용할 수있는 권한을 부여합니다. 예를 들어, "모양"이 명확하게 "자체를 그리지"않거나 최소한 작업의 일부 측면을 다른 개체에 위임하는 패턴이 많이 있습니다. OOP를 지원하는 모든 언어에서 수업이 중요하다고 생각합니다.
Steve314

매우 흥미로운 질문입니다. +1 대신 +5 할 수 있기를 바랍니다.
MathAttack

1
에서 눈의 끄트머리 있습니다 디자인 패턴 누락 언어 기능디자인 패턴 언어 특징 사라진다 C2에서 이상. 그것은 '동적 언어'문제조차 아닙니다. 가장 간단한 예는 파이썬, perl (그리고 심지어 동적이 아닌 Java)에서도 사소한 반복자 패턴입니다.

답변:


92

Peter Norvig는 GOF 책에있는 23 개의 디자인 패턴 중 16 개가 동적 언어에서 보이지 않거나 더 단순 하다는 것을 보여줍니다 (Lisp 및 Dylan에 중점을 둡니다).

Python을 언급 한 이후 Alex Martelli의 주제에 대한 멋진 프레젠테이션 이 있습니다. 파이썬과 관련하여 관용적 파이썬의 6 가지 디자인 패턴을 보여주는 멋진 블로그 게시물이 있습니다.

또한 Python에서 가장 일반적인 디자인 패턴 을 구현하여 다른 사람들이 github 저장소를 유지합니다 .


큰! 그것은 대답의 자리가 될 것입니다 :) 나는 모든 사람들이 그 질문을 분명히 이해하기를 바랍니다.
Gerenuk

2
Norvig에 따르면 16 개 중 2 개 (통역사 및 반복자)는 매크로 (Python에는없는)로 인해 "보이지 않거나 더 단순합니다".
mjs

1
혀짤배기 동적 아니라 때문에 이러한 강력한 기능의 언어 인과 같은 다른 기능이기 때문에 모든 패턴이 필요하지 않는 것을 나에게는 분명하지
JK.

@mjs 반복자는 Python의 기본 제공 기능입니다.
sakisk

1
이 위대한 대답이 조금이라도 다소 의미가 링크 캡션을 변경하여 개선 할 수는 보여 , 프리젠 테이션저장소를 들은 후 훨씬 더 나은 - 여기 :-) ... 당신이 알고있는,하지만
늑대

59

디자인 패턴이 필요하지 않습니다. 모든 언어로.

나는 디자인 패턴을 읽고 사람들이 그 패턴을 모든 곳에서 사용해야한다고 생각하는 사람들이 작성한 많은 코드를 접하는 경향이 있습니다. 결과적으로 실제 코드는 수많은 인터페이스, 래퍼 및 레이어에 묻히고 읽기가 매우 어렵습니다. 그것은 패턴을 디자인하는 잘못된 접근법입니다.

디자인 패턴은 문제를 겪을 때 유용한 유용한 숙어 레퍼토리를 갖도록 존재합니다. 그러나 문제를 식별하기 전에 어떤 패턴도 적용해서는 안됩니다. 단순하게 유지 바보 는 항상 우수한 통치 원칙이어야합니다.

또한 설계 패턴을 특정 상용구 코드가 아닌 문제를 생각하는 개념으로 생각하는 데 도움이됩니다. 그리고 대부분의 상용구는 Java에 대한 해결 방법으로 무료 기능과 Python, C #, C ++ 등과 같은 대부분의 다른 언어에서 사용하는 표준 함수 객체가 부족합니다.

나는 방문자 패턴을 가지고 있다고 말할 수 있지만 일급 함수가있는 모든 언어에서는 함수를 취하는 함수 일뿐입니다. 팩토리 클래스 대신 일반적으로 팩토리 기능이 있습니다. 인터페이스가 있다고 말할 수도 있지만 다른 구현은 없기 때문에 주석으로 표시된 몇 가지 메소드 일뿐입니다 (물론 파이썬에서는 인터페이스가 항상 주석입니다. 덕 형식입니다). 코드를 생각하는 데 유용한 방법이기 때문에 코드를 패턴을 사용하는 것으로 여전히 말하지만 실제로 필요할 때까지 모든 것을 입력하지는 않습니다.

따라서 모든 패턴을 개념 으로 배우십시오 . 구체적인 구현은 잊어 버리십시오. 구현은 실제 환경에서는 심지어 Java에서도 다양하며 다양해야합니다.


28
당신의 시작 진술은 극단적으로 지나치게 단순화되고 있습니다. 패턴에는 비용이 있으므로 맹목적으로 사용해서는 안됩니다. 그러나 올바른 장소에서는 큰 도움이 될 수 있습니다. - 그리고 네, 그들은 언어 특정 일부 패턴에서 불필요한 일부 언어 자체가 더 나은 접근 방식을 지원하기 때문에 언어. 그러나 그것은 여전히 ​​당신의 첫 주장과는 거리가 멀다.
Péter Török

2
Btw Visitor는 고차 함수로 완전히 대체되지는 않습니다. 기본적으로 지원하지 않는 언어 (예 : C # 및 C ++)로 이중 디스패치를 ​​구현하는 솔루션입니다. (그리고 그것은 참으로 아주 드물게 사용되어야한다 -. 나는 그것을 사용 이럴 나는 나 자신이 그것을 사용하지 않을 것을 정당화하기 너무 어렵다 가장 난해한 비용이 많이 드는 패턴 중 하나 생각 지금)
페테르 토록

14
글쎄, 당신 은 패턴이 필요 하지 않습니다 . 필요한 것은 문제해결하는 것입니다 . 패턴을 모르는 경우 여전히 해결할 수 있으며 더 많은 생각이 필요하며 일부 패턴 또는 일치하지 않는 솔루션을 찾을 수 있습니다. 패턴을 알면 쉬워집니다.
Jan Hudec

3
@Gerenuk : 그렇습니다.하지만 요점은 패턴이 언어별로 다르지 않다는 것입니다. 파이썬에서 다른 패턴을 사용하여 훨씬 쉽게 일부 패턴을 구현할 수 있지만 일반적으로 동일한 개념이 존재합니다.
Jan Hudec

4
@ PéterTörök : 방문자는 아무것도 대체되지 않습니다. 요점은 다른 경우에 다른 도구를 사용하여 동일한 개념을 구현할 수 있지만 여전히 동일한 패턴으로 간주합니다.
Jan Hudec

13

파이썬과 같은 덕형 언어에서는 추상 팩토리 패턴 이 필요하지 않습니다. 실제로 언어에 내장되어 있기 때문입니다.


10
글쎄, 당신은 여전히 ​​다른 공장이 필요합니다. 인터페이스 정의가 필요하지 않습니다.
Stefano Borini

1
수업이 있으면 이미 공장이 있습니다. 클래스는 일급 객체이며 어디에서나 전달 될 수 있으며 단순히 Java와 달리 객체를 만들기 위해 호출 될 수 있습니다. 다른 것을 만들 필요가 없습니다. 기본 생성자가 아닌 것을 원한다면 생성자를 감싸는 람다 / 호출 가능 유형을 만드십시오.
spookylukey

13

떠오르는 유일한 것은 싱글 톤 패턴입니다.

파이썬은 모든 것에 클래스를 사용하도록 강요하지 않기 때문에 전역 데이터 구조를 대신 사용할 수 있습니다. 해당 전역 데이터 구조 는 인스턴스에서 관리 수 있지만 해당 클래스의 인스턴스화를 제어 할 필요는 없으며 가져 오기시 인스턴스를 작성하여 그대로두면됩니다.

대부분 파이썬의 싱글 톤은 모듈로 대체됩니다. 파이썬의 모듈은 본질적으로 싱글 톤입니다. 파이썬 인터프리터는 한 번만 만듭니다.

Python에서 한 번에 사용했던 Design Patters의 다른 모든 패턴은 Python 표준 라이브러리와 Python 자체에서 그 예를 찾을 수 있습니다.


2
요즘에는 실제로 반 패턴이 아닌가?
Den

16
싱글 톤은 반 패턴 입니다. 모든 언어로. 관련이없는 몇 가지 문제를 해결하기 위해 만들어졌으며 Java에도 정적 멤버가 있으므로 클래스 당 한 번 존재하는 정적 멤버가 있으므로 인스턴스가 필요하지 않습니다.
Jan Hudec

1
그리고 파이썬에서는 해결해야 할 문제가 없었기 때문에 결코 신경 쓰지 않았습니다.
Martijn Pieters

1
"Python은 모든 것에 객체를 사용하도록 강요하지 않습니다" 사실이 아닙니다. Java와 마찬가지로 눈에 띄지 않지만 Python에서는 모든 것이 객체입니다. 모듈조차도 대상입니다.
vartec

3
@ Darthfett : 나는 어떻게 len작동 하는지 잘 알고 있습니다. 귀도는 여기서 분명한 선택을했습니다 . 내 요점은 파이썬이 순수한 OOP 언어가 아님을 보여주는 것이다. 실용적인 언어입니다. 그 방법이 마음에 들어요.
Martijn Pieters

8

디자인 패턴은 언어가 아닌 프로그래머를위한 것입니다. 프로그래머는 문제를 이해하는 데 도움이되는 패턴을 사용하는 경향이 있습니다. 디자인 패턴이 꼭 필요한 것은 아니지만 수행하려는 작업을 단순화하는 데 도움이 될 수 있습니다.

파이썬과 오리 타이핑은 구체적으로 많은 일반적인 패턴과 관행을 끝내고 일부 패턴 (개인 정보, 불변성 등)에 의해 부과 된 많은 제한은 프로그래머가 그것들을 깨지 않기로 동의하는 정도까지만 유지합니다. . 그러나 여전히 프로그래머 작동 하는 한 작동합니다. 가상의 벽으로 둘러싸인 경우에도 문은 여전히 ​​문입니다.

파이썬은 "다중 패러다임"언어로 간주됩니다. 원하는 패턴을 사용할 수 있습니다. 이것은 의도적 인 것입니다. 예를 들어, 완전히 불필요하고 약간 인위적이지만 복잡한 클래스 계층 구조를 제공합니다. 그러나 일부 사람들에게는 특정 추상화가 도움이됩니다. 문제가 그것을 요구하기 때문이 아니라 프로그래머가 요구하기 때문입니다. 그래서 당신은 간다.


확실히 흥미 롭습니다. 파이썬에서 더 나은 방법이 있기 때문에 특히 어떤 패턴을 잊어 버릴 수 있습니까?
Gerenuk

4

원본 "디자인 패턴"책은 C ++ 및 스몰 토크와 같은 명령형 객체 지향 언어에 유용한 몇 가지 일반적인 관용구를 문서화하고 명명했습니다. 그러나 스몰 토크는 동적으로 유형이 지정되는 언어이므로 동적으로 문제가 될 수는 없습니다.

그러나 귀하의 질문에 대한 대답은 여전히 ​​"예"입니다. 이러한 디자인 패턴 중 일부는 현대적으로 동적으로 입력되는 언어와 관련이 없습니다. 더 일반적으로,이있을 것이다 다른 특히 여러 다른 언어로 디자인 패턴, 가지 언어.

"디자인 패턴"은 단순히 프로그래밍 관용구의 이름입니다. 자주 발생하는 문제에 대한 일반적인 해결책입니다. 언어마다 다른 관용구가 필요합니다. 한 언어에 문제가있는 것이 다른 언어에 사소한 것일 수 있기 때문입니다. 이런 의미에서 디자인 패턴은 적용되는 언어의 약점을 지적하는 경향이 있습니다.

따라서 현대 동적 언어 (또는 Lisp와 같은 고대 언어)를 더욱 강력하게 만드는 다른 기능을 찾아서 이러한 고전적인 디자인 패턴 중 일부를 무관하게 만들 수 있습니다.


1

디자인 패턴은 특정 문제를 해결하는 방법입니다. 문제가 해결되지 않으면 해결 패턴이 사용되지 않습니다.

사람들은 프로젝트에 디자인 패턴이있는 것이 최선의 방법 인 것처럼 어디에서나 디자인 패턴을 조정하려고합니다. 그것은 다른 길입니다. 팩토리 패턴으로 해결할 수있는 문제점이 있습니까? 시원한. 적응 시키십시오. 코드를 찾지 말고 싱글 톤 (또는 팩토리, 파사드 등)을 구현할 수있는 적절한 장소를 찾으십시오.

아마도 파이썬에는 Java 및 .NET 사용자가 사용할 수없는 자체 디자인 패턴이 있습니까 (이 언어의 특성상)?


1

패턴은 항상 언어에 따라 다릅니다. 대부분의 파이썬 패턴은 GoF에서 정의 된 것과 비슷합니다. 파이썬의 OOP 때문입니다. OOP는 OOP와 다릅니다 (두 언어가 객체를 정의하고 조작을 100 % 동일하게 정의하는 것은 없음).

따라서 일부 패턴은 "있는 그대로"적용 할 수 없으며 의심 할 여지가 없으며 Python에만 의미가있는 패턴도 있습니다.

질문에 정확하게 답하려면 패턴은 필요한 경우에만 필요 합니다. Jan Hudec이 이미 말했듯이 필요하지 않은 경우에는 사용할 필요가 없습니다.

또한 GoF에 언급 된 것보다 훨씬 더 많은 패턴이 있습니다. Wikipedia에서 다른 패턴을보십시오

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