Какой самый запутанный код вам пришлось исправить? - PullRequest
2 голосов
/ 19 апреля 2009

Большинство программистов имели опыт отладки / исправления чужого кода. Иногда этот «чужой код» настолько запутан, что достаточно плохо пытается понять, что он делает.

Какой самый худший (самый запутанный) код вам приходилось отлаживать / исправлять?

Если вы не выбросили его и не перекодировали с нуля, то почему бы и нет?

Ответы [ 12 ]

10 голосов
/ 19 апреля 2009

PHP OSCommerce достаточно, чтобы сказать, это запутанный код ...

6 голосов
/ 19 апреля 2009
  • класс Java
  • только статические методы, которые манипулируют DOM
  • 8000 LOCs
  • длинная цепочка методов, которые возвращают null при ошибке: a.b (). C (). D (). E ()
  • очень длинные методы (400/500 LOC каждый)
  • вложено, если, в то время, как:

    if (...) {
      for (...) {
        if (...) {
          if (...) {
            while (...) {
              if (...) {  
    
  • программирование, ориентированное на вырезание и вставку

  • без исключений, все исключения отслеживаются и "обрабатываются" с помощью printStackTrace ()
  • нет юнит-тестов
  • нет документации

У меня было искушение выбросить и перекодировать ... но после 3 дней тяжелой отладки, Я добавил волшебство, если :-)

2 голосов
/ 08 июня 2011

Сегодня я нашел эту строку в нашей кодовой базе и подумал, что это хороший пример подлого запутывания:

if (MULTICLICK_ENABLED.equals(propService.getProperty(PropertyNames.MULTICLICK_ENABLED))) {} else {
    return false;
}

Просто убедившись, что я прочитал всю строку. БЕЗ ЗАПИСИ.

2 голосов
/ 19 апреля 2009

по умолчанию, программисты думают, что чужой код запутан.

Хуже всего, вероятно, приходилось интерпретировать, какие переменные i1, i2 j, k, t были в простом методе, и они не были счетчиками в циклах for.

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

2 голосов
/ 19 апреля 2009

Спагетти-код системы PHP CMS.

1 голос
/ 07 ноября 2009

Я не могу вспомнить полный код, но одна его часть остается записанной в моей памяти, как то, что я часами пытаюсь понять:

do{
  $tmp = shift unless shift;
  $tmp;
}while($tmp);

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


ОБНОВЛЕНИЕ от ДВК:

И чтобы кто-то не утверждал, что это потому, что Perl не читается, в отличие от кодера, который является мастером гольфа, а не хорошим разработчиком программного обеспечения, вот тот же код в несколько менее запутанной форме (действительно правильный код даже не имел бы чередующейся подпрограммы имена и логические значения в первую очередь:)

# This subroutine take a list of alternating true/false flags
# and subroutine names; and executes the named subroutines for which flag is true.
# I am also weird, otherwise I'd have simply have passed list of subroutines to execute :)
my @flags_and_sub_names_list = @_;
while ( @flags_and_sub_names_list ) {
    my $flag     = shift @flags_and_sub_names_list; 
    my $subName  = shift @flags_and_sub_names_list;
    next unless $flag && $subName;
    &{ $subName }; # Call the named subroutine
}
1 голос
/ 19 апреля 2009

Работая над проектом GWT, я получал части скомпилированного GWT обфусцированного кода JS, который не был моим.

Теперь удачи отлаживаем реальный запутанный код.

0 голосов
/ 09 октября 2011

Однажды я обнаружил бомбу замедленного действия, которая была намеренно запутана.

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

Бомба замедленного действия (предположительно) должна была сработать после определенной даты.

Вместо этого в нем была ошибка, поэтому он активировался, только если кто-то работал после обеда 31 декабря.

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

0 голосов
/ 07 ноября 2009

Мне однажды пришлось перепроектировать фреймворк Java 1.1, который:

  1. Расширенные управляемые событиями классы SAX-анализатора для каждого класса, даже те, которые не анализируют XML (переопределенные методы просто вызывались специальным образом другим кодом)
  2. Там, где это было возможно, вместо вызовов методов создавались пользовательские исключения во время выполнения. В результате большая часть бизнес-логики оказалась в виде вложенной серии блоков catch.

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

Прошло около трех бутылочек глазных капель.

0 голосов
/ 07 ноября 2009

Если вы говорите о кодах HLL, однажды я обновлял проект, написанный на китайском языке, и все комментарии были китайскими (сохранены в ansii), и было ужасно понимать некоторые фрагменты кода, если вы говорите о низком уровне код был МНОГИЕ из них (запутанный, видоизмененный, vm-ed ...).

...