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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> наследование от классов STL 
V
    Опции темы
azesmcar
Дата 17.2.2011, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



Цитата(borisbn @  17.2.2011,  21:15 Найти цитируемый пост)
azesmcar, в вашем примере чем такое


Цитата(borisbn @  17.2.2011,  21:15 Найти цитируемый пост)
лучше, чем

Конкретно это я писал в ответ на вопрос, почему свободные функции предпочтительнее методов и чем плохи монолитные классы. 
Давайте углубимся в детали. Программист написал функцию метод, работающую для контейнера vector. Функция работает используя итераторы. Теперь мне тоже необходима эта функция и мне придется дублировать код, хотя этот код мог быть написан в виде свободной функции и использоваться для каждого контейнера (хороший пример алгоритмы STL).

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

Добавлено через 1 минуту и 31 секунду
Цитата(borisbn @  17.2.2011,  21:15 Найти цитируемый пост)
жесть... не верю  

я бы показал, там еще много смешного, но я оттуда 4 года назад уволился smile 
причем писал не индус какой нибудь, а американец, с высшим американским образованием. smile 
PM   Вверх
mes
Дата 17.2.2011, 22:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(borisbn @  17.2.2011,  19:50 Найти цитируемый пост)
 является наличие тесной связи (зависимостей), которые 1) замедляют компиляцию 2) принуждают тянуть за собой набор h-ников
и всё ?

Вы явно упускаете все, что Вам уже не одним постом пытаются объяснить..
скорость компиляции и тяга это все все мелкие проблемы..  самая главная проблема в напряжении мозга наличием лишних сущностей.. 
все остальное ерунда.. 
если в программа основанна на уже упомянутом классе string, то пусть будет что угодно, хоть "format c: "
но если Вы хотите строить из удобных кирпичиков, которые не нужно три дня шлифовать, прежде чем состыковать, 
и иметь такую стену, в которой при замене кирпича на другой аналогичный не нужно заново перебирать всю постройку, то тогда думаю стоит обратить более пристальное внимание на советы, приведенные выше... 



--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 17.2.2011, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



Мы тут говорим о двух моментах одновременно и все запутывается. Давайте разберемся.

имеем два утверждения.

1. класс не должен быть монолитным и должен предоставлять минимально возможный интерфейс. Остальные функции, которые можно написать на основе public интерфейса класса должны быть свободными.
2. не надо наследовать класс, если это НЕ необходимо.

Первый пункт возник из за приведенного ТС примера. По первому пункту все есть еще разногласия?

Это сообщение отредактировал(а) azesmcar - 17.2.2011, 22:35
PM   Вверх
alexvs11
Дата 17.2.2011, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


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

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



azesmcar, первый вопрос менее очевидный
PM MAIL   Вверх
mes
Дата 17.2.2011, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(borisbn @  17.2.2011,  20:15 Найти цитируемый пост)
в вашем примере чем такое:
Код

bool empty() const {
  return begin() == end();
}

лучше, чем
Код

bool empty(const T& c) {
    return c.begin() == c.end();
}



советую поразмышлять, чем отличается свободная функция swap от одноименного члена.. где лежат их области применения.. 
и почему одна не может заменить другую..
smile



--------------------
PM MAIL WWW   Вверх
maxim1000
Дата 17.2.2011, 23:55 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 17
Всего: 110



попробую ещё с двух сторон взгляд предоставить
(вообще-то думал с одной, но пока писал, увидел вторую smile)

1. с точки зрения пользователя дополнительной функциональности
Код, написанный в take_front, по сути, подходит для любого deque, однако он требует чтобы объект был именно типа MyDeque. Как объяснить пользователю (другому программисту) какими причинами руководствовался разработчик, когда добавлял такое ограничение? Чего ради?

2. с точки зрения разработчика дополнительной функциональности
Наследование, как способ расширения функциональности, не очень хорошо масштабируется.

Например, есть у нас std::deque.
Класс хороший, но кому-то не нравится, что там нет функции remove_first_half_of_elements. Решение простое - наследуем класс, добавляем метод.

Другому программисту не нравится, что нет функции duplicate_all_elements. Решение простое - наследуем класс, добавляем метод.

