Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > С/С++
Перезагрузить страницу Чем плохо возвращение данных из класса через неконстантные ссылки
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Rocky Rocky вне форума
Member
 
Сообщений: 1,405
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.10.2004
По умолчанию Чем плохо возвращение данных из класса через неконстантные ссылки - 28.02.2011, 19:47

Привет, комрады!

Давно хотел спросить, чем плох такой подход:

cpp Код:
//A.h
class A
{
....
private:
std::set<TMyStruct> m_roData;
public:
std::set<TMyStruct>& getData() {return m_roData;}
....
};

//A.cpp


cpp Код:
//B.h
class B
{
A *m_pA;
....
private:
void doSomeMagic() const;
....
};


//B.cpp
.....
m_pA = new A(.......);
.....
void B::doSomeMagic() const
{
std::set<TMyStruct>& roData = m_pA->getData();
//do some magic: roData.insert()/roData.erase()/etc..
}

В чем могут быть проблемы? Теряется гибкость/масштабируемость/целостность/принципы ООП или что-то еще? В смысле потенциально, могут ли возникнуть проблемы более серьезные? Если учесть что приложение однопользовательское и с одним рабочим тредом? Сильно лучше ли было бы написать полноценный класс-враппер над данными и в нем реализовать только const <myType>& getFoo(...) const (в смысле толкь get-функции, возвращающие константные ссылки на данные), а все управление делать через set-методы?
Ответить с цитированием
  (#2 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 01.03.2011, 12:23

Вообще говоря, это зависит от.

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

Лично я предпочитаю (сугубо имхо) обычно предоставлять два метода доступа - константный и (если это действительно необходимо клиентскому коду) неконстантный:
cpp Код:
const A& getA() const;
A& getA();
Нужно ли (и возможно ли, в зависимости от того, к каким последствиям это может привести в отдаленном будущем) отдавать неконстантную ссылку - решает проектировщик класса.


The difference between theory and practice is that in theory, there is no difference between theory and practice, but in practice, there is.
Ответить с цитированием
  (#3 (permalink)) Старый
Rocky Rocky вне форума
Member
 
Сообщений: 1,405
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.10.2004
По умолчанию 01.03.2011, 12:30

Ага, ясно спасибо. Я просто относительно недавно работу сменил, и если раньше я все писал и поддерживал один, то теперь все изменилось. Щас все мега "по-взрослому". Вот соответственно и стал задумываться над подобными вещами.

Просто не всегда возможно сделать управление данными класса внутри одной обертки над ними. Поэтому иногда было нужно отдавать неконстантные ссылки чтобы класс, который реально знает что нужно сделать с этими данными это делал напрямую.
Ответить с цитированием
  (#4 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 01.03.2011, 13:33

Ну, "по взрослому" такие вещи во-первых, прописываются в code convention, и во-вторых - политику работы с внутренними данными класса определяет тимлид/архитект, а не программист. Сугубо имхо мне кажется, что если "нужно отдавать неконстантные ссылки чтобы класс, который реально знает, что нужно сделать с этими данными, это делал напрямую" - либо свидетельствует о косяке в архитектуре приложения, либо это - осознанное решение, принятое под давлением обстоятельств (любых, начиная от требований к производительности, и заканчивая политическими и прочими подковерными играми руководства). Нет ли такому нетривиальному подходу какого-либо внятного объяснения в проектной документации?


The difference between theory and practice is that in theory, there is no difference between theory and practice, but in practice, there is.
Ответить с цитированием
  (#5 (permalink)) Старый
Rocky Rocky вне форума
Member
 
Сообщений: 1,405
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.10.2004
По умолчанию 01.03.2011, 14:21

У меня это было обусловлено производительностью. И не было ессно никаких архитекторов/проектировщиков, проектной документацией и пр. О том, что такие есть я вот тока пару месяцев назад узнал ))
Ответить с цитированием
Ads.
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разница между использованием глобальных данных или static при описании класса ALTOM Visual C++ 15 12.08.2008 00:02
Написание класса для обработки каждого типа данных dmitryn Вопросы начинающих программистов 11 28.01.2008 17:51
Работа с объектами класса через WinAPI Reef WinAPI 3 09.10.2007 19:11
Появление символов вместо данных класса при отладке Univer C++ Builder 2 08.10.2007 16:07
Как обратиться члену класса через его friend функцию, которая static Michael Gewlitch С/С++ 12 01.05.2007 12:32
Работа с TEdit возвращение данных Андрейка C. C++ Builder 5 30.01.2006 13:12
Работа с объектами класса CMyRect через буфер обмена Beginner23 Visual C++ 3 29.12.2005 18:34
Нужно хранить пачку данных сложной структуры внутри класса atomsk С/С++ 4 07.06.2005 02:19
Отладка Exception возвращение данных Alex1000 C++ Builder 0 24.12.2004 17:34
Регистрация класса окна через AfxRegisterWndClass Vladimir the Red Sunny Visual C++ 5 08.12.2004 12:50
CFileFind возвращение данных на ноль Karp Visual C++ 1 22.06.2004 15:42
Где найти в интернете ссылки по OLE DB и по прямому доступу к базе данных Albert MW Visual C++ 2 14.04.2003 18:53



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов