Ho una classe "tracker". Questa classe tiene traccia degli oggetti da una determinata immagine di input. Ma oltre a questo, c'è un altro parametro che corrisponde a un valore utilizzato nella generazione dell'immagine. Il tracker potrebbe voler suggerire un nuovo valore per questo parametro per ottenere risultati migliori alla successiva iterazione. Suggerirebbe questo nuovo valore per ciò che mai genera l'immagine.
Attualmente lo implemento tramite:
struct TrackResults{
double new_scene_generation_coefficient;
std::vector<Track> tracks;
}
class Tracker{
public:
TrackResults update(const Image& image, double scene_generation_coefficient){
// generate tracks and a new_scene_generation_coefficient
// ...
return {new_scene_generation_coefficient, tracks}
}
}
La mia intuizione è che non vogliamo modificare direttamente il valore e vogliamo evitare che il Tracker
dipenda dalla conoscenza di una classe di cui ha solo bisogno di un valore e che potrebbe potenzialmente cambiare. Sento che se ritornassi per riferimento qui, potrei potenzialmente causare un effetto a cascata di qualsiasi cosa che usi il tracker per dipendere da qualcosa che altrimenti non avrebbe bisogno, o passare pericolosamente intorno a un riferimento mutabile.
Non trovo alcun problema in termini di manutenibilità con questo, ma ci sono alcuni problemi ergonomici molto lievi, per esempio, quando voglio le tracce, devo prima passare attraverso TrackResult
oggetto.
Tuttavia sono preoccupato, dato che sembra un odore di codice, i valori nella classe dati non hanno nulla a che fare l'uno con l'altro e non ci sono metodi che userebbero entrambi in tandem. In altri post le persone sostengono che non ci dovrebbero essere classi di dati, dal momento che dovresti essere in grado di spostare le funzioni che lavorano sui membri della classe in un metodo.
Un'altra cosa che dovrei menzionare, è che le tracce vengono mantenute internamente in ogni modo. Le tracce vengono restituite in base al valore per evitare di interferire con la struttura interna della classe da parte di attori esterni (come i logger che esistono nel sistema reale). Questo mi fa pensare che le tracce dovrebbero essere interrogate dopo update
, e new_scene_generation_coefficient
è l'unica cosa che dovrebbe essere restituita. Potenzialmente, tuttavia, ci sono più valori che dovrebbero essere usati per modificare l'oggetto che ha generato Image
in primo luogo, ma almeno questi sono correlati. Un problema con la query di traccia separata dopo l'aggiornamento è che diventa pericoloso per l'utente, in quanto non vi è alcuna garanzia che proveranno a eseguire query direttamente in seguito e che anche se lo fanno, otterranno lo stato dell'elenco di tracce come era quando veniva chiamato update()
. Questo sembra un odore di codice per richiedere a un utente di chiamare prima un altro metodo per utilizzare in questo modo un metodo separato.