Skip to content

Commit f8ef778

Browse files
leonardolLeonardo Lisanti
and
Leonardo Lisanti
authored
translation: translation of abstract document pattern to Italian (#2646)
Co-authored-by: Leonardo Lisanti <[email protected]>
1 parent c02853d commit f8ef778

File tree

1 file changed

+197
-0
lines changed

1 file changed

+197
-0
lines changed

Diff for: localization/it/abstract-document/README.md

+197
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
---
2+
title: Abstract Document
3+
category: Structural
4+
language: it
5+
tag:
6+
- Extensibility
7+
---
8+
9+
## Intento
10+
11+
Il design pattern "Abstract Document" è un design pattern strutturale che mira a fornire un modo coerente per gestire strutture dati gerarchiche e ad albero, definendo un'interfaccia comune per vari tipi di documenti.
12+
13+
## Spiegazione
14+
15+
Il pattern Abstract Document consente di gestire proprietà aggiuntive e non statiche. Questo pattern utilizza il concetto di trait per consentire la sicurezza dei tipi e separare le proprietà delle diverse classi in un insieme di interfacce.
16+
17+
Esempio del mondo reale
18+
19+
> Prendiamo ad esempio un'auto composta da diverse parti. Tuttavia, non sappiamo se l'auto ha tutte le parti o solo alcune di esse. Le nostre auto sono dinamiche ed estremamente flessibili.
20+
21+
In parole semplici
22+
23+
> Il pattern Abstract Document permette di associare proprietà agli oggetti senza che gli oggetti ne siano a conoscenza.
24+
25+
Wikipedia dice
26+
27+
> Un design pattern strutturale orientato agli oggetti per organizzare gli oggetti in archivi chiave-valore con
28+
> tipizzazione debole ed esporre i dati utilizzando viste tipizzate. Lo scopo del pattern è ottenere un alto grado di
29+
> flessibilità tra i componenti in un linguaggio fortemente tipizzato in cui nuove proprietà possono essere aggiunte
30+
> all'albero degli oggetti al volo, senza perdere il supporto della sicurezza dei tipi. Il pattern fa uso di trait per
31+
> separare diverse proprietà di una classe in diverse interfacce. Il termine "documento" è ispirato dai database
32+
> orientati ai documenti. _(Testo tradotto dalla voce Abstract Document Pattern da Wikipedia in lingua inglese)._
33+
34+
**Esempio di codice**
35+
36+
Per prima cosa definiamo le classi di base `Document` e `AbstractDocument`. Essenzialmente, queste classi fanno sì che l'oggetto contenga una mappa di proprietà e una qualunque quantità di oggetti figlio.
37+
38+
```java
39+
public interface Document {
40+
41+
Void put(String key, Object value);
42+
43+
Object get(String key);
44+
45+
<T> Stream<T> children(String key, Function<Map<String, Object>, T> constructor);
46+
}
47+
48+
public abstract class AbstractDocument implements Document {
49+
50+
private final Map<String, Object> properties;
51+
52+
protected AbstractDocument(Map<String, Object> properties) {
53+
Objects.requireNonNull(properties, "properties map is required");
54+
this.properties = properties;
55+
}
56+
57+
@Override
58+
public Void put(String key, Object value) {
59+
properties.put(key, value);
60+
return null;
61+
}
62+
63+
@Override
64+
public Object get(String key) {
65+
return properties.get(key);
66+
}
67+
68+
@Override
69+
public <T> Stream<T> children(String key, Function<Map<String, Object>, T> constructor) {
70+
return Stream.ofNullable(get(key))
71+
.filter(Objects::nonNull)
72+
.map(el -> (List<Map<String, Object>>) el)
73+
.findAny()
74+
.stream()
75+
.flatMap(Collection::stream)
76+
.map(constructor);
77+
}
78+
...
79+
}
80+
```
81+
Successivamente definiamo un enum `Property` e un insieme di interfacce per tipo, prezzo, modello e parti. Questo ci permette di creare interfacce dall'aspetto statico per la nostra classe `Car`.
82+
83+
```java
84+
public enum Property {
85+
86+
PARTS, TYPE, PRICE, MODEL
87+
}
88+
89+
public interface HasType extends Document {
90+
91+
default Optional<String> getType() {
92+
return Optional.ofNullable((String) get(Property.TYPE.toString()));
93+
}
94+
}
95+
96+
public interface HasPrice extends Document {
97+
98+
default Optional<Number> getPrice() {
99+
return Optional.ofNullable((Number) get(Property.PRICE.toString()));
100+
}
101+
}
102+
public interface HasModel extends Document {
103+
104+
default Optional<String> getModel() {
105+
return Optional.ofNullable((String) get(Property.MODEL.toString()));
106+
}
107+
}
108+
109+
public interface HasParts extends Document {
110+
111+
default Stream<Part> getParts() {
112+
return children(Property.PARTS.toString(), Part::new);
113+
}
114+
}
115+
```
116+
117+
Ora siamo pronti per introdurre la classe `Car`.
118+
119+
```java
120+
public class Car extends AbstractDocument implements HasModel, HasPrice, HasParts {
121+
122+
public Car(Map<String, Object> properties) {
123+
super(properties);
124+
}
125+
}
126+
```
127+
128+
E infine, costruiamo e usiamo la classe `Car` in un esempio completo.
129+
130+
```java
131+
LOGGER.info("Constructing parts and car");
132+
133+
var wheelProperties = Map.of(
134+
Property.TYPE.toString(), "wheel",
135+
Property.MODEL.toString(), "15C",
136+
Property.PRICE.toString(), 100L);
137+
138+
var doorProperties = Map.of(
139+
Property.TYPE.toString(), "door",
140+
Property.MODEL.toString(), "Lambo",
141+
Property.PRICE.toString(), 300L);
142+
143+
var carProperties = Map.of(
144+
Property.MODEL.toString(), "300SL",
145+
Property.PRICE.toString(), 10000L,
146+
Property.PARTS.toString(), List.of(wheelProperties, doorProperties));
147+
148+
var car = new Car(carProperties);
149+
150+
LOGGER.info("Here is our car:");
151+
LOGGER.info("-> model: {}", car.getModel().orElseThrow());
152+
LOGGER.info("-> price: {}", car.getPrice().orElseThrow());
153+
LOGGER.info("-> parts: ");
154+
car.getParts().forEach(p -> LOGGER.info("\t{}/{}/{}",
155+
p.getType().orElse(null),
156+
p.getModel().orElse(null),
157+
p.getPrice().orElse(null))
158+
);
159+
160+
// Constructing parts and car
161+
// Here is our car:
162+
// model: 300SL
163+
// price: 10000
164+
// parts:
165+
// wheel/15C/100
166+
// door/Lambo/300
167+
```
168+
169+
## Diagramma delle classi
170+
171+
![alt text](../../../abstract-document/etc/abstract-document.png "Abstract Document Traits and Domain")
172+
173+
## Applicabilità
174+
175+
Questo pattern è particolarmente utile in scenari in cui si hanno diversi tipi di documenti che condividono alcune proprietà o comportamenti comuni, ma hanno anche proprietà o comportamenti unici specifici per i rispettivi tipi. Ecco alcuni scenari in cui il pattern Abstract Document può essere applicabile:
176+
177+
* Sistemi di Gestione dei Contenuti (CMS): In un CMS, potresti avere vari tipi di contenuti, come articoli, immagini, video, ecc. Ogni tipo di contenuto potrebbe condividere attributi comuni come la data di creazione, l'autore e i tag, ma potrebbe anche avere attributi specifici come le dimensioni dell'immagine per le immagini o la durata del video per i video.
178+
179+
* File System: Se stai progettando un file system in cui è necessario gestire diversi tipi di file, come documenti, immagini, file audio e directory, il pattern Abstract Document può aiutare a fornire un modo coerente per accedere agli attributi come la dimensione del file, la data di creazione, ecc., consentendo allo stesso tempo attributi specifici come la risoluzione dell'immagine o la durata dell'audio.
180+
181+
* Sistemi di E-commerce: Una piattaforma di e-commerce potrebbe avere diversi tipi di prodotti, come prodotti fisici, download digitali e abbonamenti. Ogni tipo potrebbe condividere attributi comuni come il nome, il prezzo e la descrizione, ma avere attributi unici come il peso di spedizione per i prodotti fisici o il link di download per i prodotti digitali.
182+
183+
* Sistemi di Gestione delle Cartelle Cliniche: Nel settore sanitario, le cartelle cliniche dei pazienti potrebbero includere vari tipi di dati come dati demografici, storia clinica, risultati dei test e prescrizioni. Il pattern Abstract Document può aiutare a gestire attributi condivisi come l'ID del paziente e la data di nascita, consentendo allo stesso tempo di gestire attributi specializzati come i risultati dei test o le prescrizioni.
184+
185+
* Gestione delle Configurazioni: Quando si tratta di impostazioni di configurazione per applicazioni software, possono esserci diversi tipi di elementi di configurazione, ciascuno con il proprio insieme di attributi. Il pattern Abstract Document può essere utilizzato per gestire questi elementi di configurazione, garantendo un modo coerente per accedere e manipolare i loro attributi.
186+
187+
* Piattaforme Educative: I sistemi educativi potrebbero avere vari tipi di materiali didattici come contenuti basati su testo, video, quiz e compiti. Attributi comuni come il titolo, l'autore e la data di pubblicazione possono essere condivisi, mentre attributi unici come la durata del video o le scadenze degli esercizi possono essere specifici per ciascun tipo.
188+
189+
* Strumenti di Gestione dei Progetti: Nelle applicazioni di gestione dei progetti, potresti avere diversi tipi di attività come attività specifiche, fasi e problemi. Il pattern Abstract Document potrebbe essere utilizzato per gestire attributi generali come il nome dell'attività specifica e l'assegnatario, consentendo allo stesso tempo attributi specifici come la data della fase o la priorità del problema.
190+
191+
L'idea chiave alla base del design pattern Abstract Document è fornire un modo flessibile ed estensibile per gestire diversi tipi di documenti o entità con attributi comuni e distinti. Definendo un'interfaccia comune e implementandola in vari tipi di documenti, è possibile ottenere un approccio più organizzato e coerente alla gestione di strutture dati complesse.
192+
193+
## Collegamenti esterni
194+
195+
* [Wikipedia: Abstract Document Pattern](https://en.wikipedia.org/wiki/Abstract_Document_Pattern)
196+
* [Martin Fowler: Dealing with properties](http://martinfowler.com/apsupp/properties.pdf)
197+
* [Pattern-Oriented Software Architecture Volume 4: A Pattern Language for Distributed Computing (v. 4)](https://www.amazon.com/gp/product/0470059028/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=javadesignpat-20&creative=9325&linkCode=as2&creativeASIN=0470059028&linkId=e3aacaea7017258acf184f9f3283b492)

0 commit comments

Comments
 (0)