În industria dezvoltării de software, problemele și rezolvările variază, dar adesea se poate observa o oarecare repetiție a lor, lucru care cauzează frustrare programatorilor. De aceea, programatorii au venit cu câteva abordări generice ca design patterns și soluții arhitecturale (arhitectural solutions). Însă chiar și în aceste cazuri repetarea aceleiași soluții arhitecturale consumă timp și creează nemulțumire. În acest context, câțiva programatori au venit cu o nouă soluție din zona Domain-Specific Language - o cale de a defini noi limbaje de programare care se concentrează pe rezolvarea unei probleme bine definite dintr-un anumit domeniu și de o mărime mică, realizând astfel dezvoltarea mai ușoară.
Un Domain-Specific Language sau (DSL) este un limbaj de programare care vizează o problemă specifică sau, cu alte cuvinte, este un limbaj care este aplicabil unui domeniu particular.
În general, multe dintre soluțiile software sunt dezvoltate folosind un limbaj de programare general (general-purpose language) precum Java, C#, C++ etc.. Pe de altă parte, un DSL este strâns legat de un anumit domeniu de aplicație, de aceea, se bazează pe o abstractizare foarte bună a problemei. În multe situații este mai ușoară folosirea unui DSL, deoarece acesta modelează foarte bine problema și toate regulile afacerii făcând astfel dezvoltarea soluției mai ușor de atins și mai puțin predispusă la erori.
Conceptul de Domain-Specific Language a fost creat pe baza observației că multe dintre problemele întâlnite în cadrul dezvoltării aplicațiilor software pot fi rezolvate mai simplu prin proiectarea unui limbaj cu scop bine definit. Un mic exemplu este "găsirea aparițiilor unui model construit dintr-un set de caractere în cadrul unui text". Pentru rezolvarea acestei probleme simple, a fost creat un limbaj cu un scop special, bine definit, cunoscut de către toți programatorii ca "expresii regulare" (regular expressions).
O modalitate de rezolvare a problemelor similare este definirea unui Domain-Specific Language în locul unui limbaj de programare general. Unul dintre avantajele folosirii DSL este faptul că se poate defini o structură bună de termeni și acțiuni pentru o anumită clasă de probleme. În continuare, vom prezenta cât de multe forme de DSL putem găsi sau implementa.
Similar cu alte limbaje de programare, Domain-Specific Languages pot fi găsite sub forme multiple. În funcție de problema care trebuie rezolvată, putem folosi un DSL sub formă de text sau sub o formă grafică/vizuală.
Să vedem mai întâi cum arată un limbaj textual. Așa cum spune și denumirea, un DSL textual este un text care are definite cuvinte cheie (keywords) și o foarte bună structură pentru a rezolva o problemă de domeniu. Textul este scris de o persoană, apoi este analizat și transformat după un algoritm și reguli definite astfel încât să devină un artefact (artifact). Artefactul (care poate fi de la o bucată de cod până la o întreagă aplicație) poate fi folosit drept soluție finală pentru problemă sau în continuare în alte procese de dezvoltare.
Un exemplu de DSL textual este Gherkin, care este util pentru definirea testelor funcționale. Are o sintaxă foarte flexibilă care îl face să arate ca textul normal. Practic, programatorii, analiștii și clienții pot sta împreună la masă și defini scenarii de testare. Aceste scenarii vor fi apoi executate ca teste pentru a verifica dacă software-ul dezvoltat îndeplinește așteptările lor.
Aici este modul în care putem defini așteptările pentru retragerea de bani de la un ATM:
Scenario: Verify withdraw at the ATM works correctly
Given John has 500$ on his account
When John ask to withdraw 200$
And John inserts the correct PIN
Then 200$ are dispensed by the ATM
And John has 300$ on his account
Exemplu preluat de pe https://tomassetti.me/domain-specific-languages/
Un alt DSL foarte cunoscut este SQL, care este un limbaj utilizat pentru a defini cum sunt adăugate, modificate sau extrase datele dintr-o bază de date relațională. Aici este un exemplu cum putem extrage date dintr-o tabelă numită Books:
SELECT [Id], [Title], [Author], [Publisher],
[Description] FROM [BookStore].[dbo].[Books]
Celălalt mod de definire a unui DSL este folosirea unei forme vizuale, prin care se înțelege că problema este definită sub o formă vizuală, în multe cazuri ca diferite figuri geometrice. Atât forma textuală cât și cea grafică au avantaje și dezavantaje, dar fiecare dintre ele poate să fie folosită pentru o categorie specifică de probleme.
Limbajele grafice au totuși mai multe avantaje decât cele textuale pentru că oferă o reprezentare vizuală a domeniului problemei sub forma unor diagrame care pot fi înțelese mai ușor, dar fiecare persoană poate să prefere o formă sau alta a unui DSL.
Reprezentarea textuală este preferată de unele persoane pentru că poate să fie scrisă foarte repede și pentru momentul când vor să calculeze diferențele dintre două fișiere.
Reprezentarea vizuală este mai bună datorită rezultatului, care este de regulă, o diagramă. Aceasta este mai utilă atunci când îți dorești o imagine de ansamblu asupra problemei reprezentate de limbaj. De asemenea, este o cale mai bună de a vedea relațiile dintre entitățile problemei.
Fiecare dintre cele două forme de DSL au argumente pro și contra, dar în final ambele au un scop comun - definirea unui limbaj care să facă rezolvarea unei probleme mai rapidă.
Folosirea DSL-urilor poate să aducă o mulțime de beneficii. Unul dintre cele mai importante și evidente avantaje este înlocuirea unei proporții însemnate de cod într-un limbaj generic, cu o formă de domain-specific language. Din momentul în care limbajul pentru un anumit aspect al dezvoltării este definit, munca devine mai eficientă datorită faptului că nu mai este nevoie de intervenție manuală.
Un alt beneficiu al folosirii DSL este calitatea sporită a produsului livrat, care constă în mai puține defecte, o arhitectură mai bună și o mentenabilitate crescută.
Un avantaj important este și faptul că validarea implementării obținute devine mai ușoară - deoarece aspectele specifice domeniului sunt neclintite, revizuirea manuală și validarea devin mai eficiente.
Nu mai puțin important în acest proces este faptul că experții în domeniu pot fi implicați mai direct. DSL-urile ale căror domenii, abstracte și notații sunt în strânsă concordanță cu modul de exprimare a experților de domeniu (non-programatori) permit o integrare foarte bună între dezvoltatori și experții domeniului.
Domain-Specific Languages sunt limbaje proiectate și implementate pentru un domeniu particular de aplicație. Aceste limbaje ajută la implementarea de soluții pentru domeniul respectiv prin abstractizarea problemei pentru a simplifica soluția.
Acestea au două forme principale: o formă textuală care este, în esență, un text cu o semantică bine definită și o formă vizuală / grafică reprezentată de elemente vizuale bine alese (reprezentative).
Avem de asemenea avantaje multiple prin utilizarea acestui tip de limbaje: datorită faptului că acestea se bazează pe un model de domeniu foarte bun, procesul de dezvoltare este îmbunătățit. Practic, reducerea timpului de rezolvare a unei probleme și reducerea numărului de bug-uri în îmbunătățirea colaborării globale între dezvoltatori și experți în domenii, DSL-urile reprezintă o opțiune excelentă pentru a modela procesele de implementare.
Eric Evans, Domain-Driven Design: Tackling Complexity in the Heart of Software, Addison Wesley, 2003.
Stuart Kent, Steve Cook, Domain-specific development with Visual studio DSL tools, Addison-Wesley Professional, 2007.
de Bálint Ákos
de Andrei Oneț
de Raul Boldea
de Ioana Varga