Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не пользуйтесь функциями типа get/set, объясните смысл написанного 
V
    Опции темы
En_t_end
Дата 9.7.2006, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



Цитата(ivashkanet @  9.7.2006,  14:33 Найти цитируемый пост)
Монастырь агрономов-осеннизаторов?

по-моему это оскорбление... 
PM MAIL ICQ Skype GTalk Jabber   Вверх
ivashkanet
Дата 9.7.2006, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: нет
Всего: 149



Цитата(Daevaorn @  9.7.2006,  11:29 Найти цитируемый пост)
"свойства"

Повторяю: свойства -- это данные класса завернутые в get и set (неважно каким образом завернутые).
Цитата(Daevaorn @  9.7.2006,  11:29 Найти цитируемый пост)
 формы

Это просто пример класса у которого много открытых "данных". И как их закрыть я ума не приложу  smile 
Цитата(Daevaorn @  9.7.2006,  11:29 Найти цитируемый пост)
Если учесть что в С вообще нет ООП, то о каком наследстве может идти речь?

Почитай внимательно первый пост
Цитата(En_t_end @  9.7.2006,  11:35 Найти цитируемый пост)
по-моему это оскорбление... 

Даже и не думал  smile Я имел ввиду, что и ваш и мой монастырь --- монастырь программирования. А не какой нибудь другой. Извините если что не так, никого не хотел обидеть smile

Добавлено @ 12:08 
Цитата(ivashkanet @  9.7.2006,  12:04 Найти цитируемый пост)
Почитай внимательно первый пост

Цитата(Rockie @  7.7.2006,  21:28 Найти цитируемый пост)
Конечно, эта организация означает, что С++ не может быть эффективно использован в гибридной среде С/С++, потому что интерфейс между двумя половинами программы уничтожает инкапсуляцию, которой вы так сильно старались добиться. В известном смысле жаль, что С++ создан на основе С, потому что это просто подстрекает нас к ошибкам





 
PM MAIL WWW ICQ   Вверх
Fazil6
Дата 9.7.2006, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



ivashkanet, 
Цитата

Повторяю: свойства -- это данные класса завернутые в get и set (неважно каким образом завернутые).

в том то и дело, что ты неправильно себе представляешь тему изначально поднятую в топике и мало того - ты неправильно представляешь даже то, что пытаешься здесь доказать.
Свойства - это не данные класса, это такая реализация интерфейса класса.
Цитата

Это просто пример класса у которого много открытых "данных". И как их закрыть я ума не приложу

пример с формой не говорит, что это стандарт и так нужно делать всегда. 
Цитата

А не кажется ли, что ты все равно открываешь поле класса? Только делаешь это через вспомогательный класс Writer. Что мешает мне написать Writer который просто возьмет твое значение и будет с ним дальше работать? Что изменится? Ааа, наверное, создастся новая копия данных? Но это же я могу сделать и через сеттер (создать новый экземпляр данных) 

ничего ты не понял. Ничего здесь не открывается. Все можно делать правильно и неправильно. Вмоем примере каждый класс управляет только своими данными не требуя никаких данных у других классов, потому, что они ему просто не нужны, в этом и есть смысл этой ветки и большой части книги 
Цитата

ВЕРЕВКА ДОСТАТОЧНОЙ ДЛИНЫ, 
ЧТОБЫ ВЫСТРЕЛИТЬ СЕБЕ В НОГУ 
Правила программирования на С и С++ 
Ален И. Голуб


Цитата

Ага, читал. А то что вы сейчас имеете досталось вам от несовершенного C 

И все таки,  что мы такое сейчас имеем???? 
PM MAIL   Вверх
ivashkanet
Дата 9.7.2006, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: нет
Всего: 149



Цитата(Fazil6 @  9.7.2006,  12:26 Найти цитируемый пост)
в том то и дело, что ты неправильно себе представляешь тему изначально поднятую в топике

Поднятая тема -- не стоит использовать gettter и setter в коде?
Или я не так понял, и поднятая тема -- не стоит использовать gettter и setter в коде, если они ничего не делает кроме как напрямую обращаются к данным? Как в примере.
Цитата(Fazil6 @  9.7.2006,  12:26 Найти цитируемый пост)
мало того - ты неправильно представляешь даже то, что пытаешься здесь доказать.

Это врятли. Но то что я плохо изъясняю свою позицию --- с этим  я могу согласиться

Цитата(Fazil6 @  9.7.2006,  12:26 Найти цитируемый пост)
Свойства - это не данные класса, это такая реализация интерфейса класса.

Нееее, эт я в курсе smile Даже много раз писал... Но тема-то про гет и сет, а это и есть свойства  smile 
Цитата(Fazil6 @  9.7.2006,  12:26 Найти цитируемый пост)
И все таки,  что мы такое сейчас имеем???

Забудь, я просто перефразировал автора.
Цитата(Fazil6 @  9.7.2006,  12:26 Найти цитируемый пост)
пример с формой не говорит, что это стандарт и так нужно делать всегда. 

