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

Поиск:

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


Эксперт
****


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

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



ivashkanet, Меня просто удивило, то что ты говоришь про стандартные классы и тут же про какие-то формы. В стандартном С++ нет форм. И пример просил привести именном поэтому. В стандартной библиотеке С++ надо постараться, чтобы встретить set/get, хотя найти можно.
Цитата(ivashkanet @  8.7.2006,  16:44 Найти цитируемый пост)
А вообще зайди IDE, выдели любой класс и любуйся открытыми СВОЙСТВАМИ в закладке Propertes.

А у меня в IDE нет такого. хнык-хныкsmile((

Добавлено @ 16:51 
Цитата(En_t_end @  8.7.2006,  12:42 Найти цитируемый пост)
допустим, мне нужно собрать статистику со всех классов. В каждом классе есть метод GetOccupied. Неужели этот метод нарушает инкапсуляцию ? То есть технологию аксессоров нельзя применять ?   

Скорей всего по лигике этот класс сам должен эти данные записать в класс сборщика статистики 
PM MAIL WWW   Вверх
ivashkanet
Дата 8.7.2006, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Daevaorn @  8.7.2006,  16:49 Найти цитируемый пост)
Меня просто удивило, то что ты говоришь про стандартные классы и тут же про какие-то формы

А класс формы разве не стандартный класс?
Цитата(Daevaorn @  8.7.2006,  16:49 Найти цитируемый пост)
А у меня в IDE нет такого

Что за IDE такое??? 
PM MAIL WWW ICQ   Вверх
Fazil6
Дата 8.7.2006, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Поля класса -- конретные "переменные" класса, т.е. его данные.
Свойства -- "обертки" для полей класса, сделанные с помощью get и set.
Врятли от языка к языку эти понятия меняются.

речь не о наз ваниях функций. Речь о данных, а не о свойствах. SetCaption это не установка переменной, хранящей значение заголовка, а именно изменение заголовка

Цитата

А вообще зайди IDE, выдели любой класс и любуйся открытыми СВОЙСТВАМИ в закладке Propertes.
Там перечисленны только они, полей нет

вот и непонятно что именно и кому ты хочешь доказать...

Цитата

После нас хоть потоп. Да?
Представьте ситуацию: 
Мы спроектировали класс, который что-то обрабатывает, а потом выводит на экран (ShowOnScreen()). 
Мы продали этот класс. Его используют другие люди. Всем нравится, все в восторге.
Через некоторое время понадобился вывод на принтер. Они связваются с нами, мы лезем в код добавляем метод (SendToPrinter()). Через время понадобился вывод еще на что-нибудь...

вот об этом и речь - класс спроектировать надо было так, чтобы такая ситуация не возникала.
причем добиться этого очень просто.

Базовый класс Write.
От него наследуются классы WriteInFile, WriteInScreen и т.д.

Наш класс при в ф-ции вывода принимает указатель(или ссылку) на Write и вызывает виртуальные функции вывода. В зависимости какой дочерний объект был передан, туда и будет вывод. Для вывода кудато еще надо написать еще один класс вывода и все.  Никаких изменений нашего класса не требуется, никакие данные класса нигде мной даже не упоминались. Вот это ООП... 


En_t_end, 
Цитата

Мне ответьте  пожалуйста...

Да нечего отвечать. Все уже написано выше. 
Данные класса не должны никого интересовать вне этого класса.
Цитата

Неужели этот метод нарушает инкапсуляцию ?

если единственная задача этого метода вернуть значение члена класса, то да, а если эта фукнция возвращает каким-либо способом объект, созданный на основе этих данных (например Visitor), то нет.

Добавлено @ 17:07 
Цитата

А класс формы разве не стандартный класс?

это по какому стандарту?????? smile  
PM MAIL   Вверх
Daevaorn
Дата 8.7.2006, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ivashkanet @  8.7.2006,  18:03 Найти цитируемый пост)
А класс формы разве не стандартный класс?

Нет.
Цитата(ivashkanet @  8.7.2006,  18:03 Найти цитируемый пост)
Что за IDE такое???  

