Просматривая свежий пост про пример использования парсинга XML в Scala на eax.me, поймал себя на неожиданной мысли: где-то что-то отдаленно похожее я уже видел. Кстати говоря, пост хороший. Имхо, именно так нужно привлекать внимание людей к языкам/технологиям/подходам/парадигмам. Небольшой, но практичный пример, вполне себе самоценный и самодостаточный. Собственно, пупуляризаторам чего бы то ни было (в том числе и ФП), на заметку.
Довольно симпатично выглядят некоторые фрагменты кода в примере, скажем, вот этот:
val postsMap = postsXml.map{ n => ( (n \ "thread" \ dsqid).text.toLong, (n \ "createdAt").text, (n \ "author" \ "name").text, (n \ "message").text, n ) }.filter{ case t => (! (t._5 \ "isDeleted").text.toBoolean ) && (! (t._5 \ "isSpam").text.toBoolean ) }.groupBy(_._1).filter{ case (k,v) => threadsMap.get(k).isDefined }.map{ case (k,v) => ( threadsMap(k), v.map(t => (t._2, t._3, t._4) ).toArray.sortBy(_._1) ) } |
Сперва подумалось, что, блин, обработка данных посредством конструкций из ФП выглядит весьма привлекательно. Хотя какая-то доля лишнего "синтаксического оверхеда" (с) таки присутствует. И что от него можно было бы избавиться. Но, если синтаксис будет сильно заточен под манипуляции над данными, то....
...то в памяти всплывают отрывочные воспоминания о такой штуке, как CODASYL. Был когда-то такой мертворожденный стандарт для работы с данными, представленными в иерархической и сетевой моделях данных. Базировавшийся на COBOL-е. А COBOL -- это же как раз язык для обработки данных.
Конечно, если сравнивать примеры кода на COBOL/CODASYL с современными примерами на Scala, на первый взгляд будет казаться, что это совершенно разные вещи. Но мне представляется, что по сути, это лишь очередная попытка записать что-то подобное:
PROCEDURE DIVISION. CONTROL-PARA. * * CONTROL PARAGRAPH. DATABASE IS INVOKED AND PRIVACY * KEYS SPECIFIED. READS FIRST RECORD FROM INPUT FILE * AND CALLS MAIN PROCESSING ROUTINE UNTIL A DATABASE * ERROR OCCURS OR AN END OF FILE CONDITION IS SIGNALLED. * WHEN AN ERROR OCCURS THE ENTIRE TRANSACTION IS * ABORTED OTHERWISE IT IS SECURED. * OPEN INPUT CARINP. # INVOKE DBMS. # PRIVACY KEY FOR UPDATE OF ALL AREAS IS 'CAR-LOCK'. # PRIVACY KEY FOR STORE OF RECORD DEPOT IS 'NEW-DEPOT'. # PRIVACY KEY FOR INSERT OF SET DEPOT-CARS IS 'CAR-INPUT'. # PRIVACY KEY FOR INSERT OF SET MECHANICS IS 'MECH-AMEND'. # OPEN AREA CAR-AREA USAGE-MODE IS UPDATE. # START TRANSACTION TRAN-ID, UPDATE. PERFORM DATA-INPUT. PERFORM PROCESS-TRANS UNTIL EOF OR DB-ERR. IF DB-ERR PERFORM ABORT-TRANS ELSE PERFORM END-TRANS. # CLOSE ALL AREAS. # EXIT DBMS. CLOSE CARINP. STOP RUN. |
Но только в современном, модном и молодежном, ФП-шном стиле :)
PS. Ну и раз уж в кои-то веки затронул тему ФП, то чтобы два раза не вставать. Посмотрел видео доклада Сергея Зефирова (aka thesz) с недавней конференции f(by). Повеселил ответ Зефирова на вопрос про использование Haskell-я в mission critical приложениях (приблизительно на 48:00). Типа, напишу на Haskell-е генератор, который сгенерирует уже прикладной код на низкоуровневом языке приложения из Haskell-евского DSL-я. Ну, может в моделировании процессоров этот подход разумен. Однако, для какого-нибудь OZON-а или Pleer.Ru (не говоря уже про eBay и Amazon) их система онлайн-торговли есть самое что ни есть mission critical приложение. Забавно было бы посмотреть на попытку реализовать что-то подобное на Haskell-евском DSL-е, из которого бы генерировался PHP или Java, или даже C-шный код :) Понятно, что вопрос задавали про несколько другие mission critical приложения, но, AFAIK, современные системы управления сложным оборудованием, разрабатываемые с использованием стандарта DDS, это тоже очень и очень объемные задачки (например).
PPS. На счет COBOL-а, давным-давно достигшего "состояния бессмертности": #1 и #2.
Комментариев нет:
Отправить комментарий