|
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
|
||||||
Свойства класов - зачем помещать свойство в приват01.04.2012, 18:23. Показов 6926. Ответов 54
Метки нет (Все метки)
Очень часто встречал такие классы
PS. тут ещё мысля возникла, если в Си (не C++, а простой Си) небыло оператора new то получается небыло утечек памяти?
0
|
||||||
| 01.04.2012, 18:23 | |
|
Ответы с готовыми решениями:
54
Зачем нужно свойство @property (assign)
|
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
| 01.04.2012, 18:26 | |
|
0
|
|
|
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
|
|
| 01.04.2012, 18:31 [ТС] | |
|
Спасибо прочитал, но так и не понял в чём преймущество? Ну если не брать тот факт что в метода можно делать всевозможные проверки. Предположим что класс написал я сам и использовать его буду тоже я, что мне даёт такой метод?
0
|
|
|
|
|||||||||||||||||
| 01.04.2012, 19:41 | |||||||||||||||||
|
Вот помню, то ли у Страуструпа, то ли ещё в какой классике был пример класс "сумма чисел" и он выглядел так
Ещё скрывают поля класса-указатели, в которых выделена динамическая память, чтобы она выделялась/удалялась по правилам (например только в конструкторе, деструкторе и при копировании) и никто другой не мог бы создать утечку. Это тоже хорошее дело! Например
Но это не означает, что надо брать идиотскую моду постоянно скрывать всё что нужно и не нужно. Вообще всё! Например класс Vector3D я бы спокойно совершенно объявил так:
Добавлено через 28 минут А вообще часто скрывают поля класса, чтобы следовать концепции "сокрытия реализации". То есть для пользователя класса оставляют открытыми для использования лишь несколько "рычагов воздействия" - методов класса. При этом подразумевается, что создав класс, программист может передать его своим коллегам, или "себе самому" так, что продолжая работу с этим классом можно забыть все сложности структур и алгоритмов скрытых внутри, абстрагироваться от них. Таким образом создавать всё более сложные программы, оперируя простыми понятиями: Например создал класс render3D и его пользователей совершенно не беспокоит DirectX так выводит 3D картинку или OpenGL. Они воздействуют на класс методами "нарисуй то" да "нарисуй сё". При этом изменения внутренних полей класса нам не важно, а мы сосредотачиваемся на более нужных вещах.
1
|
|||||||||||||||||
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
||
| 01.04.2012, 19:59 | ||
|
Добавлено через 3 минуты Kuzia domovenok, опять вы за своё? Начинающим-то хоть голову не забивайте, пусть учатся делать правильно, не всё же время они хеллоуворлды писать будут, в которых нет таких понятий как "расширяемость", "изменение условий задачи" и т.д.
0
|
||
|
|
||
| 01.04.2012, 20:21 | ||
|
И второе, раз уж у меня голова "не тем забита", покажи мне хоть одного автора книг по Си++, который бы советовал "Скрывать все поля класса, вне зависимости от задачи". А то я конечно искренне хочу улучшить своё знание си++, но как-то авторам публикаций больше верю, чем тебе
0
|
||
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
||
| 01.04.2012, 20:37 | ||
|
1
|
||
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
||
| 01.04.2012, 20:39 | ||
|
Kuzia domovenok, ищите моё предыдущее сообщение, когда вы в прошлый раз подняли этот вопрос.
Относительно вашего класса - причина банальна. Если мы захотим хранить вектор в виде массива (например, std::array), чтобы, например, была возможно вернуть сразу все три координаты, то весь код, написанный с использованием предыдущей версии вектора, полетит к чертям.
1
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||
| 01.04.2012, 20:42 | ||
|
0
|
||
|
|
|||
| 01.04.2012, 20:51 | |||
|
Далее, я хочу добавить в класс методы получения модуля этого вектора, операторы скалярного и векторного умножения, векторного сложения и ещё 100500 операций над векторами зачем мне делать его структурой? Да, знаю в С++ структуры могут содержать методы, но в таком виде они мало отличаются от классов. Ну и наконец, я этот пример с вектором не от балды взял, а реально существует куча примеров исходников, в которых авторы не прячут параноидально все поля в public, просто потому что "так модно". (Разумеется имеется в виду не динам.память, о которой я уж сто раз оговорился в теме, а обычное поле, которое бы вызвало тонну ужаса из-за публичности) Ну же! Примеры где?
1
|
|||
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|||
| 01.04.2012, 20:58 | |||
|
0
|
|||
|
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
|
|
| 01.04.2012, 21:06 | |
|
0
|
|
|
|
||
| 01.04.2012, 21:08 | ||
|
Автор, кстати большой сторонник ООП, и всячески использует и наследование и полиморфизм и reference counting в программах делает и.т.д. Но делает это с умом и у него нет параноидального желания писать для каждого поля класса сеттер и геттер. Если поле скрыто - на то есть причина. Вот тот самый его вектор, пример которого я привёл http://sigelengine.googlecode.... vector3d.h Ещё вопросы? Может кто-нибудь возразит аргументированно, чего не хватает в этом конкретном коде, а не станет продолжать "так надо, потому что это хороший тон"
0
|
||
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
||
| 01.04.2012, 21:15 | ||
|
никакого контроля значений не присутствует в продакшене геттерами и сеттерами покрывают чуть более сложные вещи для критического быстродействия это правильный ход, но с точки зрения расширяемости скорее всего нет захоти он добавить какойнить thread-safety и его интерфейс развалится
0
|
||
|
|
||
| 01.04.2012, 21:34 | ||
|
Но скрывать то, что кто угодно может изменить геттером и сеттером - очевидная глупость!
0
|
||
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
| 01.04.2012, 21:47 | |
|
как минимум ТСа это лишит возможности контролировать валидность устанавливаемых значений
(почему бы не сделать A().count = -1; ) с практической же точки зрения так проще отлаживать (при установке значения не через сеттеры отлавливать изменения можно лишь на уровне watchpoint'ов)
0
|
|
|
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
|
||
| 01.04.2012, 22:02 | ||
Сообщение было отмечено как решение
Решение- использование макросов, вместо констант - конструктор копирования не делает ничего, чего бы не сделал генеренный компилятором, не нужен - часть операторов является членами, часть нет, при ни одному из операторов не нужен доступ к закрытой части, причем все свободные операторы зачем-то объявлены друзьями - операторы сравнения возвращают int - почему часть методов делают inplace модификацию объекта (negative), а часть возвращают измененную копию (cross)
4
|
||
| 01.04.2012, 22:12 | |
|
2
|
|
|
|
|
| 01.04.2012, 22:26 | |
|
0
|
|
|
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
|
||
| 01.04.2012, 22:44 | ||
|
0
|
||
| 01.04.2012, 22:44 | |
|
Помогаю со студенческими работами здесь
20
Зачем всегда инкапсулировать переменные в свойства Зачем нужны автоматически реализуемые свойства?
Зачем использовать поля, если есть свойства? Как назначить свойства блоку div через свойство SetAttribute? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|