4 / 4 / 1
Регистрация: 20.04.2011
Сообщений: 141
|
|
1 | |
Нужны ли геттеры/сеттеры в чистом си?05.12.2014, 15:45. Показов 3531. Ответов 34
Метки нет (Все метки)
0
|
05.12.2014, 15:45 | |
Ответы с готовыми решениями:
34
Нужны ли геттеры и сеттеры Оставлять ли геттеры-сеттеры если они не нужны Как работают геттеры и сеттеры и зачем они нужны? Геттеры и сеттеры |
Guardian of Asgaard
377 / 319 / 197
Регистрация: 11.11.2013
Сообщений: 1,046
|
|
05.12.2014, 15:49 | 2 |
Инкапсуляция в чистом Си отсутствует, а значит геттеров и сеттеров в нём не существует. Они только в С++.
0
|
4 / 4 / 1
Регистрация: 20.04.2011
Сообщений: 141
|
|
05.12.2014, 15:51 [ТС] | 3 |
В теории да.
А если для написания проекта должен использоваться именно язык Си, но потребовалась инкапсуляция какой-то локальной переменной? А какие еще полезные функции могут выполнять Гет-Сет методы, кроме возвращения переменной и проверки валидности ее значения?
0
|
Модератор
12460 / 7484 / 1754
Регистрация: 25.07.2009
Сообщений: 13,763
|
||||||||||||||||
05.12.2014, 16:07 | 4 | |||||||||||||||
tiger(), сеттеры могут понадобиться, если нужно проверять значение, присваиваемое полю структуры. Но обязать пользователя устанавливать поля структур исключительно с их помощью - задача нетривиальная, и не уверен, что вообще решаемая. В С напрочь отсутствуют такие понятия, как инкапсуляция данных и прочие заморочки из ООП. Геттер (вернее функция его напоминающая) может пригодиться, когда нужно не просто возвращать какое-то поле структуры, а производить над возвращаемым значением какие-то действия. Но опять же ничто не помешает просто поля объекта структуры прочитать.
Другой вариант: number_keeper.h
1
|
Guardian of Asgaard
377 / 319 / 197
Регистрация: 11.11.2013
Сообщений: 1,046
|
|
05.12.2014, 16:07 | 5 |
Геттеры только возвращают значение, а в Сеттерах помимо присвоения значения и проверки валидности можно, например, добавить условие, что если мы присвоим значение а > 999, то b = 0;
0
|
4 / 4 / 1
Регистрация: 20.04.2011
Сообщений: 141
|
|
05.12.2014, 16:11 [ТС] | 6 |
А было бы 100% равнозначно этому коду объявить number не static, а extern? Тогда бы она была доступна вне main
0
|
Ушел с форума
|
|
05.12.2014, 16:14 | 7 |
Ну я бы не сказал, что все так однозначно. Можно ведь дать пользователю
какой-нибудь <void *> (идиома "opaque handle") и пускай работает со структурой через него. А объявления самой структуры он может и не видеть.
0
|
Модератор
12460 / 7484 / 1754
Регистрация: 25.07.2009
Сообщений: 13,763
|
|
05.12.2014, 16:15 | 8 |
Нет. Это разные модификаторы, и назначение у них разное. Если переменную number объявить, как extern, оно и не скомпилируется, т.к. просто не найдёт, где под эту переменную место выделено. static же в данном случае ограничивает область видимости текущим модулем.
0
|
4 / 4 / 1
Регистрация: 20.04.2011
Сообщений: 141
|
|
05.12.2014, 16:19 [ТС] | 9 |
Я имел ввиду конечно не просто заменить static словом extern, а пользоваться данной переменной либо как static и читать с помощью "геттера" либо объявить в другом модуле ее как extern и иметь прямой доступ.
0
|
Модератор
12460 / 7484 / 1754
Регистрация: 25.07.2009
Сообщений: 13,763
|
|
05.12.2014, 16:23 | 10 |
Убежденный, ну можно, конечно, и собственно сам факт наличия объекта какой-то структуры скрыть от пользователя - "дали тебе набор функций - пользуйся!" Но опять же код получится весьма незаурядный, а потому нужна очень веская причина, чтобы такие танцы на С вытанцовывать...
Добавлено через 3 минуты Ещё раз: если внутри модуля переменная объявлена, как static, в другом модуле сослаться на неё с помощью объявления extern не получится - всё равно не найдётся.
0
|
05.12.2014, 16:25 | 11 |
Объявление static аналогично private в C++, при этом файлы (как единицы компиляции) будут аналогами классов. Инициализацию и финализацию (взамен конструкторов и деструкторов) придется огранизовать самостоятельно.
0
|
4 / 4 / 1
Регистрация: 20.04.2011
Сообщений: 141
|
|
05.12.2014, 16:26 [ТС] | 12 |
Еще раз. Вопрос.
Абсолютно одинаковы два следующих подхода или есть тот который все-таки чем-то лучше? 1 подход. В одном модуле объявить переменную static. Достучаться до нее из другого модуля с помощью getter-функции. 2 подход. В одном модуле объявить локальную переменную. В другом модуле объявить ее как extern. Обращаться к ней напрямую.
0
|
Модератор
12460 / 7484 / 1754
Регистрация: 25.07.2009
Сообщений: 13,763
|
|
05.12.2014, 16:29 | 13 |
Как они могут быть абсолютно одинаковыми, если во втором случае Вы практически получаете доступ к самой переменной и можете устанавливать для неё любое значение? Накроется вся эта как бы инкапсуляция...
0
|
4 / 4 / 1
Регистрация: 20.04.2011
Сообщений: 141
|
|
05.12.2014, 16:36 [ТС] | 15 |
Согласен. Хотел подчеркнуть что не STATIC
Добавлено через 2 минуты А нужна ли она? В си?
0
|
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
|
|||||||||||||||||||||
05.12.2014, 18:10 | 17 | ||||||||||||||||||||
Сообщение было отмечено easybudda как решение
Решение
Че, серьезно?
Да ты шутишь? Добавлено через 6 минут Не обязательно. Сеттеры нужны тогда, когда логика изменения состояния объекта чуть сложнее, чем простая запись нового значения. Например, имеем объект "Термометр", хотим изменить температуру, на выбор 3 единицы измерения - K(ельвины), C(ельсии), F(аренгейты). Естественно значение храним в одной переменной (например в кельвинах, т.к. единица системы Си), но если присвоить ей напрямую значение в фаренгейтах, получится херня. Поэтому заводи сеттер, который принимает температуру в фаренгейтах и преобразует ее в кельвины, прежде чем записать в поле. Другой пример -- GUI, совйства, паттерн Наблюдатель и т.п. Так что "проверка значения" -- это лишь один из юз-кейсов и далеко не самый важный.
2
|
Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
05.12.2014, 21:04 | 19 |
Маленький вопросец. А какой смысл в инкапсуляции? Я вот вижу несколько (иерархию) смыслов.
1. Не дать ошибиться себе в большом проекте. 2. Избежать конфликтов в групповом дружественном проекте. 3. Не дать подсидеть себя в проекте, где каждый участник готов другому сделать бяку (такие проекты, ИМХО, обречены на провал, хотя можно представить себе ситуацию, где в учебном смысле они полезны. Типа - ведь дальше будешь жить с волками - учись выть) 4. Скрыть свою библиотеку (и данные!) от потенциальных пользователей, ибо дай им доступ - они такого наваяют... 5. Это мое нау-хау, и - руки прочь! Возможно, есть и другие смыслы, которые я пропустил, но пока остановимся на этом. 1 и 2 легко решаются договором. Нарушителю делают предупреждение(2), затем гонят взашей. В случае 1 предлагается суицид. Ситуации 3-5 сложнее. Но уверяю вас, что на чистом Си все это можно. Несколько сложнее, чем на плюсах. ибо он специально на это дело заточен, но можно. Один из вариантов. Модуль обслуживающий некоторую структуру (struct) создает при запросе внутри себя экземпляр этой структуры (malloc). А запросившему дает Id. И внешний может оперировать только этим Id и запросами (функциями). Структуру он не знает, полей не видит. А исходники ты положил под подушку. Чем не инкапсуляция? Кстати, Винда по этому пути и пошла. На чистом Си (пардон, сначала на паскале)
0
|
05.12.2014, 22:09 | 20 |
Чем выше забор, тем лучше соседи
Можете думать об этом как о водонепроницаемых переборках. Инкапсуляция позволяет более гибкое, чем в C управление пространством имен (иерархией видимости) и повышает живучесть, благодаря более строгим проверкам на этапе компиляции. Обфускацмя в Windows (opacue data types) имеет иные цели.
1
|
05.12.2014, 22:09 | |
05.12.2014, 22:09 | |
Помогаю со студенческими работами здесь
20
Геттеры и сеттеры Геттеры и Сеттеры Геттеры и сеттеры Классы (сеттеры и геттеры) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |