Марк Шевченко @markshevchenko
программист
Information
- Rating
- Does not participate
- Location
- Москва, Москва и Московская обл., Россия
- Registered
- Activity
Specialization
Backend Developer
Lead
From 450,000 ₽
C#
Rust
Algorithms and data structures
Functional programming
В принципе, я тоже сторонник готовых решений. Но, скажем так, в общеобразовательных целях люблю решать задачи, в том числе и такие, не имеющие даже практической ценности.
> не отделаешься, это непрофессионально.
Вообще то нет. Можно один раз разобраться, потом забыть подробности.
> Нужно знать точно, какие проверки сделать. Чтобы знать
> точно, нужно вначале изучить RFC, а потом на его основе
> кодировать. Я считаю это напрасной тратой времени и при
> любой возможности перекладываю такой контроль на
> сторонние средства, где это уже реализовано. А трата
> времени на недорешения с псевдоконтролем чревата
> последующими эксплуатационными проблемами.
Любой подход чреват эксплуатационными проблемами. Тем более подход «перекладывания на сторонние средства». Их ведь надо протестировать на соответствие RFC, а это тоже трата времени. Если не тестируете, рискуете получить проблемы там, где их не ожидали.
> и без него. Дойдет и с ошибочным. Проверено.
В данном конкретном случае согласен. Но это никак не отменяет необходимости проверки пользовательского ввода в целом.
В частности, электронную почту всё-таки проверяют регекспом, это разумно.
Или комическую ситуацию, которая довольно часто встречается: «я случайно положил деньги на ваш телефон, положите столько на телефон хххххххх». :)
Но это ещё так себе задачка. Телефонные номера — вот где настоящий геморрой, особенно, если предполагается международное использование сервиса.
Очень хорошо, что справочник бесплатный. Собственно, теперь о том, что нужно будет сделать, чтобы поддерживать справочник в актуальном состоянии. Само-собой, нужно будет написать скрипт и запускать его, например, каждую ночь.
1. Проверяем, обновился ли файл info.russianpost.ru/database/PIndx.zip с момента последнего скачивания (надеюсь, If-Modified-Since они поддерживают, иначе совсем грустно).
2. Если обновился, скачиваем. В случае обрыва связи, пытаемся повторить. Если скачать не удалось, журналируем ошибку.
3. Распаковываем архив, получаем DBF.
4. Из DBF перегоняем данные в нашу собственную базу.
5. В случае необходимости проверяем индекс по базе.
Реально? Реально. Нужно? На мой взгляд, спорно. Если есть свободное время, почему бы и нет. Но это отнюдь не первоочередная задача.
> Проверка индекса на 6 цифр — это, кстати, отличный пример некачественной проверки
> (если не оговорить ещё несколько условий).
Например, каких? Почтовые индексы можно проверить только базой, там нет избыточности, как в номерах банковских счетов. Вопрос — где вы будете брать актуальную базу и сколько это будет стоить? Окупается ли это, т. н. качество?
Ну и «проверка должна быть качественной» — расплывчатый тезис. Это как с любыми другими полями ввода — достаточно ли убедиться что почтовый индекс состоит из 6 цифр, или надо держать у себя базу корректных почтовых индексов?
С базой всё хорошо, только как поддерживать актуальность информации? Если поддерживать, то сразу задача становится непростой и организационной. Потому, на мой взгляд, достаточно убедиться, что в индексе 6 цифр. И убедиться, что электронный адрес похож на настоящий.
Я имел в виду видео-монтаж. Вырезать пару фрагментов из 2-3 фильмов, склеить, наложить пару эффектов. Очень, блин, ресурсоёмкая штука. :)
Вроде того, что когда функция видит %F%, она вставляет значение F в это место.
Когда видит {%F%...} вставляет подходящий текст, но не само число.
Просто сами предложения могут быть достаточно сложными, например:
Найдено 5 файлов в 10-ти папках, они скопированы в архив.
Не найдено файлов в 3-х папках
, и никто их никуда копировать не будетНайден один файл в 1-й папке, он скопирован в архив.
Ну и вторая мысль: надо делать рекурсивную обработку строк, т.е., например у нас есть {%F%a|b|c}, вот в строках a, b и c мы тоже можем писать блоки форматирования.
Тогда можно делать сложные конструкции: найдено 200 файлов, из них удалено 195. Ну а если файлов не найдено, то про удаление можно вообще не писать, и так понятно, что 0 файлов удалено.
Кстати, похожесть на OCaml лично мне помогла при освоении языка. Скажем, про fslex, fsyacc в сети практически нет документации, зато она есть про ocamllex, ocamlyacc. Кроме того, есть хорошие учебники по OCaml, что способствует.