Serge Bobrovsky (sbobrovsky) wrote,
Serge Bobrovsky
sbobrovsky

Программируя опердень

Пишешь, такой, опердень для некоего супер-банка (СБ-Банк).
Приходит в JIRA тикет: выдать список всех должников всех банков -- клиентов СБ-Банка.

Ваяешь нечто flatMap-подобное в одну строчку, типа:

def SB_all_debtors(bank):
    return reduce(list.__add__, bank.departments.debtors)


деплоишь в продакшен, и тут...

Ахтунг! Жалоба от коллег-программистов: нифига не понятно!

Тимлид в панике: "пеши проще!"



Блин, зачем же я кодю в стиле functional programming.
Ok, переписываю:

def SB_all_debtors(bank):
    debts = []
    for dept in bank.departments:
        for debt in dept.debtors:
            debts.append(debt)
    return debts


Но всё ещё чёт не то, какое-то странное чувство...

А! Это же пока pure-функция!
Я забыл про побочные эффекты!

def SB_all_debtors(bank):
    log.write("Collecting debtors...")
    debts = []
    for dept in bank.departments:
        for debt in dept.debtors:
            debts.append(debt)
    return debts


Воот!

Один побочный эффект рекомендуется инжектить на каждые десять строк императивной функции. Хотя, в общем случае, оптимальное кол-во побочных эффектов для каждого метода рекомендуется определять в ходе code review.

Через полчаса тимлид прибегает с новой жалобой: менеджеры недовольны выдачей! Они получили простыню названий, а подразумевали, что получат только одно число, их общую сумму. Они надеялись, что программист догадается сам, что им нужно!

Надо срочно пофиксить код. И ни в коем случае не использовать pure-функции!

Финальная версия:

def SB_all_debtors(bank):
    log.write("Calculate debtors count...")
    debts = []
    counter = 0
    for dept in bank.departments:
        for debt in dept.debtors:
            debts.append(debt)
            counter += 1
    return counter # debts

Tags: fp, юмор
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 7 comments