Блокнот + CommandPromt + MinGW 
=))) 
PM MAIL WWW   Вверх
Void
Дата 8.7.2006, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Что-то мне вспомнилась недоброй памяти ветка, где затрагивались вопросы инкапсуляции. В воздухе отчетливо запахло догмами…
Автор сказал именно то, что хотел сказать:
Цитата
Нет абсолютно ничего плохого в том, если вы начинаете с ряда сообщений и затем решаете, что самым простым способом реализации сообщения является помещение специального поля в определение класса.

Не надо априори заворачивать все в get/set, и не надо априори считать открытый доступ к полям злом.

Позволю себе привести цитату с одного форума, не совсем on-topic, но очень близко:
Цитата
> ... если архитектор/программист начинает на первом же шаге строить объектную модель предметной области, то он не прав дважды. Во-первых, он начинает с конца. Во-вторых, он не задумывается о функционале.

Кстати, признаком такого проектирования являются вопросы, на манер: "У меня есть класс "Корова" и класс "Доярка". Где я должен разместить метод "доить", в "Корова.доитьКем(Доярка)" или в "Доярка.доитьКого(Корова)".


P.S.
Солгасен с DeadSoul:
Цитата
1. С течением времени смысл этих методов может изменится
2. С getter-ами\setter-ами проще отлаживатся, т.е. найти то место где туда устанавливается не очень корректное значение
 


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
ivashkanet
Дата 8.7.2006, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Fazil6 @  8.7.2006,  17:05 Найти цитируемый пост)
SetCaption это не установка переменной, хранящей значение заголовка, а именно изменение заголовка

Поподробнее об это, пожалуйста.
Что мешает мне в сеттере СВОЙСТВА Caption ПОЛНОСТЬЮ продублировать код функции SetCaption smile 
Или это опять нарушение инкапсуляции
Цитата(Daevaorn @  8.7.2006,  17:09 Найти цитируемый пост)
Цитата(ivashkanet @  8.7.2006,  18:03 )А класс формы разве не стандартный класс?Нет

Цитата(Fazil6 @  8.7.2006,  17:05 Найти цитируемый пост)
это по какому стандарту

Хророшо, но тогда получается, что он неправильно спроектирован?
Цитата(Daevaorn @  8.7.2006,  17:09 Найти цитируемый пост)
Блокнот + CommandPromt + MinGW =))) 

 smile  smile 
Цитата(Fazil6 @  8.7.2006,  17:05 Найти цитируемый пост)
Базовый класс Write.

ОК, согласен. Но тогда все наши классы будут неподъемными монстрами, с КУЧЕЙ "лишнего" кода, который будет только заботиться о взаиможействии с остальным миром.
Я получу, наконец, ответы на свои вопросы?
Цитата
Обясните мне разницу между методом Form.SetCaption("Название формы") и Form.Caption = "Название формы" с точки зрения работы программы?

Заметьте, Form.Caption -- это не поле, а свойство, сделанное с помощью get и set, а в set помещен 1:1 код метода SetCaption
и 
Цитата
Представьте что бы было если бы "самый главный" класс Form не имел открытых свойств. Что бы тогда было. Заголовок, положение, размеры, ... все передавать через конструктор?
 
PM MAIL WWW ICQ   Вверх
Daevaorn
Дата 8.7.2006, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ivashkanet @  8.7.2006,  18:30 Найти цитируемый пост)
Я получу, наконец, ответы на свои вопросы?

Цитата
Обясните мне разницу между методом Form.SetCaption("Название формы") и Form.Caption = "Название формы" с точки зрения работы программы?


Заметьте, Form.Caption -- это не поле, а свойство, сделанное с помощью get и set, а в set помещен 1:1 код метода SetCaption
и 

В С++ нет такого лексического понятия как свойства! В это то собственно и весь топик, т.к. иногда приходится писать get/set
Ты похоже со своим уставом монастырем ошибся;) 
PM MAIL WWW   Вверх
Fazil6
Дата 8.7.2006, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Поподробнее об это, пожалуйста.

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

Цитата

ОК, согласен. Но тогда все наши классы будут неподъемными монстрами, с КУЧЕЙ "лишнего" кода, который будет только заботиться о взаиможействии с остальным миром.

