문제

나는 도메인 특정 언어가 등장하고 비즈니스 로직을 처리하는 방식을 어떻게 바꾸는지에 대해 점점 더 많이 듣고 있으며 본 적이 있습니다. Ayende의 블로그 게시물 등을 들 수 있지만 공급자에서 사용하는 방법과 상황에서 비즈니스 논리를 분리하려는 이유를 정확히 이해한 적이 없습니다.

이러한 것들을 사용하는 배경 지식이 있다면 실제 일반인의 용어로 설명할 수 있습니다.

  • DSL 구축이 정확히 무엇을 의미하나요?
  • 어떤 언어를 사용하고 있나요?
  • DSL을 사용하는 것이 적합한 곳은 어디입니까?
  • DSL을 사용하면 어떤 이점이 있나요?
도움이 되었습니까?

해결책

DSL은 시스템 제어의 일부 측면을 다른 사람에게 넘겨야 하는 상황에 적합합니다.저는 이를 규칙 엔진에서 사용했습니다. 여기서는 기술 지식이 부족한 사람들이 특히 워크플로에서 자신을 표현하는 데 더 쉽게 사용할 수 있는 간단한 언어를 만들 수 있습니다.

즉, Java를 배우도록 하는 대신 다음을 수행합니다.

DocumentDAO myDocumentDAO = ServiceLocator.getDocumentDAO();
for (int id : documentIDS) {
Document myDoc = MyDocumentDAO.loadDoc(id);
if (myDoc.getDocumentStatus().equals(DocumentStatus.UNREAD)) {
    ReminderService.sendUnreadReminder(myDoc)
}

다음과 같이 말할 수 있는 DSL을 작성할 수 있습니다.

for (document : documents) {
if (document is unread) {
 document.sendReminder
}

다른 상황도 있지만 기본적으로 매크로 언어를 사용하거나 작업 흐름을 스크립팅하거나 애프터마켓 사용자 정의를 허용하려는 경우 모두 DSL의 후보입니다.

다른 팁

DSL 약자 도메인별 언어 즉.특정 영역의 문제를 해결하기 위해 특별히 설계된 언어입니다.
예를 들어 Markdown(SO에서 게시물을 편집하는 데 사용되는 마크업 언어)은 DSL로 간주될 수 있습니다.

개인적으로 저는 제가 작업하고 있는 거의 모든 대규모 프로젝트에서 DSL을 위한 자리를 찾습니다.대부분의 경우 SQL과 유사한 쿼리 언어가 필요합니다.또 다른 일반적인 사용법은 규칙 기반 시스템입니다. 규칙\조건을 지정하려면 일종의 언어가 필요합니다.

DSL은 전통적인 방법으로 문제를 설명하고 해결하기 어려운 상황에서 의미가 있습니다.

Microsoft Visual Studio를 사용하는 경우 웹 양식, winforms 등의 디자인 화면인 여러 DSL을 이미 사용하고 있는 것입니다.DSL입니다.클래스 디자이너는 또 다른 예입니다.

DSL은 (적어도 이론상으로는) 특정 "도메인"(예:시각적 레이아웃) 더 쉽고, 더 직관적이고, 더 생산적입니다.

DSL을 구축하는 것과 관련하여 Ayende와 같은 사람들이 작성한 것 중 일부는 개발자(또는 최종 사용자)가 응용 프로그램에 "자연 텍스트"를 입력하여 텍스트를 구문 분석하고 일종의 종류를 생성하는 "텍스트 구문 분석" dsls와 관련이 있습니다. 코드 또는 이를 기반으로 한 출력.

어떤 언어든 사용하여 자신만의 DSL을 구축할 수 있습니다.Microsoft Visual Studio에는 많은 확장성 포인트와 패턴 및 사례가 있습니다. "안내 자동화 툴킷" 그리고 비주얼 스튜디오 SDK Visual Studio에 DSL 기능을 추가하는 데 도움이 될 수 있습니다.

DSL은 사용자 정의 언어를 위한 기본 컴파일러입니다.이를 개발하기 위한 좋은 '무료 및 개방형' 도구는 다음에서 사용할 수 있습니다. ANTLR.최근에 나는 이 DSL을 한동안 살펴보았습니다. 상태 기계 언어 새 프로젝트에 사용하십시오.나는 다른 사람이 귀하의 애플리케이션을 사용자 정의할 수 있는 좋은 방법이 될 수 있다는 위의 Tim Howland의 의견에 동의합니다.

참고로 DSL에 관한 책은 Martin Fowler의 시그니처 시리즈의 일부로 준비 중입니다.

시리즈의 다른 책과 동일한 수준의 책이라면 잘 읽어볼 만합니다.

추가 정보 여기

DSL은 단지 화려한 이름일 뿐이며 다양한 의미를 가질 수 있습니다.

  • Rails(Ruby의 일)는 웹 애플리케이션에 관한 특별한 메소드를 추가하고 일부 내장 메소드도 덮어쓰기 때문에 DSL이라고도 불립니다.

  • ANT, Makefile 구문 등DSL이기도 하지만 고유한 구문이 있습니다.이것이 바로 DSL이라고 부르는 것입니다.

이 과대 광고의 한 가지 중요한 측면은 다음과 같습니다.언어 측면에서 애플리케이션을 생각하는 것이 합리적입니다.앱에서 무엇에 대해 이야기하고 싶나요?그러면 다음이 클래스와 메서드가 되어야 합니다.

  1. 문제를 표현할 수 있는 "언어"(이 페이지의 다른 사람들이 제안한 실제 구문 또는 선호하는 언어에 대한 클래스 계층 구조)를 정의하십시오.
  2. 해당 언어로 문제를 해결하십시오.

DSL은 기본적으로 특정 도메인 문제를 해결하기 위해 자신만의 작은 하위 언어를 만듭니다.이는 메소드 체인을 사용하여 해결됩니다.점과 괄호가 선택사항인 언어는 이러한 표현이 더 자연스럽게 보이도록 도와줍니다.빌더 패턴과 유사할 수도 있습니다.DSL은 언어 자체가 아니라 호출을 보다 자명하게 만들기 위해 API에 적용하는 패턴입니다.

한 가지 예가 Guice입니다. Guice 사용자 가이드 http://docs.google.com/View?docid=dd2fhx4z_5df5hw8 인터페이스가 구현에 바인딩되는 방식과 컨텍스트에 대한 자세한 설명이 있습니다.

또 다른 일반적인 예는 쿼리 언어입니다.예를 들어:

NewsDAO.writtenBy("someUser").before("someDate").updateStatus("Deleted")

구현에서 각 메서드가 새 쿼리 개체를 반환하거나 내부적으로 업데이트되는 것을 상상해 보세요.언제든지 모든 행을 가져오기 위해 row()를 사용하거나 여기서 위에서 수행한 것처럼 updateSomeField를 사용하여 체인을 종료할 수 있습니다.둘 다 결과 객체를 반환합니다.

위의 Guice 예제도 살펴보는 것이 좋습니다. 각 호출은 새 옵션이 포함된 새 유형을 반환하기 때문입니다.좋은 IDE를 사용하면 완료할 수 있어 각 지점에 어떤 옵션이 있는지 명확하게 알 수 있습니다.

편집하다:많은 사람들이 DSL을 자체 파서가 있는 새롭고 단순한 단일 목적 언어로 간주하는 것 같습니다.나는 항상 DSL을 작업을 표현하기 위한 규칙으로 메서드 체이닝을 사용하는 것으로 연관시킵니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top