1 | ||||||||||||||||
Тестовое задание от работадателя. Хотелось бы услышать критику.26.08.2011, 13:12. Показов 8532. Ответов 24
Метки нет Все метки)
(
Пробую устроиться программистом. Вот одна из компаний выслала мне тестовое задание следующего содержания:
Вот код (сразу оговорюсь, что решение уже отправил, поэтому что-то менять поздно. Принципиально не хотел лезть за помощью на форум)) Command.h
Во первых избежать бесконечного числа if-else при обработке аргументов. Во вторых максимально облегчить добавления новых ключей в программу и их последующую обработку. Хотелось бы услышать конструктивную критику от адекватных людей ![]() Не по теме: так и не понял причину, но MinGW напрочь отказывается компилировать этот код, выводя ошибки в системных файлах (ios_base.h и т.д.). Понятно, что ошибки не там, а в передаваемых туда аргументах, но решить проблему так и смог, ибо мозг что-то уже закипает.
2
|
|
26.08.2011, 13:12 | |
Ответы с готовыми решениями:
24
Хотелось бы услышать конструктивную критику Можно услышать критику Хотелось бы услышать мнение о сайте |
Заблокирован
![]() |
||||||
26.08.2011, 13:39 | 2 | |||||
Моё мнение - о МАЙ ГАД СКОЛЬКО ВСЕГО НАПИСАНО, чтобы просто вывести на экран
0
|
26.08.2011, 15:04 [ТС] | 3 | |||||
-=ЮрА=-, непонял...
так суть задания не в этом. Добавлено через 25 минут Не по теме: Блин, разобрался) Компиляторы в MSVS 2010 и MinGW по разному этот код строят:
Добавлено через 28 минут Нда, не ожидал я столь оперативный ответ с их стороны. В общем накосячил) Ниже коментарии их экспертов. Коментарии
2) Да, надо было заполнять valarray по другому. 3)Ну что сказать, полностью согласен) 4)Каюсь, грешен) 5) Это я увидел в исходниках Linux, подумал типа так модно) Что ж, учту на будущее.
0
|
![]() |
||||||
26.08.2011, 15:58 | 5 | |||||
Kastaneda, взяли бы какой-нибудь getopt или boost::programm_options для обработки ключей.
Ну или на край. Я обычно примерно так делал (код не рабочий, написал только что "на коленках"!):
1
|
![]() 7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
26.08.2011, 16:15 | 6 |
getopt() рулит
Видимо ТС не видел его ни разу
0
|
26.08.2011, 16:15 [ТС] | 7 |
Да я на самом деле целенаправленно напихал в код "много С++") Первая мысль была написать вообще извращенный вариант, дабы продемонстрировать владение различными С++ трюками. Из фразы в задании
Просто не приходилось еще писать тестовых заданий, потому вот первый блин комом) Не додумал, не перепроверил, поспешил и т.д. Ну да ладно ![]()
0
|
![]() 7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
26.08.2011, 16:18 | 8 |
С другой стороны - getopt() это ведь ни разу не C++
![]()
0
|
![]() |
|
26.08.2011, 16:22 | 9 |
Kastaneda, если писать на C++ и не использовать boost... В любом случае класс Command не должен содержать в себе основной код приложения. Он должен лишь разбирать ключи. У Вас все замешано в одном классе. Кажется в народе это называется "blob"
![]() В моем примере я пытался передать идею разделения интерфейса и логики (пусть он и выполнен на Си). И структура options выступает в роли посредника между парсером ключей и основной логикой программы.
1
|
26.08.2011, 16:45 | 10 | |||||||||||||||
жуткая смесь с и с++
как пример:
Яб только тестером взял.
1
|
![]() |
|
26.08.2011, 16:56 | 13 |
Не по теме: И это все? Да, некрасиво, конечно. Но имхо недостаточно для фразы "жуткая смесь" :D И мы все ждем Вашего варианта решения. Надо же узнать на какую должность взять Вас работать ![]()
0
|
2021 / 1620 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
|
|
27.08.2011, 13:22 | 15 |
Несколько слов по коду в целом: количество отступов то 8, то 16, то ещё непонятно сколько
![]() std::map<std::string,std::string>::iterator it=valuekey.begin(); как будет выглядеть цикл for c в данном случае даже представить страшно... Для решения задач на форуме это нормально, но не для реального кода... Исключения перехватывают по ссылке, а не по значению(читай Майерса). А сам класс, такое впечатление, умеет делать абсолютно всё и даже больше... Остаётся ещё возможность проигрывания музыки туда вставить для полного счастья ))
1
|
27.08.2011, 14:23 [ТС] | 16 |
Спасибо)
Вчера понял для себя очень важную вещь - не умею грамотно строить архитектуру кода. Что ж, буду наверстывать! Читал, тут не совсем тот случай, чтобы перехват по значение приводил к какой-то беде. Ведь главная причина перехвата по ссылке - это получить полный объект (а не урезаный до базового) в случае если перехватываем бызовый объект, а в исключение кидаем производный. Но все равно следовало бы конечно перехватывать по ссылке, хотя бы для того, чтобы избежать ненужного копирования длинных строк. Давно заметил за собой эту беду, но вот как с ней бороться - незнаю. Пока решил отложить в сторону книги по С++ (синтаксис знаю на достаточном уровне, но, как оказлось, глубокое знание синтаксиса не застрахует от быдлокода) и читать конкретно по ООП. Думаю поможет) Добавлено через 44 минуты Может кто-нибудь накидает "набросок" для реализации этой задачи? Т.е. просто скелет без реализации в стиле ООП? Код fasked из 5-го поста конечно хороший пример, но если я захочу написать это в стиле С++, то куда мне засунуть ф-цию parse_options ? Что-то не могу сообразить, первая мысль - сделать из нее функтор (т.е перегрузить в классе оператор () ), но есть ощущение, что это неверное решение.
0
|
2021 / 1620 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
|
|
27.08.2011, 16:44 | 17 |
Плохо читал значит, беда здесь в вызове лишнего конструктора копирования
http://codepad.org/sqMI3b8G - по ссылке http://codepad.org/8pbbWySH - по значению Т.е. копирование происходит в любом случае, но при перехвате исключений по значению оно(копирование) происходит дважды(у Майерса это всё достаточно подробно расписано).
0
|
![]() 2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
|
||||||
27.08.2011, 17:51 | 18 | |||||
Kastaneda, вот набросок дизайна, от которого, я думаю, можно оттолкнуться:
2
|
![]() 2378 / 1662 / 279
Регистрация: 29.05.2011
Сообщений: 3,396
|
|
27.08.2011, 19:29 | 20 |
Просто потоковые объекты должны передаваться по ссылке или по указателю, а не по значению, так как вызов конструктора копирования для них не допускается. Правда при этом не удастся создавать их во время вызова функции. Придётся сначала создать объект, а потом использовать его в качестве аргумента функции.
0
|
27.08.2011, 19:29 | |
Помогаю со студенческими работами здесь
20
Хотелось услышать мнения профессионалов Хотелось бы услышать Ваше мнение о блоках питания FAST Хотелось бы услышать ваши мнения советы (игр компьютер на Intel Core i5-2500 ВОХ + ASUS ENGTX570 DCII/2DIS/1280MD5)) тестовое задание Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |