Я перечитала книгу "Эта странная жизнь" про ученого Любищева по ссылке Яны Франк. Ее поразило в нем то, что он записывал все, что делал за весь день в часах и минутах. А меня удивило, что для каждой книги(большой и умной) он писал конспект и критику. Я попробую тоже конспектировать книги по программированию, что я сейчас читаю. Не знаю, насколько меня хватит и насколько это будет полезно.
Итак, сейчас я читаю "Совершенный код" Макконнелла.
За сегодня я читала главы по инкапсуляции из раздела "Качественные интерфейсы классов".
"Без инкапсуляции абстракция обычно разрушается" - эта цитата определяет главный принцип сокрытия данных. Инкапсуляция - один из принципов управления сложностью проекта.
Автор предлагает несколько принципов, позволяющих добиться сокрытия методов и данных классов.
Итак, сейчас я читаю "Совершенный код" Макконнелла.
За сегодня я читала главы по инкапсуляции из раздела "Качественные интерфейсы классов".
"Без инкапсуляции абстракция обычно разрушается" - эта цитата определяет главный принцип сокрытия данных. Инкапсуляция - один из принципов управления сложностью проекта.
Автор предлагает несколько принципов, позволяющих добиться сокрытия методов и данных классов.
- Минимизировать доступность классов и их членов.
- Не предоставлять прямой доступ к данным-членам, а только к методам доступа к данным - с этим пунктом связано у меня больше всего ляпов в моих бывших и настоящих программах. В классах, занимающихся расчетами, обычно очень много данных, которые являются результатом работы. Например, в программе "Mittens". Делать к ним методы доступа я поленилась. А по данному принципу это было необходимо. Хотя, я до сих пор не хорошо понимаю, как можно программы расчетов чего-либо сделать полностью ОО. Мне кажется, не зря до сих пор большинство расчетов остались на фортране.
- Не включать в интерфейс класса детали реализации. В книге есть интересный пример для С++, как скрыть реализацию в заголовочном файле.class A{public: Aresult Funk() const; ...private: AEmplementation *a_emplementation;}В классе AEmplementation находится тот код, который не должен быть доступен классу, использующему класс А.
- Не делайте предположений о том, как класс будут использовать его клиенты. Все, что нужно, должно быть видно из интерфейса. Если какие-то значения нельзя указывать, то проверку значений не нужно отдавать классам клиентам.
- Избегайте использования дружественных классов. Я уже не помню точно, как их делают, т.к. ими не пользовалась. Автор указывает шаблон State(Состояние), как дисциплинированное использование таких классов. Шаблон не знаю. Нужно будет посмотреть потом.
- Не делать метод открытым только потому, что он использует открытые методы, посмотреть, укладывается ли он в абстракцию этого класса.
- Ценить легкость чтения кода выше, чем легкость его написания. Золотые слова! Можно их писать на мониторе, когда лениво печатать.
- Очень осторожно относится к семантическим (смысловым) нарушениям инкапсуляции.
- Остерегаться слишком жесткого сопряжения.
- Минимизировать доступность классов и их членов.
- Избегать дружественных классов
- Делать данные базового класса закрытыми, а не защищенными, чтобы наследники были меньше сопряжены с базовым.
- не включать данные-члены в открытый интерфейс класса.
- остерегаться семантических нарушений инкапсуляции.
- соблюдать "правило деметры" - А знает о Б, но не знает о том, какие методы Б вызывает.
Комментариев нет:
Отправить комментарий