Оригинал взят у
droids_life в
XML<=>XLS на С# для частного бюро оценки. Выкатил тут, кстати, родителям второй релиз конвертилки. Писал про неё уже пару раз (например,
http://masterden.livejournal.com/60181.html). Не покидает ощущение, что её можно было сильно быстрее и проще сделать на VBA прямо внутри эксельки. Но проект был домашний и от него хотелось ещё и веселья. В итоге, поддержал себя в форме и не протухаю в плане .NET. Прилада, надеюсь, скоро будет колбасить не только родительские файлы, но и левые заказы.
В коде я порезвился на славу, конечно. Тезисно:
* UI сдела на WPF. К сожалению, делал его на скорую руку и в плане кода он не очень правильный: не использовал Commands, нет горячих клавиш, MVVM нормальным там и не пахнет. Зато поддержал drag'n'drop =) Последний раз его делал ещё в СофтЛабе для редактора квестов.
* Код парсинга входа и выхлоп - тяжеловесный LINQ. По сути, императивного кода там 5%. Остальное - это LINQ to Objects выражения, "готовящие" модель данных и LINQ to XML выражения, описывающие "выхлоп". На первый взгляд, кажутся перебором. Однако получился интересный опыт. Вторую версию (или итерацию) я писал после полугодового перерыва (даже по vcs проверил :) и после отрытия кода тяжелее всего было вникать не в эти конструкции, а в логику GUI и всякий glue-код. А сами выражения мозг загружал в себя и осознавал быстро (не больше минуты). Один из примеров чтения:
http://pastebin.com/wQ3de48U. Пример записи:
http://pastebin.com/mERTirnH.
* Динамическую типизацию из C# 5 внезапно пользовал мало. Хоть и делалась она (в связке с named parameters и default значениями аргументов функций - про это John Skeet в
C# in Depth хорошо написал) как раз для Office COM Interop. Банально неудобно: не работает code completion и опечатки периодически случаются.
* А ну да : ) Самое-то главное: с Excel вся работа делалась через COM API.
* Проект разбит на три сборки: непосредственно конвертилка (модель данных, IO), CLI интерфейс для отладочных целей, GUI для конечных пользователей.
* Процесс конвертации распараллелил на уровне файлов - запинал
Parallel.ForEach %)
* Из интересного, правильности ради все строковые ресурсы вынес в локализационные файлы (заодно и научился это в .NET делать).
* В качестве VCS запользовал Mercurial на
Bitbucket.
Опыт написание оказался крайне полезным:
- Уже в ЦФТ полученный багаж позволил за пол дня слабать инструмент о котором чуть позже расскажу.
- Как уже сказал, держу себя в курсе дел .NET мира:
- Можно преподавать студентам =)
- Есть о чём потереть с .NET-корешами и можно вместе посмеяться над стрёмными тестовыми заданиями, которые им присылают.