Обезьяна-патч или нет? - PullRequest
       30

Обезьяна-патч или нет?

10 голосов
/ 06 января 2009

Это более общий вопрос, чем для конкретного языка, хотя я столкнулся с этой проблемой во время игры с модулем Python ncurses. Мне нужно было отобразить символы локали и распознать их как символы, поэтому я быстро исправил несколько функций / методов из модуля curses.

Это было то, что я называю быстрым и безобразным решением, даже если оно работает. И изменения были относительно небольшими, поэтому я могу надеяться, что ничего не испортил. Мой план состоял в том, чтобы найти другое решение, но увидев, что оно работает и работает хорошо, вы знаете, как оно есть, я перешел к другим проблемам, с которыми мне приходилось сталкиваться, и я уверен, что если в этом нет ошибки, я никогда не буду сделать это лучше.

Однако мне показался более общий вопрос - очевидно, что некоторые языки позволяют нам монтировать и исправлять большие куски кода внутри классов. Если это код, который я использую только для себя, или небольшое изменение, это нормально. Что, если какой-то другой разработчик примет мой код, он увидит, что я использую какой-то известный модуль, поэтому он может предположить, что он работает так, как он привык. Затем этот метод неожиданно ведет себя иначе, чем должен.

Итак, очень субъективно, должны ли мы использовать исправления для обезьян, и если да, то когда и как? Как мы должны это документировать?


изменить: для @guerda:

Monkey-patching - это возможность динамически изменять поведение некоторого фрагмента кода во время выполнения без изменения самого кода.

Небольшой пример на Python:

import os
def ld(name):
    print("The directory won't be listed here, it's a feature!")

os.listdir = ld

# now what happens if we call os.listdir("/home/")?
os.listdir("/home/")

Ответы [ 5 ]

8 голосов
/ 06 января 2009

Нет!

Особенно с бесплатным программным обеспечением у вас есть все возможности для внесения ваших изменений в основной дистрибутив. Но если у вас есть слабо документированный взлом в вашей локальной копии, вы никогда не сможете отправить продукт, и обновление до следующей версии curses (обновления безопасности для всех) будет стоить очень дорого.

См. этот ответ , чтобы получить представление о том, что возможно на базах иностранных кодов. связанный скринкаст действительно стоит посмотреть. Внезапно грязный хак превращается в ценный вклад.

Если вы по какой-то причине не можете получить патч для апстрима, хотя бы создайте локальное репозиторий (git) для отслеживания апстрима и внесите свои изменения в отдельную ветку.

Недавно я столкнулся с точкой, в которой я должен принять патчи обезьян в качестве крайней меры: Puppet - это фрагмент кода ruby-везде. Поскольку агент должен работать в потенциально сертифицированных системах, он не может требовать конкретной версии ruby. У некоторых из них есть ошибки, которые можно обойти, исправляя методы выбора во время выполнения. Эти патчи зависят от версии, содержатся, и цель заморожена. Там я не вижу другой альтернативы.

4 голосов
/ 06 января 2009

Я бы сказал, нет.

Каждый патч обезьяны должен быть исключением и помечен (например, комментарием HACK) как таковой, чтобы их было легко отслеживать.

Как мы все знаем, легко оставить уродливый код на месте, потому что он работает, так зачем тратить на него больше времени. Так что некрасивый код будет там долго.

3 голосов
/ 07 февраля 2011

Я согласен с Дэвидом в том, что обезьяна исправляет производственный код, как правило, не очень хорошая идея.

Тем не менее, я считаю, что для языков, которые его поддерживают, исправление обезьян является очень ценным инструментом для модульного тестирования. Он позволяет изолировать фрагмент кода, который необходимо протестировать, даже если он имеет сложные зависимости - например, с системными вызовами, которые не могут быть внедрены в зависимости.

0 голосов
/ 06 января 2009

Я думаю, что вопрос не может быть решен с помощью однозначного ответа да-нет / хорошо-плохо - необходимо учитывать различия между языками и их реализациями.

В Python нужно подумать, можно ли вообще обезопасить класс (см. Этот SO вопрос для обсуждения), что относится к реализации Python с несколько меньшими затратами на ввод-вывод. Так что я буду осторожен и склонен прилагать некоторые усилия в поисках альтернативы перед исправлением обезьян.

В Ruby, OTOH, который был построен, чтобы быть OO в интерпретаторе, классы могут быть изменены независимо от того, реализованы они в C или Ruby. Даже Object (в значительной степени базовый класс всего) открыт для модификации. Так что исправление обезьян с энтузиазмом воспринимается как методика в этом сообществе.

0 голосов
/ 06 января 2009

Одно слово: oscommerce.

Если вы никогда не играли с этим, прежде чем оно пронизано

// BOF: Fixed/added/removed bla bla bla
...
// EOF

Не говоря уже о том, что вся кодовая база ухудшилась из-за менталитета «поставь функциональность, где бы ты ни был». Новые концепции программирования, такие как ОО (на ум приходят наследование и составные классы), призваны устранить эти проблемы. Используйте их!

...