Skip to content

Commit

Permalink
doc(dsl): removed from design and moved to implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
alemazzo committed Oct 17, 2023
1 parent 6334b54 commit 2722517
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 70 deletions.
68 changes: 0 additions & 68 deletions docs/src/04-design/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,74 +100,6 @@ Il concetto di `Rules` incapsula tutte le regole del modello di gioco che compre

<!--************ MAZZOLI *****************-->

## DSL

Per semplificare la modellazione di un gioco basato sull'engine creato si è scelto di optare per lo sviluppo di un dsl che supportasse la sua creazione in modo dichiarativo.

Il dsl si divide in due parti:

- `PropertiesDSL` che consiste in un core di funzionalità generiche che permettono lo sviluppo di un dsl basato su propietà.
- `GameDSL` che consiste nell'insieme di funzionalità che vengono esposte per la creazione delle regole di un gioco

### PropertiesDSL

![PropertiesDSL](../img/04-design/dsl/properties-dsl.jpg)

Per quanto riguarda il `PropertiesDSL` si è scelto di utilizzare un approccio basato su `Property` che altro non sono che dei wrapper di valori.
Le principali tipologie di `Property` sono:

- `OptionalProperty` che rappresenta una properietà che all'inizio è vuota e può venire settata una volta.
- `MultipleProperty` che rappresenta una properietà che può essere settata più volte e che quindi contiene una lista di valori.

Successivamente per la modifica di tali risorse sono state utilizzate tre entità:

- `PropertySetter` che esponse il metodo `:=` utilizzato per settare il valore di una `Property` in modo dichiarativo.
```scala
property := value
```
- `PropertyBuilder` che permette di creare una `Property` in modo dichiarativo, tramite la sua costruzione. Esso infatti abilita la seguente sintassi:

```scala
property {
...
another {

}
...
}
```

- `ObjectBuilder` che ha la stessa funzionalità del `PropertyBuilder` ma che restituisce l'oggetto creato.

### GameDSL

A questo punto si è implementato quindi il `GameDSL` che consiste in un insieme di funzionalità che permettono la creazione di un gioco in modo dichiarativo sfruttando il `PropertiesDSL`.

#### Dominio GameDSL

![GameDSL Dominio](../img/04-design/dsl/game-dsl-domain.jpg)

Prima di tutto si è definito un insieme di contesti che vanno a definire il dominio del `GameDSL`:

- `GameCtx` che rappresenta il contesto di un gioco, ovvero quello in cui si definiscono le regole di un gioco.
- `PlayersCtx` che rappresenta il contesto dei giocatori, ovvero quello in cui si definiscono le regole relative ai giocatori.
- `PhaseCtx` che rappresenta il contesto di una fase, ovvero quello in cui si definiscono le regole relative ad una fase del gioco.
- `StepCtx` che rappresenta il contesto di uno step, ovvero quello in cui si definiscono le regole relative ad uno step di una fase del gioco.

Ognuno di esse possiede al suo interno l'insieme delle proprietà che ne vanno a definire il comportamente.

#### DSL

![GameDSL](../img/04-design/dsl/game-dsl.jpg)

A questo punto sono state sviluppate l'insieme di funzionalità che permettono la creazione di un gioco in modo dichiarativo.

Esse rispecchino le proprietà contenute all'interno dei vari contest, infatti ognuna delle operazione esposte dal dsl rispecchia una delle properietà del contesto, che viene trasformata in una property dichiarativa da poter usare nel dsl.

Inoltre tali funzionalità sono state strutturate per richiedere dei contesti implicitamente in modo da poter essere utilizzate solo nel contesto corretto.

<!--************ MAZZOLI *****************-->

## ScatanGame

Una volta progettato l'engine di gioco, generico per dominio, si è andati a sviluppare il dominio del gioco di Catan
Expand Down
13 changes: 11 additions & 2 deletions docs/src/05-implementation/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -548,6 +548,13 @@ Una volta creata la libreria per lo sviluppo di DSL ho iniziato a creare il DSL

Prima di tutto ho definito un dominio di contesti contenti tutte le varie proprietà che andranno settate nella dichiarazione delle regole e che quindi infine verranno convertite ad un oggetto di tipo `Rules``

- `GameCtx` che rappresenta il contesto di un gioco, ovvero quello in cui si definiscono le regole di un gioco.
- `PlayersCtx` che rappresenta il contesto dei giocatori, ovvero quello in cui si definiscono le regole relative ai giocatori.
- `PhaseCtx` che rappresenta il contesto di una fase, ovvero quello in cui si definiscono le regole relative ad una fase del gioco.
- `StepCtx` che rappresenta il contesto di uno step, ovvero quello in cui si definiscono le regole relative ad uno step di una fase del gioco.

Ognuno di esse possiede al suo interno l'insieme delle proprietà che ne vanno a definire il comportamente.

```scala
case class GameCtx[State, P, S, A, Player](
phases: MultipleProperty[PhaseCtx[State, P, S, A, Player]] = ...
Expand Down Expand Up @@ -589,9 +596,9 @@ val gameCtx = Game {
}
```

Nella quale la funzione passata prende in input implicitamente il contesto di gioco e può quindi settare le varie proprietà, tramite le operations su quei contesti definiti.
Nella quale la funzione passata prende in input implicitamente il contesto di gioco e può quindi settare le varie proprietà, tramite le operazioni su quei contesti definiti.

Ad esempio le operazioni disponibili sul `GameCtx` sono le seguenti:
Ad esempio le operazioni sul `GameCtx` sono le seguenti:

```scala
object GameCtxOps:
Expand Down Expand Up @@ -623,6 +630,8 @@ object GameCtxOps:

Queste funzionalità hanno quindi lo scopo di esporre le proprietà del contesto preso implicitamente e di permetterne la configurazione in maniera dichiarativa, utilizzando le conversioni implicite della libreria della proprietà.

Quello che si è cercato quindi di emulare sono funzioni in cui è necessario un contesto implicita sopra al quale vengono chiamate operazioni senza la necessità di dover specificare il receiver.

## Luigi Borriello

Per quanto riguarda il mio contributo al progetto, mi sono occupato principalmente delle seguenti parti:
Expand Down

0 comments on commit 2722517

Please sign in to comment.