Третьему программисту захотелось и того, и того. Решение очевидное - множественное наследование (ну не писать же код заново). Сразу же выясняется, что наследование от std::deque не виртуальное, нужно править код.

Каждая новая комбинация желаемой функциональности - новый класс (т.е. количество классов экспоненциально растёт). Альтернатива - создать один класс, в который впихнуть все расширения. Теперь у пользователей нет возможности не зависеть от новой функциональности, которая (потенциально) тянет за собой кучу других ненужных зависимостей...

Сравним с внешними функциями: хочешь функцию - подключай h-файл и пользуйся. Тянет какие-то зависимости - подключай и тягай с собой дополнительные библиотеки. Но только для той функциональности, которая тебе реально нужна. Не больше. Красота smile

Это сообщение отредактировал(а) maxim1000 - 17.2.2011, 23:59


--------------------
qqq
PM WWW   Вверх
alexvs11
Дата 18.2.2011, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


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

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



maxim1000, да, это похоже на правду жизни
в некоторых проектах постоянное добавление функциональности приводит к появлению глубокой иерархией в этак > 10 классов, перемежая с множественным наследованием ( обязательно где-нибудь встретится повторное наследование smile )
этакий архитектурный коллапс

Это сообщение отредактировал(а) alexvs11 - 18.2.2011, 00:11
PM MAIL   Вверх
volatile
Дата 18.2.2011, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 37
Всего: 85



Цитата(borisbn @  17.2.2011,  18:16 Найти цитируемый пост)
Не раз слышал, что наследоваться от STL-классов - не есть хорошо

Ну и темка разрослась, по неосторожно брошенному мной вчера слову.
Спасибо всем, почитал с удовольствием.
А вообще, мое мнение такое. Если программер точно знает что делает, то на здоровье! Страуструп, например, где-то наследуется в своей книге от вектора. 
Ну ему можно (так же как и всем кто досконально понимает, что делает).
Сам я от стл никогда не наследуюсь. Так как далеко мне еще до глубокого понимания механизмов...
А вот goto, например, иногда применяю. И плевать, что там подумают. Есть случаи когда это оправдано.
так-же и здесь, вероятно есть случаи когда стоит нарушить правила. 
Но до этого нужно сначала дорости.

PM MAIL   Вверх
azesmcar
Дата 18.2.2011, 06:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

Репутация: 81
Всего: 211



Цитата(volatile @  18.2.2011,  01:34 Найти цитируемый пост)
Страуструп, например, где-то наследуется в своей книге от вектора.

То было private наследование.
Цитата(volatile @  18.2.2011,  01:34 Найти цитируемый пост)
А вот goto, например, иногда применяю. И плевать, что там подумают. Есть случаи когда это оправдано.

Один раз писал алгоритм и казалось вот он тот случай, мне нужен goto! Порадовался, но сделал с помощью switch. smile 
Код

template <typename M1, typename M2, typename M3, typename M4, typename M5>
bool try_lock_without_deadlock(M1& m1, M2& m2, M3& m3, M4& m4, M5& m5)
{
    int locked = 0;
    switch (locked)
    {
    case 0: if (!m1.try_lock()) break; ++locked;
    case 1: if (!m2.try_lock()) break; ++locked;
    case 2: if (!m3.try_lock()) break; ++locked;
    case 3: if (!m4.try_lock()) break; ++locked;
    case 4: if (!m5.try_lock()) break; ++locked;
    }
    switch (locked)
    {
    case 5: return true;
    case 4: m4.unlock();
    case 3: m3.unlock();
    case 2: m2.unlock();
    case 1: m1.unlock();
    }
    return false;
}


Цитата(maxim1000 @  17.2.2011,  23:55 Найти цитируемый пост)
Сравним с внешними функциями: хочешь функцию - подключай h-файл и пользуйся. Тянет какие-то зависимости - подключай и тягай с собой дополнительные библиотеки. Но только для той функциональности, которая тебе реально нужна. Не больше. Красота 

причем разница только в синтаксисе вызова
Код

function(obj);

и
Код

obj.function();



Это сообщение отредактировал(а) azesmcar - 18.2.2011, 06:13
PM   Вверх
borisbn
Дата 18.2.2011, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 22
Всего: 135



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

