Страницы

Поиск по вопросам

понедельник, 9 декабря 2019 г.

Плохо ли использовать публичные переменные класса?

#cpp #code_style


Изучаю С++. Важна скорость. Стоит ли писать методы для одного лишь изменения\получения
переменой встроенного типа? Пользовательского типа? Компилятор сообразит? Или пихнуть
в паблик и обращаться напрямую?

Во всех "уроках" и книгах для совсем новичков все делают через методы, но непонятно,
для наглядности или что бы колено цело было?
    


Ответы

Ответ 1



Это сделано для соблюдения принципа инкапсуляции в ООП, т.е. скрытия деталей реализации класса от потребителя класса. В большинстве случаев, данные класса имеют прямое отношение к конкретным деталям реализации и требуют контроля со стороны разработчика по установке этих данных для соблюдения инвариантов класса. Т.е. значения должны быть установлены таким образом, что бы класс мог корректно работать. Представь ситуацию, в которой твое поле требует установки не просто любого значения, а конкретных валидных значений (т.е. соблюдения каких-то предусловий). В таких ситуациях отдавать установку значений на откуп пользователя твоего класса было бы опрометчиво: class Rectangle { private: int _width; int _height; public: void setWidth(int width) { if (width > 0) _width = width; ... } }; В данном примере, установка ширины прямоугольника и проверка предусловий (ширина не может быть нулевой или отрицательной) и, как следствие, соблюдения инварианта класса (не может быть прямоугольника с отрицательной или нулевой шириной) прямая обязанность класса Rectangle, так как пользователь может ничего не знать о внутреннем устройстве вашего класса и устанавливать любые значения, в том числе некорректные.

Ответ 2



Это сделано не только из соблюдения принципа инкапсуляции. Допустим, у вас класс Прямоугольник с его параметрами x₁, y₁, x₂, y₂. Если объекты сперва создаются, а только потом используются без изменений (такое бывает часто), нет проблем, можете присвоить значения свойствам напрямую. В относительно новом языке TypeScript, если я ничего не путаю, свойства даже могут задаваться в интерфейсах. ООП же подразумевает задачи со сложными связями между объектами. Это значит, например, что ваш прямоугольник уже нарисован где-то в объекте класса Полотно. Что даст простое изменение свойства? Ничего. Прямоугольник должен быть перерисован при изменении свойства.

Комментариев нет:

Отправить комментарий