Но таких классов не одна форма. Их сотни smile 
P.S. Предлагаю закончить ругаться smile . Объясните мне четко и понятно в чем я не прав, пожалуйста. 
PM MAIL WWW ICQ   Вверх
likehood
Дата 9.7.2006, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 8
Всего: 24



Цитата(ivashkanet @  8.7.2006,  18:30 Найти цитируемый пост)
Что мешает мне в сеттере СВОЙСТВА Caption ПОЛНОСТЬЮ продублировать код функции SetCaption

Вообще-то, SetCaption и есть сеттер для "свойства" Caption, куда ты собираешься дублировать код?
Цитата(ivashkanet @  9.7.2006,  11:33 Найти цитируемый пост)
В С++ нет такого лексического понятия как свойства! В это то собственно и весь топик, т.к. иногда приходится писать get/set    

Ага, читал. А то что вы сейчас имеете досталось вам от несовершенного C

В отсутствии свойств С не при чем, вон в C++ Builder'е свойства давно есть как расширение языка. Может в следующий стандарт их все же включат. 
PM MAIL   Вверх
DeadSoul
Дата 9.7.2006, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



Цитата(baronp @  9.7.2006,  18:42 Найти цитируемый пост)
Может в следующий стандарт их все же включат

А зачем? 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
ivashkanet
Дата 9.7.2006, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: нет
Всего: 149



Цитата(baronp @  9.7.2006,  18:42 Найти цитируемый пост)
Вообще-то, SetCaption и есть сеттер для "свойства" Caption, куда ты собираешься дублировать код?

Дя..., Это все отличие синтаксисов языков. Под SetCaption я имел в виду просто функцию, а не сеттер.
Функциями ж типа можно пользоваться.
А вообще, повторю свою позицию:
Цитата(ivashkanet @  9.7.2006,  10:33 Найти цитируемый пост)
Сеттер -- более удобная (синтаксическая) замена функции типа void, принимающей один параметр.
Геттер -- функции любого типа без параметров.

И никакой разницы между ними нет

Добавлено @ 19:00 
Цитата(baronp @  9.7.2006,  18:42 Найти цитируемый пост)
В отсутствии свойств

Как то странно: get и set есть, а свойств нет  smile  
PM MAIL WWW ICQ   Вверх
ivashkanet
Дата 9.7.2006, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: нет
Всего: 149



Цитата(Fazil6 @  9.7.2006,  12:26 Найти цитируемый пост)
Ничего здесь не открывается.

Как так?
Код

class DataGetter : public Write
{
public:
    void write(const SomeData &d)
    {
        Data=d;
    }
public someData Data;
};

Write *dg= new DataGetter();

MyClass mcl;

// копируем данные
mcl.output(dg);

// получаем данные
public someData Data= dg.Data

// делаем с данными все что хотим

 smile 
P.S. Мог накосячить с синтаксисом, так как не в курсе про * и & (приведение к ссылке и назад). Но идея, думаю, ясна. 
PM MAIL WWW ICQ   Вверх
likehood
Дата 9.7.2006, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 8
Всего: 24



Цитата(ivashkanet @  9.7.2006,  19:59 Найти цитируемый пост)
Сеттер -- более удобная (синтаксическая) замена функции типа void, принимающей один параметр.

В С++ сеттер это и есть "функция типа void, принимающая один параметр".

Добавлено @ 19:28 
Цитата(DeadSoul @  9.7.2006,  19:52 Найти цитируемый пост)
Может в следующий стандарт их все же включат    

А зачем? 

Удобная все таки штука - свойства! 
PM MAIL   Вверх
Fazil6
Дата 9.7.2006, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



ivashkanet
мда.... как все запущено....
ты бы почитал первые сообщения в этой ветке.

Ну и что в том, что ты смог через открытый интерфейс получить значение данных. Если у тебя в классе есть необходимость в данных другого класса, то твой дизайн неправильный и об этом речь изначально, а не о том, что нельзя использовать set и get. В моем примере нет никакой необходимости в таких методах  

Это сообщение отредактировал(а) Fazil6 - 9.7.2006, 19:35
PM MAIL   Вверх
ivashkanet
Дата 9.7.2006, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: нет
Всего: 149



Цитата(baronp @  9.7.2006,  19:24 Найти цитируемый пост)
В С++ сеттер это и есть "функция типа void, принимающая один параметр"

А с ней (SetCaption()) нельзя делать вот так: Caption="Caption" smile 
Цитата(Fazil6 @  9.7.2006,  19:33 Найти цитируемый пост)
ты бы почитал первые сообщения в этой ветке.

Перечитал, ну и что?
Меня возмутило то, как понял вас автор топика (а по другому вас понять невозможно smile, он понял правильно)
Цитата(Rockie @  7.7.2006,  22:55 Найти цитируемый пост)
Ага! Если я правильно понял, то, к примеру, вместо set использовать инициализацию в конструкторе, а заместо get использовать к примеру методы "Распечататься",  "Записаться в файл" и др. Таким образом, необходимость в методах set и get должна отпасть сама собой. 

