Здравствуйте, B0FEE664, Вы писали:
BFE>Пример на 7:07 class invariant
BFE>То, что эти данные приватные ничего не меняет, если вектора два, то должен существовать код обеспечивающий их инвариантность... BFE>Фактически это архитектурно неверное решение, так как нам надо заниматься согласованием двух независимых объектов xs и ys.
Не понял с чем ты не согласен. Два вектора это данность, это просто пример двух классов членов другого класса, между которыми нужно поддерживать строго определённый набор состояний. Он просто таким образом иллюстрирует зачем нужен класс и что такое поддержка инварианта. Представь что ты не можешь их объединить, что это два независимых класса, какие-нибудь: gl::vector и dx::vector.
Если инвариант не нужен, то и класс не нужен. Достаточно структуры.
BFE>И далее всё так же...
Дальше всё совсем не об этом.
Здравствуйте, Videoman, Вы писали:
V>Не понял с чем ты не согласен. Два вектора это данность, это просто пример двух классов членов другого класса, между которыми нужно поддерживать строго определённый набор состояний. Он просто таким образом иллюстрирует зачем нужен класс и что такое поддержка инварианта. Представь что ты не можешь их объединить, что это два независимых класса, какие-нибудь: gl::vector и dx::vector.
Ну, если у нас такая ситуация, то у нас проблема: ошибка проектирования. Но каким образом это относится к Value Semantics ?
V>Если инвариант не нужен, то и класс не нужен. Достаточно структуры. BFE>>И далее всё так же... V>Дальше всё совсем не об этом.
Не об этом, но в таком же стиле. Какие-то не связанные друг с другом задачи и не относящиеся к ним решения.
Там по делу наверное только про сортировку, но:
— то, что при наличии возможности перемещать объекты, объекты следует перемещать, а не передавать на них ссылки говорилось сразу после введения С++11.
— что будет с вектором, когда (на 35:44) при сортировке будет брошено исключение? Потеряем все данные?
К чему там всё остальное вообще не понятно. Если память не ресурс, то на каждое изменение копируем значение — это теория программирования первого курса университета.
Здравствуйте, B0FEE664, Вы писали:
BFE>Ну, если у нас такая ситуация, то у нас проблема: ошибка проектирования. Но каким образом это относится к Value Semantics ?
Да что ты привязался к конкретике. Он просто объясняет что такое инвариант, зачем нужен класс и что по его мнению инварианты легко нарушить с reference semantics.
BFE>Там по делу наверное только про сортировку, но: BFE>- что будет с вектором, когда (на 35:44) при сортировке будет брошено исключение? Потеряем все данные?
Не знаю что ты увидел на 35:44, не понятно, приведи пример
BFE>К чему там всё остальное вообще не понятно. Если память не ресурс, то на каждое изменение копируем значение — это теория программирования первого курса университета.
Тут фиг поспоришь. Функциональное программирование наше всё. Жалко что на практике память тоже нужна.
Здравствуйте, night beast, Вы писали:
NB>то есть это его надо благодарить за то что коллекцию библиотек превратили в хренов монолит, вытащить что-то из которого тот еще геморрой?
А я так и не понял, зачем оттуда что-то вытаскивать. Место на диске экономить? Или какие-то религиозные заморочки?
Что не используешь — то не мешает. Зато установить можно разом, а не возиться из-за каждой новой понадобившейся фичи.
Есть, правда, еще лицензионные политики, но с ними вопросы не к бусту, а к тем, кто эти политики навязывает — у буста очень удобная лицензия для любого рода проектов.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, ути-пути, Вы писали:
NB>>то есть это его надо благодарить за то что коллекцию библиотек превратили в хренов монолит, вытащить что-то из которого тот еще геморрой?
УП>А я так и не понял, зачем оттуда что-то вытаскивать. Место на диске экономить? Или какие-то религиозные заморочки? УП>Что не используешь — то не мешает. Зато установить можно разом, а не возиться из-за каждой новой понадобившейся фичи.
затем что мне не нужно в проекте то, что я не использую
если кто-то тащит к себе всякое г-но со своими зависимостями, только потому что это модно, то это его личные трудности.
Я долго откладывал написание соображений на эту тему. В начале думал создать отдельный пост.
Я написал версию двух вспомогательных шаблонов cref<T> и in<T> , служащих для передачи параметров в функцию.
Как на ваш взгляд можно сделать лучше?
in<T> мувает полученный параметр во внутреннее состояние с предоставлением доступа на запись/чтение.
Его нестатический метод move() нужен к примеру чтобы вернуть значение из функции.
Про inout<> и ref<> я напишу отдельно (скорее всего ответом на исходную тему).
std::array мувать смысла видимо нет, вот для него и ref<> сойдёт.
Зачем вам нужен make_cref()? Напомню, что такой cref предназначен лишь для входных параметров функции.
А вы его возвращаете из return и используете не по назначению.
Это просто чтобы не писать const type & — а для наглядности. Но какой в этом тогда смысл?
Его определение можно по желанию переписать для trivial типов через std::conditional, чтобы они по const копии передавались, а не по ссылке.
Например зачем char передавать по конст ссылке?
S>Зачем вам нужен make_cref()? Напомню, что такой cref предназначен лишь для входных параметров функции.
1. Из чего следует, что cref нельзя использовать так, как показал я?
2. Что случится плогого, если доработать его таким образом, чтоб он гарантированно обеспечивал константную ссылку и соответствовал своему названию?
S>Это просто чтобы не писать const type & — а для наглядности. Но какой в этом тогда смысл? S>Его определение можно по желанию переписать для trivial типов через std::conditional, чтобы они по const копии передавались, а не по ссылке. S>Например зачем char передавать по конст ссылке?
Ну то есть, он нужен только для того, чтоб мешать программистам объявлять типы формальных параметров функций так как им хочется. Офигенно полезная утилита
Здравствуйте, Sm0ke, Вы писали:
S>Зачем вам нужен make_cref()? Напомню, что такой cref предназначен лишь для входных параметров функции. S>А вы его возвращаете из return и используете не по назначению.
Ну, хорошо, можно и без make_cref, и без return. В таком примере все "по назначению"?
Здравствуйте, Sm0ke, Вы писали:
S>Его определение можно по желанию переписать для trivial типов через std::conditional, чтобы они по const копии передавались, а не по ссылке.
После чего сразу же поломается возможность автоматического выведения типов при использовании этого cref для задания типов формальных параметров шаблонов функций.
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, Sm0ke, Вы писали:
S>>Зачем вам нужен make_cref()? Напомню, что такой cref предназначен лишь для входных параметров функции. S>>А вы его возвращаете из return и используете не по назначению.
R>Ну, хорошо, можно и без make_cref, и без return. В таком примере все "по назначению"?
R>http://coliru.stacked-crooked.com/a/c4d021b1f60b8384
R>
Здравствуйте, Videoman, Вы писали:
V>- С++ отлично поддерживает value types, поэтому используйте эту возможность по максимуму, где это возможно и не будете иметь каскад описанных в докладе проблем.
А что, многие имели каскад описываемых проблем? Вот всю жизнь так делали и вот тебе на, оказывается проблемы на ровном месте. V>- Reference types — тоже самое, что глобальные переменные, поэтому избегайте эту семантику как только можете.
Скоуп всё же меньше, не надо драматизировать и нагнетать. В рамках этого скоупа можно легко понять кто и что меняет. V>А интересным он показался мне потому, что я, неосознанно, сам начал скатываться к тем же методам что используются в докладе, но не мог четко обосновать самому себе. Особенно актуально в свете массовой многопоточки и параллельности.
Это будет работать если обеспечить атомарность конструктора копирования или перемещения, тогда можно будет запускать несколько функций в разных потоках не беспокоясь о гонках, т.к. все они будут работать со своей копией данных.
Ещё коллега B0FEE664 задал корректный вопрос про исключение при move. V>Интересно мнение коллег, кто что думает на эту тему?
Насмотрелись на иммутабельность в функциональных языках и тащат теперь везде. Я думаю проблема связана больше с конструкциями async/await в итоге, чем с тем что он приводил как "проблему".
Здравствуйте, B0FEE664, Вы писали:
BFE>То, что эти данные приватные ничего не меняет, если вектора два, то должен существовать код обеспечивающий их инвариантность... BFE>Фактически это архитектурно неверное решение, так как нам надо заниматься согласованием двух независимых объектов xs и ys. "заниматься согласованием" — это означает дополнительную работу, дополнительный код, который занимается согласованием, для обеспечения инвариантности. Но смотрите: если объединить x и y в одну структуру, то у нас останется один вектор xy для которого инвариантность соблюдается автоматически! И никакого дополнительного кода, никаких проверок не надо.
BFE>И далее всё так же...
Т.е. поработали над 2мя типами структур, сделали 1у и теперь всё норм? Можно лишь 1 вектор. Звучит не плохо. Т.е. он же, к примеру, работал с тем что ему дали. И сказал почему это плохо. Может, мы можем провести аналогии и к нашему коду и сделать подобное улучшение, что он показал.