xeno_by (xeno_by) wrote,
xeno_by
xeno_by

Кодяринг на микроуровне

Традиционно ресурсы по проге рассматривают высокий уровень программирования: архитектуры, лайеры, паттерны и так далее. Но разве не менее важно то, чем мы занимаемся каждый день - кодяринг in-the-small (т.е. в пределах одного метода)? В этом потсе я расскажу о своих любимых способах улучшить программирование на микроуровне.

1. На первом месте стоит, конечно же, функциональный подход. Благодаря функциям высшего порядка, в частности, и функциональной композиции, в общем, появляются возможности по реюзанию сниппетов кода, которые не выносятся в отдельные методы. Порой диву даешься, насколько это сокращает код и насколько часто можно подъюзать ФП.

qsort [] = []
qsort (x:xs) =
    qsort(filter (< x) xs) ++
    [x] ++
    qsort(filter (>= x) xs)

2. Что меня реально вырубает - это switch. Причем, к сожалению, свичи нужны чаще, чем это может показаться. Например - перебрать все значения энума или проверить объект на принадлежность одному из классов, после чего что-то с ним сделать. Последний сценарий особенно напрягает, ибо в таком случае нужно дважды указывать тип или объявлять дополнительный локалс (варианты is или as). Здесь чрезвычайно рулит паттерн-матчинг и его расширение - активные паттерны, которые позволяют сопоставить объект с одним из вариантов и прямо на месте прибиндить составные части объекта к локальным переменным. Исключительно прекрасно эта штука работает с квазицитированием.

let rec interp inp =
match inp with
    | <@@. x + y .@@> -> interp x + interp y
    | <@@. x * y .@@> -> interp x * interp y
    | Int32(x) -> x
    | _ -> failwith "unrecognized"

3. Проверки на null. Еще круче, чем свичи, действуют на нервы цепочки вызовов методов возможно нулевых таргетов. Добавленный во второй сишарп оператор коалесцирования (??) слегка помогает, но случаи его применения редки. Чрезвычайно эпично в этим вопросом справляется монада Maybe, но, во-первых, не всем она доступна, а бесшумно сэмулировать ее без метапрограммирования не получится, а, во-вторых, юзание монад в таком простом частном случае это overkill. В свое время меня порадовали nullsafe-операторы из Груви (?:, ?., ?->). А сегодня я наткнулся на мегарешение при помощи джаваскрипта, которое по семантической плотности приближается к примеру копирования строк в C или к квиксорту на Хаскелле. Встречайте: this[0] && this[0].ownerDocument || document. Объяснение вот тут: Guided Tour: jQuery - guard and default operators.
Tags: dreams2010
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic
  • 6 comments