Un servizio è un oggetto a cui viene attribuito un nome .
Ha un determinato tipo , che in base all'oggetto può essere:
I nomi e i valori dei parametri sono rappresentati come stringhe.
Un collaboratore può a sua volta avere collaboratori.
ServiceDescriptor è la classe che rappresenta la descrizione testuale di un servizio, contenente i campi:
public class ServiceDescriptor {
public final String name;
public final Map<String, String> configuration;
public final Map<String, ServiceDescriptor> collaborators;
}
{
name: "dataMapper",
configuration: {
inputFile: "src/main/resources/file.csv",
outputFile: "target/generated-sources/file.json"
}, collaborators: {
reader: {
name: csv",
configuration: {
skipBlankLines: "true"
}
}, writer: {
name: "json"
}
}
}
Un servizio viene istanziato attraverso una factory .
public interface ServiceFactory<S> {
S create(ServiceDescriptor service);
}
public interface Context {
<S> S generate(Class<S> serviceType, ServiceDescriptor service);
<S> Map<String, ServiceFactory<S>> load(Class<S> serviceType);
}
public class ActivationFunctionConfiguration {
public ActivationFunction tanh() {
return new HyperbolicTangent();
}
public ActivationFunction logistic() {
return new LogisticFunction();
}
public ActivationFunction scale(
@Role("inner") ActivationFunction inner,
@Parameter("scale") String scale) {
return new Scale(inner, Double.parseDouble(scale));
}
}
Implementazione diretta di una factory.
public class ScaleFactory implements ServiceFactory<ActivationFunction> {
private final Context context;
public ActivationFunction create(ServiceDescriptor service) {
return new Scale(
context.create(service.collaborators.get("inner"),
Double.parseDouble(service.configuration.get("scale"));
}
}
Context context = new ConfigurationContext(Arrays.asList(
new ActivationFunctionConfiguration()
).iterator());
ServiceDescriptor scaledTanh = new ServiceDescriptor(
"scale",
Collections.singletonMap("scale", "1.15"),
Collections.singletonMap("inner", new ServiceDescriptor(
"tanh",
Collections.emptyMap(),
Collections.emptyMap())));
ActivationFunction function = context
.generate(ActivationFunction.class, scaledTanh);
public class ActivationFunctionConfiguration implements Configuration { ... }
Iterable<Configuration> configurations = ServiceLoader
.load(Configuration.class);
Context context = new ConfigurationContext(configurations.iterator());
<configuration>
<trainingMethod>
<name>batchBackPropagation</name>
<configuration>
<learningRate>0.1</learningRate>
<momentum>0.1</momentum>
<tolerance>0.01</tolerance>
</configuration>
<collaborators>
<logger>
<name>maven</name>
</logger>
</collaborators>
</trainingMethod>
</configuration>