Цитата(mes @  17.2.2011,  22:10 Найти цитируемый пост)
но если Вы хотите строить из удобных кирпичиков, которые не нужно три дня шлифовать, прежде чем состыковать, и иметь такую стену, в которой при замене кирпича на другой аналогичный не нужно заново перебирать всю постройку, то тогда думаю стоит обратить более пристальное внимание на советы, приведенные выше... 

это то ясно, не первый раз замужем smile
Понимаете, я поднял тему вовсе не потому, что защищаю наследование от STL-классов, а потому, что внятного объяснения почему это плохо не видел. Впрочем также, как и использование goto, что не значит, что я буду говорить направо и налево: "использование goto - хорошо".

ok, всем большущее спасибо. закрываю "для галочки", но мониторить буду, так, что, если есть ещё мысли/идеи - welcome smile


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 18.2.2011, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(borisbn @  18.2.2011,  08:53 Найти цитируемый пост)
 наследование от STL-классов, а потому, что внятного объяснения почему это плохо не видел. 

это не плохо  smile , просто "любой" другой вариант в общем случае лучше  smile

Добавлено через 39 секунд
а если есть лучшее, то зачем создавать себе лишние неудобства ?.. smile

Добавлено через 1 минуту и 32 секунды
а так любое решение - плохое, но из двух зол принято выбирать меньшее © smile

Добавлено через 3 минуты и 13 секунд
в общем при открытом наследовании от стл контейнера, его ценность как класса падает.. 
а при использовании свободной функции, ценность самого класса не изменяется, а появляется еще возможно ценная функция smile




--------------------
PM MAIL WWW   Вверх
volatile
Дата 18.2.2011, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 37
Всего: 85



 smile 
Цитата(azesmcar @  18.2.2011,  06:10 Найти цитируемый пост)
Один раз писал алгоритм и казалось вот он тот случай, мне нужен goto! Порадовался, но сделал с помощью switch

Да, но смысл явно здесь затуманен. Первый свитч вообще не понятно зачем. Некоторые для этой же цели любят применять
do{...; break; ...}while(0); лишь бы не применять goto. Зачем такие ухищрения? С goto было бы ясней. smile. А чем ясней, тем лучше.

PM MAIL   Вверх
mes
Дата 18.2.2011, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(volatile @  18.2.2011,  22:49 Найти цитируемый пост)
С goto было бы ясней

volatile, если приведете пример с goto, который будет структурно ясней, "заработаете" +1 в репу  smile 



--------------------
PM MAIL WWW   Вверх
volatile
Дата 19.2.2011, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 37
Всего: 85



Цитата(mes @  18.2.2011,  23:56 Найти цитируемый пост)
если приведете пример с goto, который будет структурно ясней

Ну, собственно само напрашивается...
(просто убрал первый свитч, с ненужными case'ми который, имхо, и затуманивает дело.)
Код

template <typename M1, typename M2, typename M3, typename M4, typename M5>
bool try_lock_without_deadlock(M1& m1, M2& m2, M3& m3, M4& m4, M5& m5)
{
    int locked = 0;
    if (!m1.try_lock()) goto exit; ++locked;
    if (!m2.try_lock()) goto exit; ++locked;
    if (!m3.try_lock()) goto exit; ++locked;
    if (!m4.try_lock()) goto exit; ++locked;
    if (!m5.try_lock()) goto exit; ++locked;

exit:
    switch (locked)
    {
    case 5: return true;
    case 4: m4.unlock();
    case 3: m3.unlock();
    case 2: m2.unlock();
    case 1: m1.unlock();
    }
    return false;
}

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


любитель
****


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

Репутация: 144
Всего: 250



Цитата(volatile @  19.2.2011,  00:09 Найти цитируемый пост)
просто убрал первый свитч, 

ну так о я могу.. ну да ладно, пусть один.. smile
но где ж обещанная ясность ? структура кода та же, а еще приходится глазами выискавать метку... smile
 smile

Цитата(volatile @  18.2.2011,  22:49 Найти цитируемый пост)
любят применять
do{...; break; ...}while(0); лишь бы не применять goto

применительно к этой задачи он, имхо, удачнее подходит, чем goto или switch..

Это сообщение отредактировал(а) mes - 19.2.2011, 01:34


--------------------
PM MAIL WWW   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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