А вот теперь пример безумия
В мире жабы(в смысле языка програмирования) есть какая-то тонкая шиза, которая порождает миллиарды фреймворков.
Вот пример про логгирование. Ну блин, как можно столько наворотить на пустом месте?
Самая хохма там - это то, что некоторые упоминают использование логгеров через дополнительный уровень абстракции. Мне иногда для вывода в текстовый лог и на экран юзеру приходится делать обвязку, дословно дублирующую интерфейс логгера, и меня это напрягает, потому что это натурально тупая копипаста. А народ такое массово использует и не парится.
По-моему, избавление от шизы надо начать с сжигания GoF и фаулера на костре из их книжек. А затем внедрять в мейнстримные языки всякую функциональщину, вроде функций высшего порядка, каррирования и вывода типов, после чего половина врапперов, фасадов и прочего копипастного мрака становится не нужна.
Вот пример про логгирование. Ну блин, как можно столько наворотить на пустом месте?
Самая хохма там - это то, что некоторые упоминают использование логгеров через дополнительный уровень абстракции. Мне иногда для вывода в текстовый лог и на экран юзеру приходится делать обвязку, дословно дублирующую интерфейс логгера, и меня это напрягает, потому что это натурально тупая копипаста. А народ такое массово использует и не парится.
По-моему, избавление от шизы надо начать с сжигания GoF и фаулера на костре из их книжек. А затем внедрять в мейнстримные языки всякую функциональщину, вроде функций высшего порядка, каррирования и вывода типов, после чего половина врапперов, фасадов и прочего копипастного мрака становится не нужна.
no subject
newtype LogM a = LogM (forall b. (String -> b -> b) -> b -> (a, b)) log :: String -> LogM () log s = LogM $ \f b -> ((), f s b) instance Monad LogM where return x = LogM $ const $ (,) x LogM l >>= h = LogM $ \f b -> let {(a, b') = l f b; LogM l' = h a} in l' f b' runLog :: File -> LogM a -> IO a runLog file (LogM l) = let (a, io) = l (\s io -> io >> writeStringToFile file s) (return ()) in io >> return ano subject
loggedAction = do log "I'm going to do something very unsafe" a <- veryUnsafeFFIFunction log "Unsafe place passed, everything OK" b <- relativelySafeFFIFunction a log "Just to make sure" main = runLog (openFile "log.txt") loggedActionНу и в log.txt потом (наверное) прочитаем:
no subject
no subject