Credo che avere lo stesso nome membro sia una cattiva idea in questo caso, perché rende il codice più incline agli errori.
Immagina lo scenario: hai un paio di punti cartesiani: pntA e pntB. Poi decidi, per qualche ragione, che dovrebbero essere meglio rappresentati in coordinate polari e cambiare la dichiarazione e il costruttore.
Ora, se tutte le tue operazioni fossero solo chiamate di metodi come:
double distance = pntA.distanceFrom(pntB);
allora stai bene. Ma cosa succede se hai usato i membri esplicitamente? Confronta
double leftMargin = abs(pntA.x - pntB.x);
double leftMargin = abs(pntA.first - pntB.first);
Nel primo caso, il codice non verrà compilato. Vedrai immediatamente l'errore e sarai in grado di risolverlo. Ma se si hanno gli stessi nomi dei membri, l'errore sarà solo a livello logico, molto più difficile da rilevare.
Se scrivi in un linguaggio non orientato agli oggetti, è ancora più semplice passare la struttura sbagliata alla funzione. Cosa ti impedisce di scrivere il seguente codice?
double distance = calculate_distance_polar(cartesianPointA, polarPointB);
Diversi tipi di dati, d'altra parte, ti consentirebbero di trovare l'errore durante la compilazione.