Следует понимать, что создание приватного std::vector
- это только половина истории, когда дело доходит до хорошей инкапсуляции.Например, если у вас есть:
class MyClass {
public:
// Constructors, other member functions, etc.
int getIntAt(int index) const;
private:
std::vector<int> myInts_;
};
... тогда, возможно, это не лучше, чем просто сделать myInts_
публичным.В любом случае клиенты будут писать код, используя MyClass
, что зависит от того факта, что базовое представление требует использования std::vector
.Это означает, что в будущем, если вы решите, что более эффективная реализация будет использовать std::list
вместо:
class MyClass {
public:
// Constructors, other member functions, etc.
int getIntAt(int index) const; // whoops!
private:
std::list<int> myInts_;
};
... теперь у вас есть проблема.Поскольку вы не можете получить доступ к std::list
по индексу, вам придется либо избавиться от getIntAt
, либо реализовать getIntAt
с помощью цикла.Ни один из вариантов не хорош;в первом случае у вас теперь есть клиенты с кодом, который не компилируется.Во втором случае теперь у вас есть клиенты с кодом, который просто без вывода сообщений стал менее эффективным.
Это опасность раскрытия любых открытых функций-членов, которые являются специфическими для вашего выбора реализации.При проектировании интерфейса вашего класса важно помнить о гибкости и будущем обслуживании.Есть несколько способов сделать это с вашим конкретным примером;см. ответ Mooing Duck об одном таком интерфейсе, который предоставляет итераторы.
Или, если вы хотите максимизировать удобочитаемость кода, вы можете разработать интерфейс на основе логического представления MyClass
;в вашем случае змея:
class MyClass {
public:
// Constructors, etc.
void addToHead(int value);
void addToTail(int value);
void removeFromHead();
void removeFromTail();
private:
// implementation details which the client shouldn't care about
};
Это предлагает абстракцию объекта змея в вашей программе, а упрощенный интерфейс дает вам гибкость, чтобы выбрать любую реализацию, которая подходит вам лучше всего.И если возникает такая ситуация, вы всегда можете изменить эту реализацию, не нарушая клиентский код.