Библиотека для распространения
Наконец мы можем модифицировать тестирующую программу и проверить эту версию библиотеки: поскольку копия строки ввода сохраняется (чего в прототипе не было), появилась возможность распечатывать сначала исходную строку, а потом уже полученные поля:
На этом версия на С завершена. Она обрабатывает строки произвольной длины и делает нечто осмысленное даже при некорректном вводе. В результате нам пришлось написать в четыре раза больше кода, чем в прототипе, при этом некоторые фрагменты получились довольно запутанными. Подобное увеличение объема и сложности кода – совершенно типично для перехода от прототипа к полноценному продукту.
Упражнение 4.1
При разделении полей возможно несколько уровней "ленивости" – разделять сразу все поля, но только после получения запроса на конкретное поле, выделять только запрошенное поле и, наконец, разделять все поля до запрошенного. Рассмотрите потенциальные преимущества и недостатки перечисленных способов; реализуйте их и замерьте скорость работы каждого.
Упражнение 4.2
Добавьте новые возможности в библиотеку. Сделайте так, чтобы:
- а) разделитель мог принадлежать к произвольному классу символов;
- б) для разных полей существовали разные разделители;
- в) разделитель был заменен на регулярное выражение (см. главу 9). На что будет похож получившийся интерфейс?
Упражнение 4.3
В нашей реализации библиотеки мы применили статическую инициализацию, используемую в С в качестве основы для одноразового переключения: если на входе указатель есть NULL, то выполняется инициализация. Можно, однако, сделать и по-другому: заставить пользователя вызывать некоторую специальную функцию инициализации – в ней, кстати, могут содержаться некоторые рекомендованные начальные значения для массивов. Попробуйте написать версию, которая объединяла бы все достоинства обоих подходов. Какую роль в вашей версии будет играть reset?
Упражнение 4.4
Спроектируйте и реализуйте библиотеку для записи данных в формате CSV. Простейшая версия может просто брать массив строк и печатать их с кавычками и запятыми. Более интересный вариант – использовать форматные строки как printf. В главе 9 вы найдете некоторые полезные советы.