window.pipedriveLeadboosterConfig = { bas: 'leadbooster-chat.pipedrive.com', företagId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2, } ;(funktion () { var w = fönster if (w.LeadBooster) { console.warn('LeadBooster finns redan') } annars { w.LeadBooster = { q: [], on: funktion (n, h) { this.q.push({ t: "o", n: n, h: h }) }, trigger: funktion (n) { this.q.push({ t: 't', n: n }) }, } } })() Ruby domänspecifikt språk - The Codest
Codest
  • Om oss
  • Tjänster
    • Utveckling av programvara
      • Frontend-utveckling
      • Backend-utveckling
    • Staff Augmentation
      • Frontend-utvecklare
      • Backend-utvecklare
      • Dataingenjörer
      • Ingenjörer inom molntjänster
      • QA-ingenjörer
      • Övriga
    • Det rådgivande
      • Revision och rådgivning
  • Industrier
    • Fintech & bankverksamhet
    • E-commerce
    • Adtech
    • Hälsoteknik
    • Tillverkning
    • Logistik
    • Fordon
    • IOT
  • Värde för
    • VD OCH KONCERNCHEF
    • CTO
    • Leveranschef
  • Vårt team
  • Fallstudier
  • Vet hur
    • Blogg
    • Möten
    • Webbinarier
    • Resurser
Karriär Ta kontakt med oss
  • Om oss
  • Tjänster
    • Utveckling av programvara
      • Frontend-utveckling
      • Backend-utveckling
    • Staff Augmentation
      • Frontend-utvecklare
      • Backend-utvecklare
      • Dataingenjörer
      • Ingenjörer inom molntjänster
      • QA-ingenjörer
      • Övriga
    • Det rådgivande
      • Revision och rådgivning
  • Värde för
    • VD OCH KONCERNCHEF
    • CTO
    • Leveranschef
  • Vårt team
  • Fallstudier
  • Vet hur
    • Blogg
    • Möten
    • Webbinarier
    • Resurser
Karriär Ta kontakt med oss
Pil tillbaka GÅ TILLBAKA
2018-12-14
Utveckling av programvara

Ruby domänspecifikt språk

Bartlomiej Maziarz

Enligt definitionen är DSL (Domain Specific Language) ett datorspråk som är specialiserat på en viss applikationsdomän. Det innebär att det är utvecklat för att tillgodose specifika behov.

Genom att läsa den här artikeln kommer du att lära dig vad DSL är och vad det har gemensamt med Ruby.

DSL, säg välkommen!

Enligt definitionen är DSL (Domain Specific Language) ett datorspråk som är specialiserat på en viss applikationsdomän. Det innebär att det är utvecklat för att tillgodose specifika behov. Det finns två typer av DSL:

  • En extern DSL som kräver sin egen syntaxparser. Ett välkänt exempel kan vara SQL-språket - det gör det möjligt att interagera med en databas på ett språk som databasen inte skapades på.

  • En intern DSL som inte har någon egen syntax utan istället använder syntaxen i ett visst programmeringsspråk.

Som du förmodligen kan gissa kommer vi att hålla fokus på den andra DSL-typen.

Vad gör den?

Genom att använda Ruby-metaprogrammering kan du skapa ditt eget minispråk. Metaprogrammering är en programmeringsteknik som gör det möjligt att skriva en kod dynamiskt vid körning (i farten). Du kanske inte är medveten om detta, men du använder förmodligen många olika DSL:er varje dag. För att förstå vad en DSL kan göra, låt oss ta en titt på några exempel nedan - alla dessa har ett gemensamt element, men kan du peka ut det?

Rails routing

Rails.application.routes.draw do
rot till: 'hem#index'

resurser :användare do
get :search, on: :samling
slut
slut
```

Varje person som någonsin har använt Rails känner till en config/routes.rb fil där vi definierar applikationsvägar (mappning mellan HTTP-verb och URL:er till kontrolleråtgärder). Men har du någonsin undrat hur det fungerar? I själva verket är det bara Ruby-kod.

Fabrik Bot

 FactoryBot.define do
   fabrik :användare do
     företag
     sequence(:email) { |i| "user_#{i}@test.com" }
     sequence(:first_name) { |i| "Användare #{i}" }
     last_name "Test
     roll "chef
   slut
 slut

Att skriva tester kräver ofta att man tillverkar objekt. För att undvika slöseri med tid skulle det därför vara en riktigt bra idé att förenkla processen så mycket som möjligt. Det är vad Fabriksrobot does - nyckelord som är lätta att komma ihåg och ett sätt att beskriva ett objekt.

Sinatra

kräver 'sinatra/base'

klassen WebApplication < Sinatra::Base
get '/' do
'Hej världen'
slut
slut
```

