DOT DSL

DOT DSL

中級

説明

ドメイン固有言語(DSL)とは、特定の領域に特化した小さな言語です。DSLは対象が絞られているので、_どうやって_ではなく_何を_したいのかを書き手が宣言できるようになり、生産性や理解度に大きな影響を与えることができます。

DSLが活用されている分野の1つに、複雑なカスタマイズや設定があります。

たとえば、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型のオブジェクトです。これは、次のものを表す1つ以上のタプルからなるlistを受け取ります。

  • 属性
  • Nodes
  • Edges

NodeとEdgeの実装はdot_dsl.pyに用意されています。

DSLが期待する設計や、想定されているエラーの型とメッセージについて詳しくは、dot_dsl_test.pyのテストケースを見てみましょう。

例外のメッセージ

ときには、例外を発生させる必要があります。その際は、エラーの原因が何であるかを示す意味のあるエラーメッセージを必ず含めるようにしましょう。これにより、コードが読みやすくなり、デバッグもずっと楽になります。エラーの原因がある特定の型になるとわかっている場合は、組み込みのエラーの型から1つを選んで発生させてもかまいませんが、その場合も意味のあるメッセージを含めてください。

この演習では、raise文を使って、Graphが不正な場合はTypeErrorを、Edge、Node、またはattributeが不正な場合はValueErrorを「投げる」必要があります。テストが通るのは、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に登録すれば、17個のコンセプト146個の演習、そして本物の人間によるメンタリングとともに、Pythonを学んでマスターできます。すべて無料です。