да???????  smile  нифигасе!!!!!
Код

class Write
{
public:
    virtual void write(const SomeData &d) = 0;
};
/*================================*/
class WriteInFile : public Write
{
public:
    void write(const SomeData &d)
    {
        // реализация вывода в файл 
    }
};
/*================================*/
class WriteInPrinter : public Write
{
public:
    void write(const SomeData &d)
    {
        // реализация вывода на принтер
    }
};
/*================================*/
class MyClass
{
public: 
    void output(Write *w)
    {
       w->write(d);
    }
private:
    SomeData d;
};
/*================================*/
/*================================*/


Write *f = new WriteInFile();
Write *p = new WriteInPrinter();

MyClass mcl;

// выводим в файл
mcl.output(f);
// выводим на принтер
mcl.output(p);


где у меня лишний код? Хочешь выводить файл на стену или в космос - пиши соответствующего наследника Write и все в шакаладе. Работавший до этого код никак не изменится и работа его никак не изменится

Цитата

Что мешает мне в сеттере СВОЙСТВА Caption ПОЛНОСТЬЮ продублировать код функции SetCaption
 да отстань ты со своими свойствами. Разговор не о свойствах. Разговор о данных класса.
Цитата

Заметьте, Form.Caption -- это не поле, а свойство, сделанное с помощью get и set, а в set помещен 1:1 код метода SetCaption
такое впечатление, что ты сам с собой разговариваешь
 
PM MAIL   Вверх
En_t_end
Дата 8.7.2006, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Daevaorn @  8.7.2006,  20:49 Найти цитируемый пост)
Скорей всего по лигике этот класс сам должен эти данные записать в класс сборщика статистики 

Цитата(Fazil6 @  8.7.2006,  21:05 Найти цитируемый пост)
если единственная задача этого метода вернуть значение члена класса, то да,

Из выше сказанного есть вывод. Если использовать ООП, так как того требуют правила, то приходится проектировать ВСЮ функциональность в ОО-манере. Иначе поддерживать все правила инкапсуляции, сокрытия информации, метода "черного ящика" просто невозможно - всегда будет желание получить прямой доступ к полям классов.

 
PM MAIL ICQ Skype GTalk Jabber   Вверх
Fazil6
Дата 8.7.2006, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

> ... если архитектор/программист начинает на первом же шаге строить объектную модель предметной области, то он не прав дважды. Во-первых, он начинает с конца. Во-вторых, он не задумывается о функционале.

Кстати, признаком такого проектирования являются вопросы, на манер: "У меня есть класс "Корова" и класс "Доярка". Где я должен разместить метод "доить", в "Корова.доитьКем(Доярка)" или в "Доярка.доитьКого(Корова)".

пустые слова. Что мне мешает думать о фукнционале при разработке объектной модели? Пример тоже ни о чем не говорит.

Цитата

не надо априори считать открытый доступ к полям злом.

Цитата

Солгасен с DeadSoul:

ты неправ

Добавлено @ 18:44 
Цитата

Если использовать ООП, так как того требуют правила, то приходится проектировать ВСЮ функциональность в ОО-манере.
 ну так это вообщето очевидно, что если есть правила, то правильно - это соблюдать правила и программирование здесь ничем от других областей жизни не отличается 
PM MAIL   Вверх
En_t_end
Дата 8.7.2006, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Void @  8.7.2006,  21:19 Найти цитируемый пост)
если архитектор/программист начинает на первом же шаге строить объектную модель предметной области, то он не прав дважды.

Я наоборот считаю, что если сначала строить ОО-модель, то можно получить результат не только быстрей, но и качественне. Ты сразу накладываешь условие на некоторые параметры, подстраиваешь условия под возможности ООП, проектируешь с учетом ООП. Если же строить модель потом(я пробывал и так), приходится "обрезать" идею под возможности. Методом проб и ошибок, выбрал первое.

Добавлено @ 18:59 
Цитата(Fazil6 @  8.7.2006,  22:37 Найти цитируемый пост)
ну так это вообщето очевидно, что если есть правила, то правильно - это соблюдать правила и программирование здесь ничем от других областей жизни не отличается 

