Il mio lavoro è quello di refactoring una vecchia libreria per l'elaborazione dei dati vettoriali GIS. La classe principale racchiude una raccolta di profili di costruzione e offre diversi metodi per il controllo della coerenza dei dati. Quelle funzioni di controllo hanno un parametro opzionale che consente di eseguire alcuni processi. Ad esempio:
std::vector<Point> checkIntersections(int process_mode = 0);
Questo metodo verifica se alcuni profili di costruzione si intersecano e restituiscono i punti di intersezione. Ma se si passa un argomento non nullo, il metodo modificherà i contorni per rimuovere l'intersezione.
Penso che sia piuttosto brutto (sul sito di chiamata, un lettore che non ha familiarità con il codice base presumerà che un metodo chiamato checkSomething
esegua solo un controllo e non modifichi i dati) e voglio cambiarlo.
Voglio anche evitare la duplicazione del codice poiché i metodi di controllo e di processo sono per lo più simili.
Quindi stavo pensando a qualcosa di simile:
// a private worker
std::vector<Point> workerIntersections(int process_mode = 0)
{
// it's the equivalent of the current checkIntersections, it may perform
// a process depending on process_mode
}
// public interfaces for check and process
std::vector<Point> checkIntersections() /* const */
{
workerIntersections(0);
}
std::vector<Point> processIntersections(int process_mode /*I have different process modes*/)
{
workerIntersections(process_mode);
}
Ma questo mi costringe a rompere la correttezza const come workerIntersections è un metodo non const.
Come posso separare il controllo e l'elaborazione, evitando la duplicazione del codice e mantenendo la correttezza?