2010-08-05 4 views
5

그래서 메타 프로그래밍 - 런타임에 클래스/객체를 수정하고 새로운 메소드와 속성을 주입 할 수있는 아이디어. 프레임 워크 개발에 좋은 점은 알고 있습니다. Grails와 함께 작업 해 왔으며,이 프레임 워크는 런타임에 클래스에 많은 메소드를 추가합니다. User 객체에는 name 속성이 있고 bamm에는 런타임에 findByName 메서드가 삽입됩니다.메타 프로그래밍, 뭐 좋은데?

  1. 개념이 완전히 개념을 설명 했습니까?
  2. 프레임 워크 개발 이외에 (특정 예제) 다른 점은 무엇입니까?
+2

무엇이 좋나요? 절대적으로 아무것도. – Radu

+1

가능한 중복 http://en.wikipedia.org/wiki/War_(Edwin_Starr_song) – Tom

+0

몇 가지 대답이 지적했듯이 설명이 올바르지 않습니다. 귀하의 설명은 반영 및 측면 지향 프로그래밍 (AOP)을 참조하는 것으로 보입니다. 이 두 언어는 런타임에 언어 기능을 확장합니다. 메타 프로그래밍은 컴파일 타임에 언어의 기능을 확장합니다. 특히 형식 시스템에서 유형을 조작 할 수있는 기능이 확장되었습니다.반대로 Reflection은 런타임에 유형에 대한 조작 기능을 추가합니다. – rwong

답변

3

나에게 메타 프로그래밍은 "프로그램을 작성하는 프로그램"입니다. 이 일반화을 지원하기 때문에

메타 프로그래밍, 재사용을 위해 특히 좋다 : 당신은 특정 패턴에 속하는 개념의 가족을 정의 할 수 있습니다. 그런 다음 변동성을 통해 유사하지만 다른 시나리오에서 해당 개념을 적용 할 수 있습니다. @Sjoerd에서 언급 한 바와 같이

가장 간단한 예는 자바의 getter 및 setter입니다 :

getter 및 setter 잘 정의 된 패턴에 따라 둘 : 게터는 클래스 멤버를 반환하고, 세터는 클래스 멤버의 값을 설정합니다 . 일반적으로 템플릿을이라고하며 특정 패턴을 적용하고 다시 사용할 수 있도록합니다. 템플릿의 작동 방식은 사용되는 메타 프로그래밍/코드 생성 방식에 따라 다릅니다.

게터 또는 설정자가 약간 다른 방식으로 동작하게하려면 템플릿에 매개 변수를 추가 할 수 있습니다. 이것은 변동성입니다. 예를 들어, 설정/가져올 때 추가 처리 코드를 추가하려는 경우 가변 블록 매개 변수로 코드 블록을 추가 할 수 있습니다. 사용자 정의 코드와 생성 된 코드를 혼합하는 것은 까다로울 수 있습니다. ABSE은 현재 사용자 지정 코드를 기본적으로 템플릿 매개 변수로 지원한다는 것을 알고있는 유일한 MDSD 접근 방식입니다.

1

메타 프로그래밍은 런타임에 메소드를 추가하는 것이 아니라 컴파일시 자동으로 코드를 생성 할 수도 있습니다. 나는. 코드 생성 코드.

  • 웹 서비스 (즉, 방법은 WSDL에 정의 된, 당신은 실제 객체의 메소드 인 것처럼 그들을 사용하려는) 상용구 코드를 방지
  • . 예를 들어 Java에서는 getter와 setter를 사용해야하지만 대부분의 속성에 대해 자동으로 만들 수 있습니다.
+0

나는 metaprogramming이 특히 실행 시간 문제라고 생각했다. 흥미 롭 군. 보일러 플레이트 코드에 대한 좋은 지적 (Grails도 이것을 수행함). 다른 건 없니? – hvgotcodes

+0

@hvgotcodes : 메타 프로그래밍은 주로 컴파일 타임에 관한 것입니다. 런타임 사용은 실제로 런타임 사용과 비교하여 매우 드뭅니다. f.e. 참조. C++ 템플릿 (많은 사람들이 인정하기를 좋아하지만 metaprogramming의 한 종류입니다) : STL을 사용하는 모든 프로그램 ... 많은 것들이 있습니다. – liori

0

메타 프로그래밍은 코드베이스에 물건을 추가하는 용도로만 사용되지 않습니다. 또한 코드베이스를 연결하지 않고도 현재 처리중인 코드를 설명하는 데 사용할 수 있습니다. mediator pattern과 같은 "다 대다 관계"의 응용 프로그램에서 매우 유용 할 수 있습니다.

관련 문제