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

Поиск:

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


666
**


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

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



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

нет


Цитата(Fazil6 @  9.7.2006,  21:36 Найти цитируемый пост)
Не надо только начинать мне приводить всякие классы форм из NET или VCL. Это не стандарт правильного проектирования классов всилу ряда причин.

Какая GUI библиотека является стандартом и что это за ряд причин? 
PM MAIL   Вверх
Leksey
Дата 12.7.2006, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А еще вопрос можно?

как реализовать класс Vector с тремя полями x,y,z не используя доступ к данным?

Или его существование будет ошибкой проектировки? 
PM MAIL   Вверх
Daevaorn
Дата 12.7.2006, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Leksey, А чем этот Vector принципиально отличается от всего выше рассмотренного? Ничем, а значит и требования для него те же. 
PM MAIL WWW   Вверх
Fazil6
Дата 12.7.2006, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

А еще вопрос можно?

можно
Цитата

как реализовать класс Vector с тремя полями x,y,z не используя доступ к данным?

напрягаешь голову, думаешь и реализовываешь

Цитата

Или его существование будет ошибкой проектировки?
 
если он мне нахрен не надо в программе, то конечно это 
Цитата
будет ошибкой проектировки
 
PM MAIL   Вверх
UnrealMan
Дата 12.7.2006, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 27
Всего: 32



Цитата(Fazil6 @  7.7.2006,  22:09 Найти цитируемый пост)
на самом деле имеется в виду, что данные класса в правильно спроектированном классе не представляют инттереса вне класса

Даже если речь идёт о классе-наследнике? Т.е. код вроде

Код
class BaseClass
{
    DataType1 data1;
    DataType2 data2;
protected:
    DataType2 &GetData2() { return data2; }
public:
    // ...
};

class DerivedClass : public BaseClass
{
    // ...
};

это уже ошибка проектирования?

Цитата(Fazil6 @  8.7.2006,  18:21 Найти цитируемый пост)
где у меня лишний код? Хочешь выводить файл на стену или в космос - пиши соответствующего наследника Write и все в шакаладе. 

Странный код, однако :-‎)
Начнём с того, что непонятна природа SomeData. Что будут с ней делать функции write производных от Write классов? Кроме того, что мы будем делать, если нам понадобится не просто «распечатать» какое-то одно поле, а ещё и какие-то операции осуществить (причём, возможно, с несколькими полями)? Или все данные класса нужно непременно сосредоточить в одном-единственном поле d типа SomeData, и это есть хорошо?

Цитата(Fazil6 @  8.7.2006,  18:21 Найти цитируемый пост)
Write *f = new WriteInFile();
Write *p = new WriteInPrinter();

Ну это вообще шедевр, заслуживащий наивысших похвал :-‎) 
PM MAIL   Вверх
Leksey
Дата 12.7.2006, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Fazil6  А что так грубо?

Я вроде привел пример очень простого класса и просто интересно было посмотреть как его реализовать.А то может я что не так сделаю... 
PM MAIL   Вверх
Fazil6
Дата 12.7.2006, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Даже если речь идёт о классе-наследнике? Т.е. код вроде
...
это уже ошибка проектирования?

да. 
Это тоже самое, когда твои данные были бы просто protected
Если DerivedClass оперирует данными, то почему эти данные находятся в другом классе.
Данные класса - это деталь реализации, когда в наследовании принимают участия данные, то детали реализации становятся частью интерфейса, а это плохо.

Цитата

Странный код, однако :-‎)
Начнём с того, что непонятна природа SomeData.

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

Что будут с ней делать функции write производных от Write классов?

Вотм то и дело. Есть интерфейс и он определен

Код

void output(Write *w)
    {
       w->write(d);
    }


Классу по барабану, что вы будете делать с данными. Куда хотите, туда и выводите. Класс Сам решает какие данные он хочет вывести и передает их.    
Цитата

Кроме того, что мы будем делать, если нам понадобится не просто «распечатать» какое-то одно поле, а ещё и какие-то операции осуществить (причём, возможно, с несколькими полями)?
 
 Опять пишем класс на на все случаи жизни?
и что? Необходимость в доступе к данным == неправильный дизайн. Проектирование  + виртуальные функции - вот инструмент решения проблем. Сколько еще раз повторить? 

Или Вы мне надеетесь доказать, что инкапсуляция куйня?

Цитата

Или все данные класса нужно непременно сосредоточить в одном-единственном поле d типа SomeData, и это есть хорошо?

данные вне класса никому не нужны.
Представьте себе функцию swap. Функция сидит себе и ничего не делает. Вдруг ее вызвали. Она получила 2 ссылки и поменяла их значения местами. Какое ей дело кто ее вызвал? Какое ей дело кто ей эти аргументы передал? По барабану что эти данные значат. Тоже самое происходит и снаружи этой функции. Когда кто-то вызывает функцию swap ему 100% до лампады как эта функция будет выполнять то, что от нее ждут. Она выдала результат  и ауфидерзейн. Теперь представляем функцию, которая ходит за всеми и просит их дать ей 2 переменные и уж она их обработает. Бред.

Почему по вашему с классами это не Бред?
 
При хорошем проектировании вопросы, которыми вы пытаетесь меня победить не возникают вообще. 
UnrealMan, 
Цитата

Ну это вообще шедевр, заслуживащий наивысших похвал :-‎)

а тут уж что тебя не устраивает?
 