Инициализация в конструкторе:
А если у нас десяток полей (настроек класса) и все они необязательные? Делать конструктор на 10 параметров, или, еще лучше, 10! конструкторов на все случаи жизни. smile 
Методы "Распечататься",  "Записаться в файл" и др.:
Невозможно предусмотреть все варианты.
А твой, Fazil6, пример ничем не лучше чем get или функции, возвращающей значение.
Цитата(Fazil6 @  9.7.2006,  19:33 Найти цитируемый пост)
Если у тебя в классе есть необходимость в данных другого класса

А если цель моего класса -- обработать данные, то как мне их передавать?
Наилучший выход метод Execute() или Calculate(), которые вернут вычисленное значение/структуру.
А это ничем не лучше чем get 
PM MAIL WWW ICQ   Вверх
Daevaorn
Дата 9.7.2006, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(ivashkanet @  9.7.2006,  20:57 Найти цитируемый пост)
А если у нас десяток полей (настроек класса) и все они необязательные? 

Ошибка проектирования
Цитата(ivashkanet @  9.7.2006,  20:57 Найти цитируемый пост)
Невозможно предусмотреть все варианты.

Ошибка проектирования 
PM MAIL WWW   Вверх
Fazil6
Дата 9.7.2006, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

Перечитал, ну и что?
Меня возмутило то, как понял вас автор топика (а по другому вас понять невозможно , он понял правильно)

именно. Именно это я и говорил. Именно так он меня и понял. Иэто правильно. Пользователь класса не должен задумываться о данных класса. Они его не интересуют.

Цитата

Инициализация в конструкторе:
А если у нас десяток полей (настроек класса) и все они необязательные? Делать конструктор на 10 параметров, или, еще лучше, 10! конструкторов на все случаи жизни.

изменить класс. Это плохой класс, если нужно создав класс начинать настраивать его установкой  значений его переменных. Не надо только начинать мне приводить всякие классы форм из NET или VCL. Это не стандарт правильного проектирования классов всилу ряда причин. Сейчас разговор об объектно ориентированном подходе в теории.
Цитата

Методы "Распечататься",  "Записаться в файл" и др.:
Невозможно предусмотреть все варианты.
 
Во первых перед программистом никогда не должна стоять задача предусмотреть все варианты. Перед ним стоит конкретная задача, а не некий гипотетический худший случай. Во вторых я привел тебе пример, когда классы разработаны так, что добавления нового функционала не затрагивают ни одной строчки работавшего до этого кода. И это правильно. 
Цитата

А твой, Fazil6, пример ничем не лучше чем get или функции, возвращающей значение.

Причем здесь лучше или хуже? Я привел тебе пример того, что get и set вообще не нужныпри таком подходе, и это правильно. 

Цитата

А если цель моего класса -- обработать данные, то как мне их передавать?
Наилучший выход метод Execute() или Calculate(), которые вернут вычисленное значение/структуру.
А это ничем не лучше чем get 

бред какой-то. Ничего не понял. В моем примере Write как раз обрабатывает данные. Разве он говорит "дай мне вот эти свои данные и я их будуобрабатывать"?
 
PM MAIL   Вверх
ivashkanet
Дата 9.7.2006, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: нет
Всего: 149



Забейте. Каждый остался при своем мнении.
Всем спасибо, что уделили мне время smile  
PM MAIL WWW ICQ   Вверх
Rockie
Дата 10.7.2006, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



возможно повторюсь за Fazil6, но все-таки. я думаю здесь можно вспомнить The Dependency Inversion Principle - принцып иверсии зависимостей. 

по сути он состоимт из двух частей:
Цитата
A. HIGH LEVEL MODULES SHOULD NOT DEPEND UPON LOW LEVEL MODULES. BOTH SHOULD DEPEND UPON ABSTRACTIONS.
B. ABSTRACTIONS SHOULD NOT DEPEND UPON DETAILS. DETAILS  SHOULD DEPEND UPON ABSTRACTIONS.


и в пример приводится программа "Copy". модуль copy может читать с клавиатуры и записывать на принтер.

                          ---- Copy-----
                         |                    | 
                        Read            Write
                      Keyboard       Printer

а если понадобится читать из файла? или выводить не на принтер, а на консоль.. в этом случае рекомендуется делать так:

                          ---->Copy<----
                         |                      | 
                      Abstract       Abstract       
                       Reader         Writer
                         |                      |
                        Read          Write
                      Keyboard       Printer

то есть в классах Abstr. Reader и Writer содержатся чистые виртуальные функции, и мы сможем добавить в систему "чтение из файла" или принтер другой модели, не трогая при этом Copy. предусмотреть 50 моделей принтеров действительно невозможно, но можно постараться сделать так, чтобы их потом можно было безболезненно добавлять. 


--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0674 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.