Хотелось поделиться
сабжевой статьёй Люка Палмера, в которой он противопоставляет инкапсуляции абстракцию (в пользу последней).
Здравствуйте, Курилка, Вы писали:
К>Хотелось поделиться сабжевой статьёй Люка Палмера, в которой он противопоставляет инкапсуляции абстракцию (в пользу последней).
Не понял зачем они их противопоставляет. Инкапсуляция — средство создания абстракции, как и полиморфизм. Фактически все что он показал что инкапсуляция без полиморфизма не создает абстракции. Еще он говорит что классическое ООП (как в Simula) обладает довольно слабым полиморфизмом, поэтому не всегда пригодно для создания хороших абстракций.
Здравствуйте, Курилка, Вы писали:
К>Хотелось поделиться сабжевой статьёй Люка Палмера, в которой он противопоставляет инкапсуляции абстракцию (в пользу последней).
Имхо, товарищ путает теплое с мягким.
Вот простейший класс массива на С++:
template <class T>
class Array
{
private: //!!!
T* buf_;
std::size_t size_;
public:
//....
};
buf_ и size_ должны быть когерентны.
Если не закрыть buf_ и size_, то пользовательский код может взять и изменить buf_ так, что он начнет указывать в совершенно левое место.
Или он может взять и увеличить size_ вдвое, хотя buf_ не указывает на буфер такого размера.
Иными словами, инкапсуляция помогает сохранять инварианты, которые иначе сохранить невозможно.
В данном случае инвариант такой: "buf_
всегда указывает на буфер, размер которого равен size_".
Как его "абстракция" поможет от защититься от нарушения инварианта, я не представляю, если честно.
Имхо, тут только инкапсуляция может помочь.