Uważam, że posiadanie takich samych nazw członków jest w tym przypadku złym pomysłem, ponieważ sprawia, że kod jest bardziej podatny na błędy.
Wyobraź sobie scenariusz: masz kilka kartezjańskich punktów: pntA i pntB. Następnie z jakiegoś powodu decydujesz, że powinny być lepiej reprezentowane we współrzędnych biegunowych, i zmieniasz deklarację i konstruktor.
Teraz, jeśli wszystkie twoje operacje były tylko wywołaniami metod, takimi jak:
double distance = pntA.distanceFrom(pntB);
więc wszystko w porządku. Ale co, jeśli użyjesz członków wyraźnie? Porównać
double leftMargin = abs(pntA.x - pntB.x);
double leftMargin = abs(pntA.first - pntB.first);
W pierwszym przypadku kod nie zostanie skompilowany. Natychmiast zobaczysz błąd i będziesz mógł go naprawić. Ale jeśli masz takie same nazwy członków, błąd będzie tylko na poziomie logicznym, znacznie trudniejszy do wykrycia.
Jeśli piszesz w języku nie zorientowanym obiektowo, jeszcze łatwiej jest przekazać niewłaściwą strukturę do funkcji. Co powstrzyma Cię przed napisaniem następującego kodu?
double distance = calculate_distance_polar(cartesianPointA, polarPointB);
Z drugiej strony różne typy danych pozwalają znaleźć błąd podczas kompilacji.