DOT DSL

DOT DSL

보통

지침

도메인 특화 언어(DSL)는 특정 도메인에 최적화된 작은 언어예요. DSL은 목적이 분명하기 때문에, 작성자가 _어떻게_가 아니라 _무엇_을 원하는지 선언할 수 있게 해 줘서 생산성과 이해도를 크게 높여줄 수 있어요.

DSL이 활용되는 대표적인 분야 중 하나는 복잡한 사용자 정의와 설정이에요.

예를 들어 DOT 언어를 사용하면 그래프를 텍스트로 설명할 수 있고, 그러면 Graphviz 도구(예: dot) 중 하나가 이를 그림으로 변환해 줘요. 간단한 그래프는 다음과 같아요.

graph {
    graph [bgcolor="yellow"]
    a [color="red"]
    b [color="blue"]
    a -- b [color="green"]
}

이 내용을 example.dot 파일에 넣고 dot example.dot -T png -o example.png를 실행하면, 노란 배경 위에서 초록색 선으로 연결된 빨간색과 파란색 원이 있는 example.png 이미지가 만들어져요.

Graphviz dot 언어와 비슷한 도메인 특화 언어를 작성해 봐요.

우리가 만드는 DSL은 그래프 데이터 구조를 만드는 데 사용된다는 점에서 Graphviz dot 언어와 비슷해요. 하지만 DOT 언어와 달리, 우리 DSL은 우리 언어에서만 사용하는 내부 DSL이에요.

내부 DSL과 외부 DSL의 차이에 대해 더 알아보세요.

DSL에 대한 설명

이 DSL에서 그래프는 Graph 타입의 객체예요. 이 객체는 다음을 설명하는 하나 이상의 튜플로 이루어진 list를 받아요:

  • attributes
  • Nodes
  • Edges

Node와 Edge의 구현은 dot_dsl.py에 들어 있어요.

DSL이 기대하는 설계와 기대하는 오류 타입, 오류 메시지에 대한 자세한 내용은 dot_dsl_test.py의 테스트 케이스를 살펴봐요.

예외 메시지

때로는 예외를 발생시켜야 할 때가 있어요. 이럴 때는 오류의 원인이 무엇인지 알려 주는 의미 있는 오류 메시지를 항상 함께 넣어야 해요. 그래야 코드를 더 읽기 쉽게 만들고 디버깅에도 큰 도움이 돼요. 오류의 원인이 어떤 타입이라는 걸 아는 상황이라면 내장 오류 타입 중 하나를 발생시켜도 되지만, 그래도 의미 있는 메시지는 함께 넣어야 해요.

이 연습 문제에서는 Graph가 잘못된 경우 TypeError를, Edge나 Node, attribute가 잘못된 경우 ValueError를 "throw"하기 위해 raise 문을 사용해야 해요. exception을 raise하면서 그와 함께 메시지도 넣어야만 테스트를 통과할 수 있어요.

메시지와 함께 오류를 발생시키려면, 메시지를 exception 타입의 인자로 써요:

# Graph is malformed
raise TypeError("Graph data malformed")

# Edge has incorrect values
raise ValueError("EDGE malformed")

출처

Wikipedia링크가 새 창이나 탭에서 열려요
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Python Exercism

DOT DSL 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Python 트랙을 개념 17개연습 문제 146개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.