КД>Правда в последнее время, мне в голову все чаще и чаще приходя мысли, что проектировать классы нужно так, чтобы у них вообще не было реализаций конструкторов и операторов копирования.
КД>
Очень здравая мысль. Я считаю что такие весчи необходимо делать только в очень маленьком к-ве случаев , например смартпоинтер.
Для тривиальных , небиблиотечных классов — это дурной тон.
Здравствуйте, fGordon, Вы писали:
КД>>К тому, что при профессиональном программировании на C++ такое не допустимо.
G>Какое недопустимо? G>Объясните, что мне инкриминируется то?
G>Есть класс, который делает чтото. Я не пишу конструктор копии. Он создается "атовматом". Ок, с этим все понятно.
G>Так где я чтото делаю "не профессионально"?
Наверное, мы о разных вещах говорим. Я не про КК, а про оператор копирования, ошибка в котором может оставить объект в некорректном состоянии.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Имхо правильно что тебя не взяли. Какие проблемы ты можешь решать если не знаешь об инструментах решения...
H>Так... map — это вроде дерево... если несортированное, то сложность поиска ничем не отличается от обычных списков. Перебирать каждый элемент и втупую сравнивать. Это O(n). Если сортированный, то на каждом шаге можно половину элементов отбрасывать (решаем, какую ветку дерева выбрать — левую или правую). То есть, это будет O(log2 n). H>Раннее связывание — во время компиляции, позднее — во время выполнения. TCP гарантирует доставку, UDP — нет, это как вещание. Про select и poll не знаю...
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Наверное, мы о разных вещах говорим. Я не про КК, а про оператор копирования, ошибка в котором может оставить объект в некорректном состоянии.
путаница в терминологии. есть "equal operator" и есть "copy constructor". по крайней мере в данной ветке вроде про них шла речь. я же упоминал только КК
собсно поэтому я и не понимаю, в чем моя вина
Здравствуйте, minorlogic, Вы писали:
КД>>Поэтому второй вариант лучше.
M>Еще меня удивляет , как Вы обеспечите то , что swap не кинет исключения , если обычное почленное копирование такую возможность предусматривает, используется некий механизм? this->swap(...) применяется целиком к объекту. Как правило, он реализуется в виде почленных-swap'ов. Считается, что swap не кидает исключений.
В первом варианте, при тупом по-членном копировании, мы могли скопировать половину объекта, а на второй произойдет ошибка. И все — ахтунг.
M>Я правильно понял что вы Сатера цитируете ?
Нет. Исключительно себя
Хотя, впрочем, про вторую технику копирования я прочитал в расширнном издании "Великого и Ужасного Страуструпа". Там две главы добавлено, в одной из которых и было это описано. Кажется.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, superman, Вы писали:
КД>>Если объекты класса с оператором копирования живут очень долго, то стараюсь делать именно так
S>э.. уж простите за занудство, мысль не уловил, как это "именно так"?
В смысле, оператор копирования через "конструктор копирования"+"swap"
S>handle-body или "так проэктировать, чтобы у них вообще не было реализаций конструкторов и операторов копирования."?
Мда. С терминологией у меня, как всегда, проблемы. handle-body — по русски что означает-то?
S>и что заначит живут долго? как на меня оно скорее зависит от того надо ли их копировать а не живут ли они долго.
Это значит, что этот объект живет не в рамках текущей операции, а был взят снаружи. Поэтому очень желательно, чтобы, не зависимо от результата выполнения этой операции, объект остался в корректном состоянии. Если у объекта есть оператор копирования (присваивания), то он должен обеспечивать атомарность.
Если же объект временный — то на все эти глупости можно забить. Даже если его состояние меняется десятки раз. Он же все равно, в конечном итоге, будет убит.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, egaron, Вы писали:
E>Как сказал коллега — есть 2 типа программистов
<skipped>
E>Естественно, на теоретических собеседованиях вторая группа бракуется и идет в отстой.
Знаете, многие тут, конечно, со мной не согласятся, но я считаю то, что вы называете теоретическим собеседованием, глупостью. С моей точки зрения человек, который отлично знает синтаксис переопределения оператора присваивания, досконально вызубрил operator precedence and associativity (простите, забыл как это по-русски), или даже во сне может назвать тип 7го параметра функции CreateFile, с практической точки зрения отличается от человека, который всего этого не помнит, только одним. А именно тем, что он будет быстрее писать код. За счет меньшего количества обращений к документации. Не больше и не меньше этого.
То есть "теоретическое собеседование" с точки зрения практической полезности находится на том же уровне, что и тест на скорость печатания на клавиатуре.
Оно не является доказательством ни того, что человек понимает хоть одну из написанных им конструкций, ни того, что он ее хоть раз в жизни применял. В бытность мою студентом второго курса я ради смеха прошел несколько brainbench-like теоретических тестов по разным языкам, при этом мои знания по некоторым из них сводились к однократному чтению учебника за день до прохождения теста и выяснения наиболее стандартных вопросов подобных тестов в интернете. Вы удивитесь, если узнаете, насколько хорошо я их тогда прошел.
В полной мере вышесказанное относится также к TOEFL-like тестам по английскому, которые я после некоторой тренировки замечательно проходил, понимая не более 10% текста и даже не улавливая общий его смысл, тестам на определение iq, которые с 5го раза проходятся на уровне гения, разного рода сертификациям и другим вещам, где можно играть на типичности вопросов и некоторых других факторах, к предмету вообще не относящихся.
Единственное, что действительно важно — это системный подход и наличие нестандартного мышления. Если человек обладает системным подходом, он одинаково здорово справится с вопросом о тестировании функции сортировки, тестировании корпоративной сети и тестировании шариковой ручки. Если у человека присутствует нестандартность мышления, он предложит лучший и более красивый способ решения задачи, чем человек, мыслящий шаблонами.
Поэтому на собеседованиях нужно спрашивать не написание конструктора копирования или реализацию паттерна singleton. Задайте ему хорошую нетипичную задачу "на подумать", которая к ним сводится. Все и выясните. А может быть, узнаете, как ее можно решить гораздо проще и эффективнее. Это если вам повезет наткнуться на действительно классного программиста. И какая разница, если где-то он пропустил "&", не поставил ";" или перепутал порядок следования операторов? В работе его спасет IDE, MSDN и google. А вот думать они его научить не смогут.
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Здравствуйте, minorlogic, Вы писали:
КД>>>Поэтому второй вариант лучше.
M>>Еще меня удивляет , как Вы обеспечите то , что swap не кинет исключения , если обычное почленное копирование такую возможность предусматривает, используется некий механизм? КД> this->>swap(...) применяется целиком к объекту. Как правило, он реализуется в виде почленных-swap'ов. Считается, что swap не кидает исключений.
КД>В первом варианте, при тупом по-членном копировании, мы могли скопировать половину объекта, а на второй произойдет ошибка. И все — ахтунг.
Ок. А если половина объекта просвопируется а половина нет ? Выброс исключения , и в чем преимущество.
Здравствуйте, minorlogic, Вы писали:
this->>>swap(...) применяется целиком к объекту. Как правило, он реализуется в виде почленных-swap'ов.
---> Считается, что swap не кидает исключений. <-----
M>Ок. А если половина объекта просвопируется а половина нет ? Выброс исключения , и в чем преимущество.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, DKM_MSFT, Вы писали:
DKM>Знаете, многие тут, конечно, со мной не согласятся, но я считаю то, что вы называете теоретическим собеседованием, глупостью.
[skip]
А я вот покажу, что в такой глупости есть доля смысла. Дело в том, что на собеседование может прийти:
1. Полный профан, который не имеет реального опыта и даже не потрудился вызубрить синтаксис.
2. Человек, имеющий опыт. Т.к. он много всякого написал на C++, у него ужё до автоматизма дошли такие вещи.
3. Человек без реального опыта, но хорошо вызубривший синтаксис С++ (а так же ООП-терминологию, паттерны и т.д.)
В идеале хотелось бы взять (2). Но не всегда можно понять, то ли человек имеет реальный опыт, то ли он вызубрил. Так хотя бы собеседование позволяет отсеять группу (1), что тоже не так уж плохо. Да и неизвестно, что получится с вариантом (3). Может, он окажется пустышкой и испытательный срок это покажет. А может, у человека по объективны причинам не было опыта (мало ли, может он из другого города, где совершенно нет никакого IT) и на испытательном сроке он покажет способности к обучению, получит минимальный опыт.
А вообще, кто знает универсальную и абсолютно точную методологию выявляения класса (2), пусть первым кинет в меня камнем. Так уж устроен мир.
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Здравствуйте, minorlogic, Вы писали:
this->>>>swap(...) применяется целиком к объекту. Как правило, он реализуется в виде почленных-swap'ов.
--->> Считается, что swap не кидает исключений. <-----
M>>Ок. А если половина объекта просвопируется а половина нет ? Выброс исключения , и в чем преимущество.
Я понимаю , но какое именно метафизическое свойство нам гарантирует что своп не выкинет исключения ? У кого считается ? Какой механизм нам позволит делать своп для произвольных мемберов ?
Здравствуйте, minorlogic, Вы писали:
M>Очень здравая мысль. Я считаю что такие весчи необходимо делать только в очень маленьком к-ве случаев , например смартпоинтер. M>Для тривиальных , небиблиотечных классов — это дурной тон.
Аргументы?
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Здравствуйте, minorlogic, Вы писали:
this->>>>>swap(...) применяется целиком к объекту. Как правило, он реализуется в виде почленных-swap'ов.
--->>> Считается, что swap не кидает исключений. <-----
M>>>Ок. А если половина объекта просвопируется а половина нет ? Выброс исключения , и в чем преимущество.
M>Я понимаю , но какое именно метафизическое свойство нам гарантирует что своп не выкинет исключения ? У кого считается ? Какой механизм нам позволит делать своп для произвольных мемберов ?
Выносишь состояние объекта в отдельный класс, объекты которого создаются динамически (в куче).
swap состояний сведется к обмену указателей на них
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Коваленко Дмитрий, Вы писали:
this->>>>swap(...) применяется целиком к объекту. Как правило, он реализуется в виде почленных-swap'ов. --->> Считается, что swap не кидает исключений. <-----
23.1.10:
— no swap() function throws an exception unless that exception is thrown by the copy constructor or
assignment operator of the container’s Compare object (if any; see 23.1.2).
По-моему, вы все напутали, и правильный оператор копирования реализуется немного не так. Нужно использовать не swap самого объекта, а по очереди swap каждого члена класса. А соответственно каждый член класса должен тоже иметь exception-safe конструктор копирования и оператор копирования.
Здравствуйте, i-maverick, Вы писали:
this->>>>>swap(...) применяется целиком к объекту. Как правило, он реализуется в виде почленных-swap'ов. --->>> Считается, что swap не кидает исключений. <-----
IM>23.1.10: IM>— no swap() function throws an exception unless that exception is thrown by the copy constructor or IM>assignment operator of the container’s Compare object (if any; see 23.1.2).
IM>По-моему, вы все напутали, и правильный оператор копирования реализуется немного не так. Нужно использовать не swap самого объекта, а по очереди swap каждого члена класса. А соответственно каждый член класса должен тоже иметь exception-safe конструктор копирования и оператор копирования.
Вообще говоря, вы бы лучше маленький пример "правильного оператора копирования" привели... А то мне кажется что вы просто пытаетесь придавить меня интеллектом
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, superman, Вы писали:
S>Здравствуйте, Коваленко Дмитрий, Вы писали:
S>мысль понял, благодарю
КД>>Мда. С терминологией у меня, как всегда, проблемы. handle-body — по русски что означает-то?
S>дык S>
S>Выносишь состояние объекта в отдельный класс, объекты которого создаются динамически (в куче).
Здравствуйте, konsoletyper, Вы писали:
K>Здравствуйте, DKM_MSFT, Вы писали:
DKM>>Знаете, многие тут, конечно, со мной не согласятся, но я считаю то, что вы называете теоретическим собеседованием, глупостью.
K>[skip]
K>А я вот покажу, что в такой глупости есть доля смысла. Дело в том, что на собеседование может прийти:
K>1. Полный профан, который не имеет реального опыта и даже не потрудился вызубрить синтаксис. K>2. Человек, имеющий опыт. Т.к. он много всякого написал на C++, у него ужё до автоматизма дошли такие вещи. K>3. Человек без реального опыта, но хорошо вызубривший синтаксис С++ (а так же ООП-терминологию, паттерны и т.д.)
K>В идеале хотелось бы взять (2). Но не всегда можно понять, то ли человек имеет реальный опыт, то ли он вызубрил.
Вызубрить можно только Yes/No вопросы (ну и чисто синтаксис), которые дают на тестах. Дайте человеку вопрос на понимание (например, код с ошибкой), заставьте его думать и тут вы его раскроете.
K> Так хотя бы собеседование позволяет отсеять группу (1), что тоже не так уж плохо. Да и неизвестно, что получится с вариантом (3). Может, он окажется пустышкой и испытательный срок это покажет. А может, у человека по объективны причинам не было опыта (мало ли, может он из другого города, где совершенно нет никакого IT) и на испытательном сроке он покажет способности к обучению, получит минимальный опыт.
Ну (1) сразу отсеивается. (3) можно отсеять следующим образом: попросите его предолжить решение небольшой проблемы и аргументировать почему надо действовать так а не иначе. Какой паттерн лучше применить, заставьте его рассуждать. Ну и естественно надо дать задание на написание кода (на компьютере с MSDN/man/Internet), вплоть до банальщины — деревья, сортировки, строки. По стилю уже многое ясно (проверки на ошибки, внятность наименования переменных, хотя бы).
Ну и надо применять банальную логику — проанализируйте что человеку предполагается делать у вас в компании и спрашивайте соответствующие use-case — микрозадачи, возникающих в течение дня.
K>А вообще, кто знает универсальную и абсолютно точную методологию выявляения класса (2), пусть первым кинет в меня камнем.
Посмотреть резюме с указанием предыдущих мест работы ?