PM MAIL   Вверх
Fazil6
Дата 12.7.2006, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Fazil6  А что так грубо?

Я вроде привел пример очень простого класса и просто интересно было посмотреть как его реализовать.А то может я что не так сделаю... 

тебе показалось. Ну писать тебе класс я не буду просто пото потому, что понятия не имею, что за класс тебе нужен. Обратись в центр помощи, может там помогут.
  
PM MAIL   Вверх
likehood
Дата 12.7.2006, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

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



Fazil6, в твоем первом примере с классом Write ты говорил, что нет необходимости давать доступ  к внутренней структуре класса с помощью get/set? Если да, то твой пример ничего не объяснет, поскольку Write это абстракный класс, не содержащий никаких данных. Все данные передаются явно методу write, но откуда беруться эти данные? Если из другого класса, то здесь без get() не обойтись, а если это просто внешний объект, то причем здесь тогда инкапсуляция?
Может на более высоких уровнях абстракции и можно обойтись без get/set, то при реализации таких базовых классов как Point сложно обойтись без getX(), getY(), getZ().
Вообще, если класс представляет из себя некоторую структуру данных, то он далеко не всегда знает как эти данные обрабатывать. Тут одним наследованием и полиморфизмом не обойтись, предется открывать доступ к части данных. 
PM MAIL   Вверх
Fazil6
Дата 12.7.2006, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Fazil6, в твоем первом примере с классом Write ты говорил, что нет необходимости давать доступ  к внутренней структуре класса с помощью get/set? Если да, то твой пример ничего не объяснет, поскольку Write это абстракный класс, не содержащий никаких данных. Все данные передаются явно методу write, но откуда беруться эти данные? Если из другого класса, то здесь без get() не обойтись, а если это просто внешний объект, то причем здесь тогда инкапсуляция?
Write - это класс обрабатывающий данные. MyClass - это класс у которого есть данные (вот они!!! данные!!!), которые он хочет обработать. Ему передается "обработчик" (наследник Write) и с помощью этого обработчика(у которого тоже есть открытый интерфейс) класс MyClass обрабатывает свои данные. Никто ни у кого никакие данные здесь не запрашивает. Этому обработчику глубоко до фени откуда взялись данные, чьи они и зачем. Он знает тип этих данных и знает что с ними нужно сделать.

Добавлено @ 14:36 
Цитата

Может на более высоких уровнях абстракции и можно обойтись без get/set, то при реализации таких базовых классов как Point сложно обойтись без getX(), getY(), getZ().
Вообще, если класс представляет из себя некоторую структуру данных, то он далеко не всегда знает как эти данные обрабатывать. Тут одним наследованием и полиморфизмом не обойтись, предется открывать доступ к части данных. 

давайте всетаки не путать структуры данных и классы. Point - это всетаки данные, которые логически сгруппированы для удобства использования, а не класс. В структурах данных как раз интерес представляют сами данные и это совершенно другой вопрос. 
PM MAIL   Вверх
likehood
Дата 12.7.2006, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

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



А как класс Write получит доступ к данным SomeData?
С помощью get/set или того хуже SomeData - это структура с открытыми данными? 
PM MAIL   Вверх
Дрон
Дата 12.7.2006, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

Репутация: 10
Всего: 93



baronp, не тут идея как раз в том, что для Write доступ к SomeData не нужен.
Наоборот SomeData использует Write и внутри себя подготваливает данные в том виде, в котором Write готов их принимать.
Всё красиво в теории. Но "В теории нет разницы между теорией и практикой, на практике же она есть" (см. мою подпись).
Никогда не поверю, что можно эффективно писать не интересуясь состоянием объекта до того, как потребовать от него действия.

Вы же предпочтёте проверить сколько у вас денег в кошельке прежде, чем сделать дорогую покупку, а не говорить потом у кассы: "Ooops, an exception occured" smile   

Это сообщение отредактировал(а) Дрон - 12.7.2006, 15:53


--------------------
Да. Именно так.
PM   Вверх
likehood
Дата 12.7.2006, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

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



Цитата(Дрон @  12.7.2006,  16:49 Найти цитируемый пост)
Наоборот SomeData использует Write и внутри себя подготваливает данные в том виде, в котором Write готов их принимать.

То есть в SomeData есть метод getDataToWrite()?
Понятно, что дело не в названии метода, но чем же он в таком случае отличается от геттера? 
PM MAIL   Вверх
Fazil6
Дата 12.7.2006, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

А как класс Write получит доступ к данным SomeData?
С помощью get/set или того хуже SomeData - это структура с открытыми данными?

Повторяю : это абстрактный пример. Не важно что такое SomeData. Считайте, что это int. Вы за деревьями леса не видите.
Цитата

Вы же предпочтёте проверить сколько у вас денег в кошельке прежде, чем сделать дорогую покупку, а не говорить потом у кассы: "Ooops, an exception occured"
   
Я - класс , деньги - мои данные. Я проверяю и ничего в этом страшного нет. Это ведь в классе происходит. А вот когда на просьбу показать товар, продавец потребует показать сколько у меня есть денег...  Никого не должны интересовать мои деньги кроме меня. 
 
PM MAIL   Вверх
likehood
Дата 12.7.2006, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

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



То есть класс, содержащий данные должен знать о классах, которые будут эти данные обрабатывать (точнее, не о самих классах, а о интерфейсе Write). Если это библиотечный класс, то имхо будет сложно учесть в нем все возможные способы работы с его данными. 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0575 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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