Sinatra är ett ramverk som gör det möjligt att skapa webbapplikationer från grunden. Kan det vara enklare att definiera request method, path och response?

Andra DSL-exempel kan vara Rake, RSpec eller Aktivt register. Det viktigaste inslaget i varje DSL är användning av block.

Byggtid

Dags att förstå vad som döljer sig under huven och hur implementeringen kan se ut.

Låt oss anta att vi har en applikation som lagrar data om olika produkter. Vi vill utöka den genom att ge möjlighet att importera data från en användardefinierad fil. Filen ska också göra det möjligt att beräkna värden dynamiskt om det behövs. För att uppnå det bestämmer vi oss för att skapa DSL.

En enkel Produkt representation kan ha följande attribut (produkt.rb):

 klass Produkt
   attr_accessor :namn, :beskrivning, :pris
 slut

Istället för att använda en riktig databas kommer vi bara att simulera dess arbete (falsk_produktdatabas.rb):

 klass FakeProductsDatabase
   def self.store(produkt)
     puts [produkt.namn, produkt.beskrivning, produkt.pris].join(' - ')
   slut
 slut

Nu ska vi skapa en klass som ska ansvara för att läsa och hantera filer som innehåller produktdata (dsl/data_importör.rb):

modul Dsl
klass DataImporterare
modul Syntax
def add_product(&block)
FakeProductsDatabase.store produkt(&block)
slut

  privat

  def produkt(&block)
    ProductBuilder.new.tap { |b| b.instance_eval(&block) }.product
  slut
slut

include Syntax

def self.import_data(fil_ sökväg)
  new.instance_eval File.read(file_path)
slut

slut
slut
```

Klassen har en metod som heter import_data som förväntar sig en filsökväg som argument. Filen läses och resultatet skickas till instans_eval metod som anropas på klassinstansen. Vad är det den gör? Den utvärderar strängen som en Ruby-kod inom instansens kontext. Detta innebär att själv kommer att vara en instans av DataImporterare klass. Tack vare detta faktum kan vi definiera önskad syntax/nyckelord (för bättre läsbarhet definieras syntaxen som en modul). När lägg till_produkt metoden kallas det block som ges för metoden utvärderas av Produktbyggare instans som bygger Produkt instans. Produktbyggare klassen beskrivs nedan (dsl/produkt_byggare.rb):

modul Dsl
klass ProduktByggare
ATTRIBUTES = %i[namn beskrivning pris].freeze

attr_läsare :produkt

def initialisera
  @produkt = Produkt.ny
slut

ATTRIBUTES.each do |attribut|
  define_method(attribute) do |arg = nil, &block|
    värde = block.is_a?(Proc) ? block.call : arg
    product.public_send("#{attribut}=", värde)
  slut
slut

slut
slut
```

Klassen definierar syntax som är tillåten inom lägg till_produkt block. Med lite metaprogrammering läggs det till metoder som tilldelar värden till produktattribut. Dessa metoder har också stöd för att skicka ett block i stället för ett direkt värde, så att ett värde kan beräknas vid körning. Med hjälp av attributläsaren kan vi få en byggd produkt i slutet.

Låt oss nu lägga till importskriptet (import_jobb.rb):

kravrelaterad 'dsl/dataimporter'
Kravrelaterat 'dsl/produktbyggare'
Kravrelaterat 'fakeproductsdatabase'
kravrelativ 'produkt'

Dsl::DataImporter.import_data(ARGV[0])
```

Och slutligen - med hjälp av vår DSL - en fil med produktdata (dataset.rb):

```ruby
add_product do
namn 'Laddare'
beskrivning 'Livräddande'
pris 19,99
slut

add_product do
namn 'Bilvrak'
description { "Havererade vid #{Time.now.strftime('%F %T')}" }
pris 0,01
slut

