![]() |
|
Модераторы: Daevaorn |
![]()
|
|
||
|
|
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
у меня возник небольой спор, выберите, то, что вы бы использовали в своем проекте. Комментарии приветсвуются.
Заранее спасибо. |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
vinter, ответ "создам структуру(класс)" не принимается?
с помощью класса можно будет передавать оба варианта (в конструкторах) и в том же конструкторе можно будет проверить "правильность" данных + это может очистить код и ускорить работу проги (так как часто проверки на "правильность" данных дублируются в каждой из функций) |
|||
|
||||
| ama_kid |
|
|||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: 2 Всего: 95 |
имхо, очень сильно зависит от формализованности и законченности списка параметров. Если список параметров четко оговорен и типизирован - тогда предпочту параметры раскидать. Если же преполагается плавающий механизм списка параметров (а особенно, если etc подразумевает неоконченный и неизвестный на момент разработки хвост) - тогда лучше строкой...
Создавать класс ради сиюминутной единичной задачи - не всегда оправдано. -------------------- самурай без меча подобен самураю с мечом, но только без меча |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
ama_kid, я и не говорю, что всегда нужно делать так
точнее я имел в виду, что так нужно делать только в случае достаточно больших прог но в вопросе о "сиюминутности" ничего не говорится, потому я предложил еще 1 вариант. |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
||||
|
||||
| vinick |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 3 Всего: 22 |
Если нет объективных причин, то предпочту второй вариант. Т.к. лень парсить строку
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
выбрал второй вариант, однако в таком виде :
foo ("192.168.0.2:3456", "i ***","etc") ; каждая строка представляет собой определенную структуру, предназначенную для хранения данных для определенной задачи. т.е конечный вид функции условно такой
имхо парсить строку меж этих задач (Connect и SendIdentify) , да и так же применять один и тот же вид "протокола" хранения данных для каждой задачи на мой взгляд нецелесообразно. Это сообщение отредактировал(а) mes - 5.12.2008, 19:07 |
|||
|
||||
| shara |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 29.6.2004 Где: печенье? Репутация: нет Всего: 2 |
просто лень разбирать строку
-------------------- с точки зрения аэродинамики шмель не может летать |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
я бы создал класс ip::tcp::endpoint, для хоста, и класс auth::user для имени-пароля и передавал бы их, это технологичней
|
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
народ вы на названия переменных не заморачивайтесь, это просто пример
|
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
ну ты меня понял, текстовая строка это текстовая строка, тем более если она получена откуда-то извне. она должна пройти какую-то валидацию, потом должна быть проанализирована, а потом на ее основе должны быть созданы объекты, с которыми работает программа.
Но если ф-я о которой идет речь это ф-я, которая и должна создать эти объекты, то лучше передавать одну строку, так-как это эффективней(меньше фрагментация памяти, меньше разных участков памяти должно быть загружено в кэш), плюс, одно строку можно целиком обработать регулярным выражением |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
ну с точки зреняи эффективности первый вариант в любом случае проигрывает:
1. В С++ нет регулярных, а значит надо писать свой парсер, или юзать boost(который тоже не Святым Духом питается). 2. Парсинг это затраты, и эти затраты куда больше, чем затраты на фрагментацию(сомневаюсь, что она будет иметь место), к тому же я думаю лежать то они как раз убдут так же как и цельная строка, не вижу причин компилятору поступить по другому. |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
ну если нужно получить в результате не строку, а скажем число, то парсить все-равно будет нужно строки в памяти размещает не компилятор а менеджер памяти, представь что у тебя over 9000 таких строковых параметров, думаешь фрагментации не будет? хотя на самом деле это не важно в 99.9% случаев, нужно руководствоваться логикой работы программы, в одном месте более правильным может быть 1-й вариант в другом 2-й |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
разве в данном случе все не будет просто лежать последовательно в стеке? ага |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
||||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ну и что это меняет ? уж не то, что не хватает ..c_str() ? надеюсь все таки, что сомнения вызвало что то другое, ибо нигде не говорится, что упомянутая реализация класса объекта sock принимает что то иное, нежели string Добавлено через 7 минут и 46 секунд
тогда ответить на Ваш вопрос невозможно, потому что выбор способа зависит от контекста конкретной задачи.. |
|||
|
||||
| DominiK |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 11.3.2007 Где: Россия, Омск Репутация: нет Всего: нет |
Не тема, а сплошной творческий онанизм.
Звыняйте - не здержался |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
это почему это? название парметров дела не меняет, дело в передаче параметров а не их последущей обработке. Главное что внутри функции они используются раздельно и все. Остальное не важно. |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Само название дела не меняет, но смысл несенный параметром для конкретной функции меняет.
Это далеко не главное. Каждый параметр является самостоятельной сущностью и от того насколько правильно Вы ее определите будет зависть логичность архитектуры вашей функции. Некоторое время назад поднимался вопрос, что лучше передавать : много одиночных параметров или одну структуру ? Я придерживаюсь мнения, ответ лежит по середине, т.е 1 я не согласен с упаковкой в структуру, ради упаковки 2. я не согласен с расскрытой передачей, т.е когда один смысловой параметр представлен набором одиночных. т.е. Кесарю - кесарево. От вашего вопроса отличается только тем, что у Вас структура является представлена строкой. Поэтому смотрите в суть параметра и будет Вам ответ . P.S. Все вышенаписанное ИМХО. |
||||
|
|||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
mes, для меня ответ очевиден, я поэтому не создал вопрос , а создал голосование, так что я не ищу ответа, мне интересны мнения. Спасибо всем отвечающим.
|
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
первый вариант
парсинг не сложный, если строка не хаотична, а имеет определенную структуру, к примеру "<key1>=<value1>;<key2>=<value2>" -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
парсинг мб и не сложный... вона в sendmail тоже не сложный парсинг, а багов было и есть тонны...
где парсинг - там всегда гемморой. Упаковать в общем в структуру и передавать ссылку на ее - мой выбор. Во вторых будет делаться давжды работа в первом варианте (часто) : сначала склейка, потом парсинг. зачем? -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
При прочих равных - вариант №2.
|
|||
|
||||
| MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
не согласен, спорить не буду
в таком случае мы сделаем функцию зависимой от конкретных параметров т. е, к примеру есть стек функций L1->L2->L3->...->Ln L1 генерирует набор параметров, которые последовательно должны быть обработаны L2, L3, ..., Ln что лучше делать толстую структуру со всеми возможными параметрами или передавать строку, из которой каждая функция выберет нужные параметры? кроме того, а если каждый следующий уровень динамически генерирует параметры для следующего уровня? тогда L1 должна невольно знать об их существовании, а это лишняя связанность Добавлено через 2 минуты и 9 секунд
унификация представления -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
согласен, парсер не такая деталь которую стоит бояться. Другой вопрос что статическая проверка , гораздо безопаснее, чем простое динамическое использование данных, но иногда бывает необходимым использование динамических структур. Если такой подход преобладает, то Cpp/С ИМХО неправильно выбран как целевой язы
В чистом виде оба варианта плохи. Это сообщение отредактировал(а) mes - 6.12.2008, 16:44 |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
если уж заговорили о структурах: если у нас параметры вида
то, по моему, идеальный вариант параметров ф-ии это vector<pair<string,string>>. И никакие парсинги и структуры даром не нужны... |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
а сохранение в файл ? a передача данных между инстанциями ? Это сообщение отредактировал(а) mes - 6.12.2008, 18:11 |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
не, вдруг сортировка лишнее? и что не так? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
про хранение : загрузить данные в ассоциативный контейнер без парсера проблематично про передачу: то что реализация вектора (и других стл контейнеров) компиляторно зависимая и передавать их как параметры другой инстанции (из под другого компилятора) чревато сбоем. А заодно лишаемся статического контроля типов P.S. у любого способа есть свои недостатки и преимущества, и нужно просто стараться найти оптимальное решение. |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
моя твоя не понимать, у нас есть данные. Отдельно каждая строка, зачем нам парсер? если я не ошибаюсь, то по стандарту вектор обязан лежать одним куском в памяти, а значит ни о каких сбоях речи быть не может. |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
не ошибаешься точнее не вектор, а буфер, на который он показывает ошибаешься в стандарте, к примеру, не указано, что должно идкт первым - указатель на буфер в куче или размер буфера vinter, вот видишь, что такое нечетко заданный вопрос уже и в проблемы с либами полезли Это сообщение отредактировал(а) Alek86 - 6.12.2008, 18:53 |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
ну это все решаемо, просто пишем буфер вектора в другой инстанс. С такой стороны получется действительно строка будет проще(при условии, что там парсинг простой). |
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Сплошным куском должен лежать не объект-вектор, а данные которые он хранит. Также стандартизированы основной набор методов, однако способ реализации не оговаривается. как Вы думаете, что получится если описания векторов в двух программах (которые обмениваются данными в виде объектов типа вектор) будут незначительно отличаться ? например так :
Добавлено @ 19:23 а никто и не говорит, что не решаемо..и не обязательно переписывать весь буфер.. просто было продемонстрировано, что
и подходить к делу осознанно Это сообщение отредактировал(а) mes - 6.12.2008, 19:40 |
||||||
|
|||||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
mes, согласен
P.S и давай на ты, не привычно в интернете и на Вы... |
|||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
А про вариант сделать функцию перегруженной, предоставив более одного способа передачи данных, чего-то никто не вспомнил
|
|||
|
||||
| Torsten |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 10.6.2008 Где: Pskov Репутация: 3 Всего: 7 |
я за вариант
передавать строку - это точно геморой. В дополнение к тому что ее распарсить нужно, нужно так же проверить все ли параметры в ней были. Эта фактически изменит сигнатуру функции foo - т.е. уже может вернуть ошибку (не удалось распарсить), и там где функцию вызывали эту ошибку уже надо как-то обрабатывать (по хорошему конечно, имбо кодеры конечно никаких проверок не делают Это сообщение отредактировал(а) Torsten - 8.12.2008, 19:21 --------------------
We have no begining, we have no end. We are infinite. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |