4 / 4 / 1
Регистрация: 20.04.2011
Сообщений: 141
1

Нужны ли геттеры/сеттеры в чистом си?

05.12.2014, 15:45. Показов 3507. Ответов 34
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть ли пример ситуации, когда могут понадобиться геттеры и сеттеры в чистом си?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.12.2014, 15:45
Ответы с готовыми решениями:

Нужны ли геттеры и сеттеры
Переделываю программку с Qt C++ на python и там доступ к всем переменным через геттеры и сеттеры...

Оставлять ли геттеры-сеттеры если они не нужны
Заметил у себя привычку всегда генерировать геттеры-сеттеры к полям. В большинстве случаев они даже...

Как работают геттеры и сеттеры и зачем они нужны?
Не понимаю как они работают и зачем они нужны. Можно примеры и объяснения пожалуйста. Понял, что...

Геттеры и сеттеры
Всем привет , решал задачу с learn.js Решил ее, но до конца не разобрался почем в...

34
Вездепух
Эксперт CЭксперт С++
11653 / 6336 / 1719
Регистрация: 18.10.2014
Сообщений: 15,990
05.12.2014, 22:34 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от tiger() Посмотреть сообщение
Есть ли пример ситуации, когда могут понадобиться геттеры и сеттеры в чистом си?
Разумеется. Я не понимаю, откуда может даже возникнуть такой вопрос.

Задача геттеров и сеттеров - отделить интерфейс от реализации. Никаких противопоказаний этому в С нет.

Меня удивляет тот факт, что некоторые из выступивших привязывают понятия геттера/сеттера к неким "переменным". Вся задача, вся идея геттеров/сеттеров заключается именно и только в том, чтобы скрывать от вызывающего кода факт существования (или несуществования) такой переменной. Никто не знает, обращается ли геттер/сеттер к некоей "переменой" или делает что-то совсем другое.

Это принцип, разумеется, совершенно языконезависим. Т.е. вопроса о "нужности" геттеров/сеттеров в С просто не сущесвует.
0
Диссидент
Эксперт C
27704 / 17320 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
05.12.2014, 22:38 22
Цитата Сообщение от gazlan Посмотреть сообщение
Чем выше забор, тем лучше соседи
Это хорошая мудрость. Ее можно по разному переиначивать. Чем лучше соседи - тем ниже забор
Твой забор - лицо твоей задницы

Не по теме:

Знаете, тема заборов для меня больная. По жизни. 15 лет назад я приобрел дачку. Прельстила меня полная открытость пространства. И вот последние несколько лет по повышению общего уровня жизни и чудовищной дешевизны профнастилов (забор из профа обходится на 20% дороже, чем из рабицы) моя улица стала похожа на тюремный коридор. Если постараться, здесь можно найти много аналогий с ООП и другими модными прибамбасами. Но моя хатка - с краю (буквально). И я любуюсь лесом. А каркули - любуются своим забором. Что еще любопытно, как правило, забор ставится красивой (крашенной) стороной на улицу. А изнутри наши заборостроители видят исходный унылый грунт. В общем, метафору заборов можно развивать и развивать...:)

2
Эксперт функциональных языков программированияЭксперт Java
4479 / 2714 / 485
Регистрация: 28.04.2012
Сообщений: 8,582
06.12.2014, 09:26 23
Цитата Сообщение от Catstail Посмотреть сообщение
а в Вашем коде можно получить доступ к полям структуры напрямую (в обход Finit)?
C
1
2
3
4
5
...
    Finit(f, 1, 2.3);
    Fprint(f);
    printf("%d\n", f->x);
...
Bash
1
2
% tcc -o main main.c foo.c
main.c:11: error: field not found: x
Добавлено через 3 минуты
Цитата Сообщение от Байт Посмотреть сообщение
Маленький вопросец. А какой смысл в инкапсуляции?
Маленький ответец: модульность.
1
Модератор
Эксперт функциональных языков программированияЭксперт Python
36354 / 20233 / 4211
Регистрация: 12.02.2012
Сообщений: 33,508
Записей в блоге: 13
06.12.2014, 18:16 24
korvin_, убедительно!
0
Day
1178 / 988 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
06.12.2014, 21:35 25
Цитата Сообщение от korvin_ Посмотреть сообщение
Маленький ответец: модульность.
Имхо, модульность была изобретена задолго до инкапсуляции. Да, инкапсуляция вносит свои 5 копеек в эту идею. Но Си позволяет "модульничать" и без этих чудесных прибамбасов.
0
Эксперт функциональных языков программированияЭксперт Java
4479 / 2714 / 485
Регистрация: 28.04.2012
Сообщений: 8,582
07.12.2014, 10:26 26
Цитата Сообщение от Day Посмотреть сообщение
Имхо, модульность была изобретена задолго до инкапсуляции.
Модульность -- не вещь, которую можно "изобрести", а свойство. Инкапсуляция тоже не вещь, а метод.

Цитата Сообщение от Day Посмотреть сообщение
Да, инкапсуляция вносит свои 5 копеек в эту идею.
Фигасе 5 копеек. Инкапсуляция на сегодняшний день -- основной метод увеличения модульности.

Цитата Сообщение от Day Посмотреть сообщение
чудесных прибамбасов
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12438 / 7465 / 1749
Регистрация: 25.07.2009
Сообщений: 13,721
07.12.2014, 22:57 27
Цитата Сообщение от Catstail Посмотреть сообщение
korvin_, а в Вашем коде можно получить доступ к полям структуры напрямую (в обход Finit)?
Грязным хаком
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include "foo.h"
 
#define Foo struct { int x; float y }
 
int main(void) {
    Foo f = { 13, 3.14 };
    
    Fprint(&f);
    
    return 0;
}
Но пример на самом деле хороший и поезный.
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
07.12.2014, 23:24 28
Цитата Сообщение от Catstail Посмотреть сообщение
убедительно!
Prove:

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <stdio.h>
#include <stdlib.h>
 
typedef struct Foo Foo;
 
Foo*  Falloc();
void  Ffree(Foo*);
void  Finit(Foo*, int, float);
void  Fprint(Foo*);
 
struct Foo
{  
   int      x;
   float    y;
};
 
Foo*  Falloc()
{  
   return (struct Foo*)malloc(sizeof(Foo));
}
 
void  Ffree(Foo* f)
{  
   free(f);
}
 
void Finit(Foo* f,int x,float y)
{  
   f->x = x;
   f->y = y;
}
 
void Fprint(Foo* f)
{  
   printf("Foo{ %d, %f }: ",f->x,f->y);
}
 