я не это имел ввиду smile Я говорил не просто о соблюдении правил. Если одна часть ПО будет спроектированна в виде библиотеки высокачественных классов, а другая в виде простого кода, набора итеративно-функциональных операторов, то это неизбежно приведет к возникновению get/set в библиотеке. Поэтому, чтобы в проекте ПО не было узких мест, в виде такого кода, следует проектировать ВСЁ ПО, как набор ОО-моделей.  

Это сообщение отредактировал(а) En_t_end - 8.7.2006, 19:06
PM MAIL ICQ Skype GTalk Jabber   Вверх
Void
Дата 8.7.2006, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(Fazil6 @  8.7.2006,  20:37 Найти цитируемый пост)
пустые слова. Что мне мешает думать о фукнционале при разработке объектной модели? Пример тоже ни о чем не говорит.

ОК. Вот тебе линк на корень той дискуссии. Я не настаиваю на полной правоте этих слов.
Цитата(Fazil6 @  8.7.2006,  20:37 Найти цитируемый пост)
не надо априори считать открытый доступ к полям злом.

Цитата

Солгасен с DeadSoul:

ты неправ

По линку на ту ветку (в здешних РВ) сходил? Там тоже человек отстаивал антиобъектнориентированность геттеров/сеттеров и свойств, как синтаксического сахара над ними.

Кстати, смысл есть и в закрытых или защищенных mutators. Уж они-то инкапсуляцию не нарушают, но иногда оправданны, т.к. повышают сопровождаемость кода. 

Это сообщение отредактировал(а) Void - 8.7.2006, 19:01


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Fazil6
Дата 8.7.2006, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

По линку на ту ветку (в здешних РВ) сходил?

там на другую тему дискуссия 
PM MAIL   Вверх
ivashkanet
Дата 9.7.2006, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Fazil6 @  8.7.2006,  18:21 Найти цитируемый пост)
для того,чтобы в заголовке окна на экране поменялся текст недостаточно только изменить одну переменную в класе

А кто говорит, что я собираюсь изменить только одну переменную? В сеттере я могу написать хоть сотню строк кода  smile 
Код

public
void setCaption  ( string iCaption )
{ 
// Что-нибудь делаем
// Делаем проверки на валидность
_caption = iCaption;
// И в завершение то же что нибудь делаем     } 

int    getCaption ( void )  { return _caption; } 

Цитата(Daevaorn @  8.7.2006,  17:35 Найти цитируемый пост)
В С++ нет такого лексического понятия как свойства! В это то собственно и весь топик, т.к. иногда приходится писать get/set

Ага, читал. А то что вы сейчас имеете досталось вам от несовершенного C smile 
Цитата(Daevaorn @  8.7.2006,  17:35 Найти цитируемый пост)
Ты похоже со своим уставом монастырем ошибся;) 

Монастырь агрономов-осеннизаторов?
Цитата(Fazil6 @  8.7.2006,  18:21 Найти цитируемый пост)
 Разговор не о свойствах. Разговор о данных класса.

С какой такой стати?
Цитата(Fazil6 @  8.7.2006,  18:21 Найти цитируемый пост)
   void write(const SomeData &d)

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

Цитата(Void @  8.7.2006,  19:00 Найти цитируемый пост)
геттеров/сеттеров и свойств, как синтаксического сахара

Полностью согласен с Void. Сеттеры и геттеры это синтаксический сахар, ИМХО.
Сеттер -- более удобная (синтаксическая) замена функции типа void, принимающей один параметр.
Геттер -- функции любого типа без параметров.

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


Эксперт
****


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

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



Цитата(ivashkanet @  9.7.2006,  11:33 Найти цитируемый пост)
 А то что вы сейчас имеете досталось вам от несовершенного C 

Если учесть что в С вообще нет ООП, то о каком наследстве может идти речь?
Цитата(ivashkanet @  9.7.2006,  11:33 Найти цитируемый пост)
С какой такой стати?

А с такой, что пытался кике-то "свойства" и формы приписать
 
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0684 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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