Ho creato una sorta di pipeline di dati per trasformare i dati delle coordinate in informazioni più utili.
Ecco la shell della pipeline:
public class PositionPipeline
{
protected List<IPipelineComponent> components;
public PositionPipeline()
{
components = new List<IPipelineComponent>();
}
public PositionPipelineEntity Process(Position position)
{
foreach (var component in components)
{
position = component.Execute(position);
}
return position;
}
public PositionPipeline RegisterComponent(IPipelineComponent component)
{
components.Add(component);
return this;
}
}
Ogni IPipelineComponent
accetta e restituisce lo stesso tipo - a PositionPipelineEntity
. Codice:
public interface IPipelineComponent
{
PositionPipelineEntity Execute(PositionPipelineEntity position);
}
Il PositionPipelineEntity
deve avere molte proprietà, molte che sono non utilizzate in alcuni componenti e richieste in altri . Alcune proprietà saranno ridondanti anche alla fine della pipeline.
Ad esempio, questi componenti potrebbero essere eseguiti:
-
TransformCoordinatesComponent
: analizza i dati di coordinate grezzi in un tipo di coordinate. -
DetermineCountryComponent
: determina e memorizza il codice paese. -
DetermineOnRoadComponent
: determina e memorizza se le coordinate sono su una strada.
Codice:
pipeline
.RegisterComponent(new TransformCoordinatesComponent())
.RegisterComponent(new DetermineCountryComponent())
.RegisterComponent(new DetermineOnRoadComponent());
pipeline.Process(positionPipelineEntity);
Il tipo PositionPipelineEntity
:
public class PositionPipelineEntity
{
// Only relevant to the TransformCoordinatesComponent
public decimal RawCoordinateLatitude { get; set; }
// Only relevant to the TransformCoordinatesComponent
public decimal RawCoordinateLongitude { get; set; }
// Required by all components after TransformCoordinatesComponent
public Coordinate CoordinateLatitude { get; set; }
// Required by all components after TransformCoordinatesComponent
public Coordinate CoordinateLongitude { get; set; }
// Set in DetermineCountryComponent, not required anywhere.
// Requires CoordinateLatitude and CoordinateLongitude (TransformCoordinatesComponent)
public string CountryCode { get; set; }
// Set in DetermineOnRoadComponent, not required anywhere.
// Requires CoordinateLatitude and CoordinateLongitude (TransformCoordinatesComponent)
public bool OnRoad { get; set; }
}
Problemi:
-
Sono molto preoccupato per la dipendenza che un componente ha sulle proprietà. Il modo per risolvere questo sarebbe creare tipi specifici per ciascun componente. Il problema quindi è che non posso incatenarli insieme in questo modo.
-
L'altro problema riguarda l'ordine dei componenti nella pipeline. C'è qualche dipendenza. La struttura attuale non fornisce alcun controllo statico o di runtime per una cosa del genere.
Qualsiasi feedback sarebbe apprezzato.