int main(int argc,char** argv)
{    
   
   Foo*  f = Falloc();
 
   Finit(f,1,2.3f);
 
   Fprint(f);
   
   printf("%d  %f\n",f->x,f->y);
   
   Ffree(f);
 
   return 0;
}
Миниатюры
Нужны ли геттеры/сеттеры в чистом си?  
0
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
07.12.2014, 23:29 29
А вопросец-то вот:
Цитата Сообщение от tiger() Посмотреть сообщение
Есть ли пример ситуации, когда могут понадобиться геттеры и сеттеры в чистом си?
В общем случае нет. Язык так и задумывался: предоставить доступ ко всему с наименьшими ограничениями. Это "синтаксически усовершенствованный ассемблер", так что может быть стоило бы присмотреться к другому кандидату.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12438 / 7465 / 1749
Регистрация: 25.07.2009
Сообщений: 13,721
08.12.2014, 00:06 30
gazlan, а попробуйте угадать, зачем у автора код на три части разбит?
1
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
08.12.2014, 02:49 31
Цитата Сообщение от easybudda Посмотреть сообщение
код на три части разбит
Упс. Не обратил внимания. В самом деле, конструируется opacue ptr.
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
08.12.2014, 11:15 32
Цитата Сообщение от tiger() Посмотреть сообщение
Есть ли пример ситуации, когда могут понадобиться геттеры и сеттеры в чистом си?
Есть. Такие ситуации возникают из-за архитектурных ограничений, прямым следствием которых является невозможность использования стандартных средств/механизмов для установки значений. Частный случай: допустим есть некая структура, содержащая массив переменной длины (т.е. указатель как поле). В таком случае мы не будем иметь возможность корректно "засетить" значение ни через оператор присваивания, ни через memcpy, по понятным причинам. А значит, надо писать сеттер. Прямым следствием этого, в силу т.н. "принципов грамотного проектирования кода" будет и написание соответствующего подобия геттера. Как-то так.
1
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
09.12.2014, 10:36 33
Как же это я в такой популярной теме то не еще отметился своим дилетантским имхом? Исправляюсь
Разумеется есть, и встречаются они постоянно. Вот живем мы, допустим, не на компьютере с ОС, а на обычном микроконтроллере, допустим, восьмибитном, пишем все сами, ручками. И есть у нас там глобальная волатильная двухбайтовая переменная short a, которую мы можем писать/читать из нашего основного кода, и из процедуры обработки прерывания. Но прерывание может возникнуть в любой момент, даже когда мы читаем ее значение как b = a; - мы (наш ассемблерный листинг, разумеется, мы то не думаем про байты, правда, это же не барское дело?) прочитали старший байт, а тут внезапно пришло случилось прерывание, которое перезаписало нам оба байта переменной а, оно успешно завершилось, а наш основной код честно прочитал во второй байт b уже новый второй байт а - и мы получили в b мусор, причем, если мы не думаем про байты, то даже не понимаем откуда он там А все потому, что наш безобидный оператор "=" в данном случае не атомарен, и надо писать геттер - или оборачивать в скобки типа
C
1
asm("cli"); b = a; asm("sei");
- то есть устанавливать флаг запрещения прерываний на время чтения переменной, или если по каким-то причинам запрещать прерывания нежелательно, то писать к примеру следующий гениальный код на грани безумия
C
1
b = a; b1 = a; if (b1<>b) b=a;
- и это реальный пример из реального проекта, переменные разумеется объявлены как волатильные, чтобы оптимизатор не лез куда не надо со своими наивными представлениями о реальности С установкой значения и сеттерами ситуация полностью аналогичная. А если у нас может быть многоуровневая вложенность прерываний? Ситуация становится еще интереснее, не правда ли?
Вот такая байка про сеттеры/геттеры в С. И на ее фоне забавно читать мнения насчет "не нужны" и "присмотреться к другому кандидату" - ибо С - это самый что ни на есть кандидатский кандидат в этом случае, других то и нет в большинстве камней.
0
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
09.12.2014, 21:02 34

Не по теме:

_Ivana, съел, не обляпался :D


Всё таки Ваш пример не очевиден - семафор. С таким же успехом любые push, pop можно отнести в ту же категорию и при этом совсем не обязательно прятать реализацию (инкапсулировать, именно эта идея развивается с начала поста). Именно в этом ключе я и объсянился, видимо, не совсем ясно (или совсем неясно, что в итоге одно и то же). А за примерами когда push/pop нужны, я думаю далеко ходить не надо.
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
09.12.2014, 23:26 35
Как всегда, разногласия оказались мнимыми и из-за терминов. Прятать что-либо так, чтобы нельзя было добраться при всем желании - имхо немного перебор и отдает паранойей и недоверием к разработчику - за границу массива не залезь, адрес возврата не подмени, регистр состояния не покорежь... Другое дело, что всякие синтаксические обертки повышают удобство и читаемость.
2
09.12.2014, 23:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.12.2014, 23:26
Помогаю со студенческими работами здесь

Геттеры и сеттеры
Привет, я начинающий в программировании. Просматривал онлай уроки программирования Java и был урок...

Геттеры и Сеттеры
Сразу прошу прощение за может тупые вопросы я только начал познавать java.))Столкнулся с Геттерами...

Геттеры и сеттеры
Я недолго учу джаву, но уже заметил, что многие говорят, что геттеры и сеттеры это хорошо или...

Классы (сеттеры и геттеры)
У меня дан класс вектор. И 3 члена класса. И исходные данные, вектор а=а1,а2,а3 и вектор...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru