Tworzenie list DSL w języku Java, część 1: Co to jest język specyficzny dla domeny?

Jeśli kiedykolwiek napisałeś plik makefile lub zaprojektowałeś stronę internetową z CSS, napotkałeś już DSL lub język specyficzny dla domeny. DSL to małe, wyraziste języki programowania zaprojektowane specjalnie do określonych zadań. W tej czteroczęściowej serii Venkat Subramaniam przedstawia koncepcję DSL i ostatecznie pokazuje, jak je zbudować za pomocą Java. W tym pierwszym artykule Venkat wyjaśnia, czym jest DSL i definiuje różnicę między zewnętrznym DSL a wewnętrznym. Następnie wskazuje na niektóre DSL, z których prawdopodobnie korzystasz od lat, być może nawet nie zdając sobie z tego sprawy.

Jeśli zajmowałeś się pisaniem lub nawet używaniem aplikacji, prawdopodobnie spotkałeś już języki specyficzne dla domeny lub DSL - nawet jeśli wtedy nie zdawałeś sobie z tego sprawy. Plik wejściowy słowa kluczowego do aplikacji, która odbiera dane wejściowe, to DSL. Plik konfiguracyjny to DSL. Makefile to DSL używany do określania reguł i zależności na potrzeby budowania aplikacji. Jeśli napisałeś którykolwiek z nich, wykonałeś już pierwsze kroki w tworzeniu języków specyficznych dla domeny.

Słowo język w zdaniu może prowadzić do spodziewać DSL użyłby składni wyrazić pewne semantykę. W przeciwieństwie do języka ogólnego przeznaczenia, takiego jak Java, DSL ma dość ograniczony zakres i możliwości; jak sama nazwa wskazuje, DSL są bardzo skoncentrowane na pewnym typie problemu lub domeny oraz na wyrażaniu wąskiego zestawu rozwiązań w kontekście tego ograniczonego zakresu. I to dobrze - DSL są proste i zwięzłe.

Ok, to jest L; a co z D i S?

Domena słowa w DSL odnosi się do „obszaru lub sfery wiedzy, wpływów lub działalności”. (Więcej informacji można znaleźć w dokumencie Domain-Driven Design autorstwa Erica Evansa). Skupienie się na domenie daje kontekst - logiczną strukturę, w ramach której można rozwijać modele aplikacji.

Słowo specyficzne w DSL daje ci ograniczony kontekst. Pomaga zachować trafność, koncentrację, zwięzłość i wyrazistość.

Prostota ma kluczowe znaczenie dla sukcesu DSL. Osoba zaznajomiona z domeną języka musi ją łatwo zrozumieć. Na przykład, jeśli tworzysz DSL, którego aktuariusze będą używać do wyrażania reguł biznesowych w dziedzinie ubezpieczeń, nie chcesz, aby spędzali dużo czasu na nauce trudnego i skomplikowanego języka. Chcesz, aby skupili się na wyrażaniu szczegółów związanych z ryzykiem ubezpieczeniowym w sposób, który będzie dla nich łatwy do zrozumienia, omówienia, ewolucji i utrzymania. Tworzony dla nich DSL musi być oparty na ich słownictwie, terminach, których używają na co dzień do komunikowania się z rówieśnikami. Chcesz, aby używały podanej przez Ciebie składni, ale powinno im się wydawać, że określają jedynie pewne odrębne reguły.Powinni być w stanie to zrobić bez wrażenia, że ​​naprawdę programują, a nawet używają jakiegoś języka.

Tworzenie dobrego DSL jest jak gotowanie pożywnego posiłku; Tak jak chcesz, aby dzieci jadły warzywa, nie zdając sobie z tego sprawy i nie przejmując się nimi, tak chcesz, aby klienci korzystali z DSL bez martwienia się o jego składnię.

Zwięzłość to kolejna część pisania dobrego DSL, co oznacza wybór składni, która jest zarówno zwięzła, jak i wyrazista. Zwięzłość w granicach rozsądku sprawia, że ​​kod jest łatwiejszy do odczytania i utrzymania. Ekspresja pomaga promować komunikację, zrozumienie i szybkość. Na przykład dla kogoś, kto rozumie mnożenie macierzy, matrixA.multiply(matrixB);jest mniej wyrazisty i zwięzły niż matrixA * matrixB. Pierwsza obejmuje wywoływanie funkcji i używanie nawiasów oraz zastraszający średnik. To ostatnie jest już wyrażeniem, które będzie dość znajome.