Immagina una classe LineSegment
che rappresenta un segmento di linea utilizzando due endpoint arbitrari.
Il costruttore dovrebbe lanciare se sono passati due endpoint approssimativamente uguali? Ovviamente ciò richiederebbe un confronto arbitrario a virgola mobile. Ad esempio, prova la distanza euclidea tra gli endpoint è inferiore a ε.
Un vantaggio è che gli utenti non otterranno risposte prive di senso a determinate domande se costruiscono un LineSegment
con rumore in virgola mobile o due punti che "dovrebbero" essere uguali ma divergenti a causa dell'errore nei calcoli in virgola mobile. Ad esempio, sarebbe altrimenti pericoloso se l'utente chiedesse la direzione in cui è stato puntato un segmento di linea.
Uno svantaggio è che ora la classe deve cercare di incapsulare e mantenere questo requisito sullo stato dei due endpoint. Spostare un endpoint di LineSegment
avrebbe il potenziale per lanciare.
Immagina una classe PolyLine
che utilizza questi LineSegment
sotto il cofano. Se l'utente vuole inserire un nuovo punto in PolyLine
, potrebbe lanciare se quel punto si trova all'interno di ε di un altro punto. Un SafeInsert
avrebbe bisogno di cancellare tutti i punti vicini? Gli utenti possono tollerare un SafeInsert
che potenzialmente riduce la dimensione della loro polilinea? Anche l'eliminazione di un punto potrebbe generare, perché potrebbe riunire due punti approssimativamente uguali.
L'alternativa al lancio dei costruttori consiste nel saltare la convalida e affidarsi agli utenti per chiamare un Douglas-Peucker o relativo algoritmo se c'è il rischio che i loro dati LineSegment
o PolyLine
possano fornire risposte irragionevoli. Gli utenti fornirebbero il proprio ε quando usavano questa funzione.
Qualcuno ha familiarità con le implementazioni esistenti di LineSegment
o PolyLine
classi che preferiscono un approccio all'altro?