GoF가 디자인 패턴 북을 읽기 시작했습니다. 약간의 개념 차이만으로도 일부 패턴이 매우 유사 해 보입니다.
파이썬과 같은 동적 언어에서는 일부 패턴이 필요하지 않다고 생각합니까 (예 : 동적 기능으로 대체되기 때문에)?
GoF가 디자인 패턴 북을 읽기 시작했습니다. 약간의 개념 차이만으로도 일부 패턴이 매우 유사 해 보입니다.
파이썬과 같은 동적 언어에서는 일부 패턴이 필요하지 않다고 생각합니까 (예 : 동적 기능으로 대체되기 때문에)?
답변:
Peter Norvig는 GOF 책에있는 23 개의 디자인 패턴 중 16 개가 동적 언어에서 보이지 않거나 더 단순 하다는 것을 보여줍니다 (Lisp 및 Dylan에 중점을 둡니다).
Python을 언급 한 이후 Alex Martelli의 주제에 대한 멋진 프레젠테이션 이 있습니다. 파이썬과 관련하여 관용적 파이썬의 6 가지 디자인 패턴을 보여주는 멋진 블로그 게시물이 있습니다.
또한 Python에서 가장 일반적인 디자인 패턴 을 구현하여 다른 사람들이 github 저장소를 유지합니다 .
디자인 패턴이 필요하지 않습니다. 모든 언어로.
나는 디자인 패턴을 읽고 사람들이 그 패턴을 모든 곳에서 사용해야한다고 생각하는 사람들이 작성한 많은 코드를 접하는 경향이 있습니다. 결과적으로 실제 코드는 수많은 인터페이스, 래퍼 및 레이어에 묻히고 읽기가 매우 어렵습니다. 그것은 패턴을 디자인하는 잘못된 접근법입니다.
디자인 패턴은 문제를 겪을 때 유용한 유용한 숙어 레퍼토리를 갖도록 존재합니다. 그러나 문제를 식별하기 전에 어떤 패턴도 적용해서는 안됩니다. 단순하게 유지 바보 는 항상 우수한 통치 원칙이어야합니다.
또한 설계 패턴을 특정 상용구 코드가 아닌 문제를 생각하는 개념으로 생각하는 데 도움이됩니다. 그리고 대부분의 상용구는 Java에 대한 해결 방법으로 무료 기능과 Python, C #, C ++ 등과 같은 대부분의 다른 언어에서 사용하는 표준 함수 객체가 부족합니다.
나는 방문자 패턴을 가지고 있다고 말할 수 있지만 일급 함수가있는 모든 언어에서는 함수를 취하는 함수 일뿐입니다. 팩토리 클래스 대신 일반적으로 팩토리 기능이 있습니다. 인터페이스가 있다고 말할 수도 있지만 다른 구현은 없기 때문에 주석으로 표시된 몇 가지 메소드 일뿐입니다 (물론 파이썬에서는 인터페이스가 항상 주석입니다. 덕 형식입니다). 코드를 생각하는 데 유용한 방법이기 때문에 코드를 패턴을 사용하는 것으로 여전히 말하지만 실제로 필요할 때까지 모든 것을 입력하지는 않습니다.
따라서 모든 패턴을 개념 으로 배우십시오 . 구체적인 구현은 잊어 버리십시오. 구현은 실제 환경에서는 심지어 Java에서도 다양하며 다양해야합니다.
파이썬과 같은 덕형 언어에서는 추상 팩토리 패턴 이 필요하지 않습니다. 실제로 언어에 내장되어 있기 때문입니다.
떠오르는 유일한 것은 싱글 톤 패턴입니다.
파이썬은 모든 것에 클래스를 사용하도록 강요하지 않기 때문에 전역 데이터 구조를 대신 사용할 수 있습니다. 해당 전역 데이터 구조 는 인스턴스에서 관리 할 수 있지만 해당 클래스의 인스턴스화를 제어 할 필요는 없으며 가져 오기시 인스턴스를 작성하여 그대로두면됩니다.
대부분 파이썬의 싱글 톤은 모듈로 대체됩니다. 파이썬의 모듈은 본질적으로 싱글 톤입니다. 파이썬 인터프리터는 한 번만 만듭니다.
Python에서 한 번에 사용했던 Design Patters의 다른 모든 패턴은 Python 표준 라이브러리와 Python 자체에서 그 예를 찾을 수 있습니다.
len
작동 하는지 잘 알고 있습니다. 귀도는 여기서 분명한 선택을했습니다 . 내 요점은 파이썬이 순수한 OOP 언어가 아님을 보여주는 것이다. 실용적인 언어입니다. 그 방법이 마음에 들어요.
디자인 패턴은 언어가 아닌 프로그래머를위한 것입니다. 프로그래머는 문제를 이해하는 데 도움이되는 패턴을 사용하는 경향이 있습니다. 디자인 패턴이 꼭 필요한 것은 아니지만 수행하려는 작업을 단순화하는 데 도움이 될 수 있습니다.
파이썬과 오리 타이핑은 구체적으로 많은 일반적인 패턴과 관행을 끝내고 일부 패턴 (개인 정보, 불변성 등)에 의해 부과 된 많은 제한은 프로그래머가 그것들을 깨지 않기로 동의하는 정도까지만 유지합니다. . 그러나 여전히 프로그래머 가 작동 하는 한 작동합니다. 가상의 벽으로 둘러싸인 경우에도 문은 여전히 문입니다.
파이썬은 "다중 패러다임"언어로 간주됩니다. 원하는 패턴을 사용할 수 있습니다. 이것은 의도적 인 것입니다. 예를 들어, 완전히 불필요하고 약간 인위적이지만 복잡한 클래스 계층 구조를 제공합니다. 그러나 일부 사람들에게는 특정 추상화가 도움이됩니다. 문제가 그것을 요구하기 때문이 아니라 프로그래머가 요구하기 때문입니다. 그래서 당신은 간다.
원본 "디자인 패턴"책은 C ++ 및 스몰 토크와 같은 명령형 객체 지향 언어에 유용한 몇 가지 일반적인 관용구를 문서화하고 명명했습니다. 그러나 스몰 토크는 동적으로 유형이 지정되는 언어이므로 동적으로 문제가 될 수는 없습니다.
그러나 귀하의 질문에 대한 대답은 여전히 "예"입니다. 이러한 디자인 패턴 중 일부는 현대적으로 동적으로 입력되는 언어와 관련이 없습니다. 더 일반적으로,이있을 것이다 다른 특히 여러 다른 언어로 디자인 패턴, 가지 언어.
"디자인 패턴"은 단순히 프로그래밍 관용구의 이름입니다. 자주 발생하는 문제에 대한 일반적인 해결책입니다. 언어마다 다른 관용구가 필요합니다. 한 언어에 문제가있는 것이 다른 언어에 사소한 것일 수 있기 때문입니다. 이런 의미에서 디자인 패턴은 적용되는 언어의 약점을 지적하는 경향이 있습니다.
따라서 현대 동적 언어 (또는 Lisp와 같은 고대 언어)를 더욱 강력하게 만드는 다른 기능을 찾아서 이러한 고전적인 디자인 패턴 중 일부를 무관하게 만들 수 있습니다.
디자인 패턴은 특정 문제를 해결하는 방법입니다. 문제가 해결되지 않으면 해결 패턴이 사용되지 않습니다.
사람들은 프로젝트에 디자인 패턴이있는 것이 최선의 방법 인 것처럼 어디에서나 디자인 패턴을 조정하려고합니다. 그것은 다른 길입니다. 팩토리 패턴으로 해결할 수있는 문제점이 있습니까? 시원한. 적응 시키십시오. 코드를 찾지 말고 싱글 톤 (또는 팩토리, 파사드 등)을 구현할 수있는 적절한 장소를 찾으십시오.
아마도 파이썬에는 Java 및 .NET 사용자가 사용할 수없는 자체 디자인 패턴이 있습니까 (이 언어의 특성상)?
패턴은 항상 언어에 따라 다릅니다. 대부분의 파이썬 패턴은 GoF에서 정의 된 것과 비슷합니다. 파이썬의 OOP 때문입니다. OOP는 OOP와 다릅니다 (두 언어가 객체를 정의하고 조작을 100 % 동일하게 정의하는 것은 없음).
따라서 일부 패턴은 "있는 그대로"적용 할 수 없으며 의심 할 여지가 없으며 Python에만 의미가있는 패턴도 있습니다.
질문에 정확하게 답하려면 패턴은 필요한 경우에만 필요 합니다. Jan Hudec이 이미 말했듯이 필요하지 않은 경우에는 사용할 필요가 없습니다.
또한 GoF에 언급 된 것보다 훨씬 더 많은 패턴이 있습니다. Wikipedia에서 다른 패턴을보십시오