Инкапсуляция — это идея о том, что вы можете получить доступ к члену данных класса только через методы интерфейса. Результатом использования метода является «скрытие» фактической реализации члена данных, так что вы можете изменить его без необходимости изменять код, который использует этот класс через методы интерфейса (при условии, что вы не меняете способ, которым они определенный).
С другой стороны, если вы не используете методы интерфейса, чтобы скрыть реализацию члена данных, весь ваш код, который его использует, необходимо будет модифицировать перед любым изменением члена данных.
Скажем, у вас есть класс с вектором строк, содержащих список имен. Если вы сделаете этот вектор общедоступным, то все остальные классы смогут решить использовать его напрямую и получить доступ к содержащимся в нем строкам по их индексу в векторе (скажем, индекс действует как ключ для идентификации строки).
Позже вы можете решить, что вам нужна карта для управления всеми этими строками (ваши требования изменились). Вы меняете определение члена данных на карту, и ваш код больше не будет компилироваться. В этом и заключается смысл «практически неизменяемый».
«Правильный» способ управлять этим с помощью инкапсуляции - сделать элемент данных закрытым и определить метод интерфейса, например:
std::string getStringWithKey(int index);
этот метод будет обращаться к вектору в первой реализации и к карте во втором случае. Все это прозрачным образом: код, который использует метод (вместо прямого доступа к элементу данных), не нужно будет модифицировать, поэтому вы можете изменить реализацию элемента данных по своему усмотрению практически без затрат.
Это упрощение, потому что дизайн интерфейсов — дело непростое, и интерфейсы тоже меняются, но я надеюсь, что это поможет прояснить ситуацию.
person
sergio
schedule
02.07.2011