One simple answer to the question "why does this expose implementation?" is that if you have two getters/setters that each return a double and are called X and Y, you are exposing that you've implemented the Point class using [Carthesian Coordinates][1] rather than, say, [Polar Coordinates][2]. Also, giving people access to these X and Y values might lead them to manipulate them in calculations. For example; rather than using Point->distanceTo(otherPoint); They might do something like: distance = sqrt( pow( PointA->getX() - PointB->getX(), 2 ) + pow( PointA->getY() - PointB->getY(), 2 ) ); In addition to the code duplication that will inevitably happen, this makes a second assumption. This formula only works on a flat, rectangular plane. If you're actually representing a hexagon grid for example, then this function is simply wrong. By not exposing how you're implementing a point on a field, you can later change between ways of storing these coordinates *and* you prevent people from trying to be clever with details they shouldn't concern themselves with in the first place. [1]: https://en.wikipedia.org/wiki/Cartesian_coordinate_system [2]: https://en.wikipedia.org/wiki/Polar_coordinate_system