3

Martin Fowlers のテキストのスタイルで流暢なインターフェースをいじっていますが、それらが記述している文法が文脈自由なのか規則的なのか疑問に思っています。私はこのようなインターフェースについて話している:

var car = new Car();
car.Configure().MakeCar.With.Wheels(4).And.Engine.Using.Petrol;

私がやろうとしているのは、それらを生成できるプログラムを書くことです。現在は文脈自由文法の入力が必要ですが、これをソースコードアプリケーションに変換するのに少し苦労しているようです。各「端末」メソッドの結果を事前に知る必要があるため、「スタック」の状態を知ることができないため、通常の文法にしか到達できないというのが答えだと思います。

私が今持っているものは機能しますが、特定の文法にバグがあります。

編集:私は通常の文法を使用しました。コードはオープンソースであり、誰かがそれをいじりたいと思っている場合は現在動作しています。https://github.com/Dervall/Snout

4

1 に答える 1

2

任意の時点でのオプションのセットは、その時点でクラスで使用可能なメソッドによって決定されます。そのメソッドによって返されるクラスによって、次の一連のメソッドが決まります。

したがって、チェーンを生成する文法の規則は、開始記号がクラスであり、記号がメソッドであり、非終端記号がメソッドによって返されるクラスである正しい規則文法です。

class Car:
    configure: Configurator

class Configurator:
    with: Configurator // noise method
    and: Configurator // noise method
    wheels: int -> Configurator
    windows: int -> WindowDetails

class WindowDetails:
    transparent -> Configurator
    tinted -> Configurator

メソッドの引数 (int) を無視:

Car -> "configure" Configurator
Configurator -> "with" Configurator
Configurator -> "and" Configurator
Configurator -> "wheels" Configurator
Configurator -> "windows" WindowDetails
WindowDetails -> "transparent" Configurator
WindowDetails -> "tinted" Configurator

しかし、これで捉えきれないのは、車輪 (車輪の数) に対する引数です。異なる整数引数が異なるクラスにつながる可能性があるため、通常の文法ではそれを処理できません (たとえば、"(2)" の後には Configurator または WindowDetails がありますか?):

Configurator -> "wheels" Integer
Configurator -> "windows" Integer
Integer -> ?

それはあなたが望むものに依存します。メソッドの連鎖は通常の文法で記述できます。ただし、通常の文法では、メソッドに渡される引数を記述することもできません。影響する。

文脈自由文法の複雑さを追加することで引数を処理できます。これは、次のようなことができるからです。

Configurator -> "wheels" Integer Configurator
Configurator -> "windows" Integer WindowDetails

これには、整数引数の後に正しく続行するために必要な追加情報があります。

: 上記は、メソッド名がすべてのクラスで一意であることを前提としています。同じメソッド名を持つ2つの異なるクラスがある場合、明らかに問題が発生します(私は願っています) (そして、「with」や「and」などを使用している場合、これはそれほどまれではないかもしれません....)

于 2012-03-25T19:14:06.213 に答える