Просматривая свежий пост про пример использования парсинга 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.