add_product do
namn 'Lockpick'
beskrivning "Dörrar ska inte stängas
pris 7,50
slut
```

För att importera data behöver vi bara utföra ett kommando:

 ruby import_job.rb dataset.rb

Och resultatet är...

 Laddare - Livräddande - 19,99
 Bilvrak - Förlist 2018-12-09 09:47:42 - 0,01
 Lockpick - Dörrar ska inte stängas - 7,5

...framgång!

Slutsats

Genom att titta på alla exemplen ovan är det inte svårt att se vilka möjligheter DSL erbjuder. DSL gör det möjligt att förenkla vissa rutinoperationer genom att dölja all nödvändig logik bakom och endast exponera de viktigaste nyckelorden för användaren. Det ger en högre abstraktionsnivå och flexibla användningsmöjligheter (vilket är särskilt värdefullt när det gäller återanvändbarhet). Å andra sidan, om du lägger till DSL i din projekt bör alltid övervägas noga - en implementation som använder metaprogrammering är definitivt mycket svårare att förstå och underhålla. Dessutom kräver den en solid testsvit på grund av sin dynamik. Att dokumentera DSL gör det lättare att förstå, så det är definitivt värt att göra. Även om det kan vara givande att implementera sin egen DSL är det bra att komma ihåg att det måste löna sig.

Blev du intresserad av ämnet? Om så är fallet, låt oss veta - vi kommer att berätta om DSL som vi nyligen har skapat för att uppfylla kraven i ett av våra projekt.

Relaterade artiklar

Utveckling av programvara

Bygg framtidssäkrade webbappar: Insikter från The Codest:s expertteam

Upptäck hur The Codest utmärker sig genom att skapa skalbara, interaktiva webbapplikationer med banbrytande teknik som ger sömlösa användarupplevelser på alla plattformar. Läs om hur vår expertis driver digital omvandling och affärsutveckling...

DEKODEST
Utveckling av programvara

Topp 10 Lettlandsbaserade mjukvaruutvecklingsföretag

Läs mer om Lettlands främsta mjukvaruutvecklingsföretag och deras innovativa lösningar i vår senaste artikel. Upptäck hur dessa teknikledare kan hjälpa till att lyfta ditt företag.

thecodest
Lösningar för företag och uppskalningsföretag

Java Software Development Essentials: En guide till framgångsrik outsourcing

Utforska denna viktiga guide om framgångsrik outsourcing av Java-programvaruutveckling för att förbättra effektiviteten, få tillgång till expertis och driva projektframgång med The Codest.

thecodest
Utveckling av programvara

Den ultimata guiden till outsourcing i Polen

Den kraftiga ökningen av outsourcing i Polen drivs av ekonomiska, utbildningsmässiga och tekniska framsteg, vilket främjar IT-tillväxt och ett företagsvänligt klimat.

TheCodest
Lösningar för företag och uppskalningsföretag

Den kompletta guiden till verktyg och tekniker för IT-revision

IT-revisioner säkerställer säkra, effektiva och kompatibla system. Läs mer om hur viktiga de är genom att läsa hela artikeln.

Codest
Jakub Jakubowicz CTO och medgrundare

Prenumerera på vår kunskapsbas och håll dig uppdaterad om expertisen från IT-sektorn.

    Om oss

    The Codest - Internationellt mjukvaruutvecklingsföretag med teknikhubbar i Polen.

    Förenade kungariket - Huvudkontor

    • Kontor 303B, 182-184 High Street North E6 2JA
      London, England

    Polen - Lokala tekniknav

    • Fabryczna Office Park, Aleja
      Pokoju 18, 31-564 Kraków
    • Brain Embassy, Konstruktorska
      11, 02-673 Warszawa, Polen

      Codest

    • Hem
    • Om oss
    • Tjänster
    • Fallstudier
    • Vet hur
    • Karriär
    • Ordbok

      Tjänster

    • Det rådgivande
    • Utveckling av programvara
    • Backend-utveckling
    • Frontend-utveckling
    • Staff Augmentation
    • Backend-utvecklare
    • Ingenjörer inom molntjänster
    • Dataingenjörer
    • Övriga
    • QA-ingenjörer

      Resurser

    • Fakta och myter om att samarbeta med en extern partner för mjukvaruutveckling
    • Från USA till Europa: Varför väljer amerikanska startup-företag att flytta till Europa?
    • Jämförelse av Tech Offshore Development Hubs: Tech Offshore Europa (Polen), ASEAN (Filippinerna), Eurasien (Turkiet)
    • Vilka är de största utmaningarna för CTO:er och CIO:er?
    • Codest
    • Codest
    • Codest
    • Privacy policy
    • Användarvillkor för webbplatsen

    Copyright © 2025 av The Codest. Alla rättigheter reserverade.

    sv_SESwedish
    en_USEnglish de_DEGerman da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian jaJapanese ko_KRKorean es_ESSpanish nl_NLDutch etEstonian elGreek sv_SESwedish