Получение головы вокруг чужого кода

Большой O для сложности этого кода O(N^2). Любой другой ответ основан на неправильном понимании математического определения обозначения Big O и / или соглашений для его записи 1 .

Вы говорите, что «ответ выше - O(4N^2 + 5N + 2)». Это неверно Может случиться так, что количество команд (согласно определенным предположениям о командах и компиляторах) будет 4N^2 + 5N + 2. Однако это НЕ обычный способ написать класс сложности Big O для функции.

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

1 - Некоторые люди утверждают, что не является неправильным использование нестандартных / нестандартных обозначений Big O. Однако это противоречит цели использования математической нотации ... которая представляет собой четкую передачу математических идей от одного человека к другому. Аналогия: если бы я написал 1 + 1 is 11, я мог бы быть технически правильным (используя унарную запись), но это эпический провал как средство передачи идеи 1 + 1 = 2.


Мой учитель спрашивает «точное» количество казней.

Ну:

  1. Это НЕ БОЛЬШОЙ О.

  2. Это не особенно полезная мера, поскольку фактическая инструкция рассчитывается на реальном оборудовании после действительного компиляции с действительным [ 119] компиляция будет другой.


Вы говорите:

Я считаю, что каждая строка кода имеет определенное количество выполнений

Проблема в том, что число «Выполнения» зависят от того, как вы определяете, что такое примитивные операции, и как вы компилируете код Java в примитивные операции.

Например, есть разные способы скомпилировать вложенные циклы в вашем примере в инструкции, которые дадут различное количество примитивных переходов, которые нужно выполнить. (Подумайте о развертывании цикла и / или массивном переключении.)

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

8
задан GEOCHET 1 June 2009 в 19:00
поделиться

16 ответов

I strongly recommend BOUML. It's a free UML modelling tool, which:

  • is extremely fast (fastest UML tool ever created, check out benchmarks),
  • has rock solid C++ import support,
  • has great SVG export support, which is important, because viewing large graphs in vector format, which scales fast in e.g. Firefox, is very convenient (you can quickly switch between "birds eye" view and class detail view),
  • is full featured, intensively developed (look at development history, it's hard to believe that so fast progress is possible).

So: import your code into BOUML and view it there, or export to SVG and view it in Firefox.

1
ответ дан 5 December 2019 в 06:39
поделиться

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

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

Я говорю это, потому что обычно разработчики назовут свои элементы (с тем, чему они верят), значительно и обеспечение понимания их намеченной функции. Это испорчено, по общему признанию, если у разработчика есть дефектное понимание их программы, терминология или (часто случай, по моему скромному мнению) пытается звучать умной. Сколько разработчиков видело ключевые слова или имена классов и только затем искало термин в словаре впервые?

1
ответ дан 5 December 2019 в 06:39
поделиться

Это - все о стандартах и кодирующих правилах, которые использует Ваша компания.

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

0
ответ дан 5 December 2019 в 06:39
поделиться
  • Распечатки
  • Электронные доски
  • Много почтовой бумаги
  • Много Starbucks

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

Для схем я ищу главным образом, куда данные идут. Где это входит, где это заканчивается, и что это проходит на пути. Обычно то, что происходит с данными, кажется, производит хорошее впечатление полного расположения и некоторые кости для возвращения к тому, если я переписываю.

1
ответ дан 5 December 2019 в 06:39
поделиться

Узнайте программное обеспечение глубоко с точки зрения пользователя. Много может стать известно о глубинной структуре путем изучения и взаимодействия с пользовательским интерфейсом (интерфейсами).

1
ответ дан 5 December 2019 в 06:39
поделиться

Категорическим текстом на этой ситуации является Michael Feathers, Рабочий Эффективно с Унаследованным кодом. Как S. Lott говорит, вкладывают некоторые модульные тесты для установления поведения кода прежней версии. После того как у Вас есть те, которые в Вас, может начать осуществлять рефакторинг. Кажется, существует демонстрационная глава, доступная на Объектном веб-сайте Наставника.

2
ответ дан 5 December 2019 в 06:39
поделиться

хороший IDE (EMACS или Eclipse) мог помочь во многих случаях. Также на платформе UNIX, существуют некоторые инструменты для перекрестных ссылок (завершающие теги, ctags) или проверка (линт) или gcc со многими много включенных опций предупреждения.

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

Затем я осуществил бы рефакторинг и прокомментировал бы части, которые Вы поняли, и попробуйте к find/grep те части по целому исходному дереву и осуществите рефакторинг их там также.

За время Вы получаете более хороший код, Вам нравится работать с.

1
ответ дан 5 December 2019 в 06:39
поделиться

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

Очищая код, переименовывая методы, классы и пространства имен правильно, извлекающие методы являются всеми структурными изменениями, которые могут пролить свет на то, что часть кода, как предполагается, делает. Это могло бы звучать парадоксальным для рефакторинга кода, который Вы не "знаете", но TRUT меня, ReSharper действительно позволяет Вам делать это. Возьмите, например, выпуск мертвого кода отвлекающего маневра. Вы видите метод в классе или возможно странно именованной переменной. Можно запустить путем попытки к использованиям поиска или, ungh, сделать текстовый поиск, но ReSharper на самом деле обнаружит мертвый код и окрасит его в серый. Как только Вы открываете файл, Вы видите в сером и с флагами полосы прокрутки, что имело бы в прошлом, путая отвлекающие маневры.

Существуют десятки других приемов и вероятно много других инструментов, которые могут сделать подобные вещи, но я - героинщик ReSharper.

Удачи.

1
ответ дан 5 December 2019 в 06:39
поделиться

Я лично делаю много рисования схем и выяснение кости структуры.

Популярный товар de подмастерье (и возможно вполне справедливо) имеет меня пишущий модульные тесты, чтобы протестировать мои утверждения и создать систему поддержки для изменений, которые я вношу в систему.

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

Это - просто я, как бы то ни было.;)

1
ответ дан 5 December 2019 в 06:39
поделиться

Когда я работаю над унаследованным кодом, я не пытаюсь понять всю систему. Это привело бы к перегрузке сложности и последующему мозговому взрыву.

Скорее я беру одну единственную функцию системы и пытаюсь понять полностью, как она работает, от вплотную. Я буду обычно отлаживать в код, начинающий с точки в коде UI, где я могу найти определенную функциональность (так как это обычно - единственная вещь, которую я смогу найти сначала). Затем я выполню некоторое действие в GUI и выполню развертку в коде полностью вниз в базу данных и затем обратно. Это обычно приводит к полному пониманию по крайней мере одной функции системы и иногда дает понимание других частей системы также.

После того как я понимаю, какие функции вызываются и какие хранимые процедуры, таблицы и представления включены, я затем делаю поиск через код для обнаружения то, что другие части приложения полагаются на эти те же functions/procs. Это - то, как я узнаю, повреждает ли изменение, я собираюсь составить завещание, что-либо еще в системе.

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

1
ответ дан 5 December 2019 в 06:39
поделиться

Посмотрите Наследие Поблочного тестирования Приложения Веб-форм ASP.NET для совета относительно сжимания приложений прежней версии через поблочное тестирование.

Существует много подобных вопросов и ответов. Вот поиск https://stackoverflow.com/search? q=unit+test+legacy

Дело в том, что получение Вашей головы вокруг наследия является, вероятно, самым легким, если Вы пишете модульные тесты на то наследие.

1
ответ дан 5 December 2019 в 06:39
поделиться

Я обычно использую диаграммы последовательности UML различных ключевых способов, которыми используется компонент. Я не знаю ни о каких инструментах, которые могут генерировать их автоматически, но много инструментов UML, таких как BoUML и EA, Sparx может создать классы/операции из исходного кода, который сохраняет некоторый ввод.

2
ответ дан 5 December 2019 в 06:39
поделиться

Я делаю это регулярно. И разработали некоторые инструменты и приемы.

  • Попытайтесь получить общий обзор (объектная схема или другой).
  • Зарегистрируйте свои результаты.
  • Протестируйте свои предположения (специально для неопределенного кода).

Проблема с этим состоит в том, что на большинстве компаний Вы ценитесь результатом. Вот почему некоторые программисты пишут плохой код быстро и движение к другому проекту. Таким образом, Вас оставляют с мусором, и Ваш босс сравнивает Ваш вялый успех с быстрым и dirtu парнем. (К счастью мой текущий работодатель отличается).

3
ответ дан 5 December 2019 в 06:39
поделиться

Меня попросили взять владение некоторого ПРОТИВНОГО кода в прошлом - и работа и "игра".

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

Я нашел, что лучшим/единственным способом разобраться с кодом был запуск в точке входа ОС [основной ()], и создайте мою собственную схему стека вызовов, показывающую дерево вызова. Вы не должны действительно создавать полное дерево в начале. Просто трассировка через раздел (разделы), Вы продолжаете работать на каждом этапе и Вы получите достаточно хороший дескриптор на вещах смочь работать с ним.

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

Править: Существует большой разговор о кодировании стандартов... они просто заставят плохой код выглядеть согласовывающимся с хорошим кодом (и обычно быть более твердым определить). Кодирующие стандарты не всегда делают код поддержания легче.

4
ответ дан 5 December 2019 в 06:39
поделиться

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

1
ответ дан 5 December 2019 в 06:39
поделиться

Хм, это - твердое, так для высказывания такого небольшого времени...

1) Если можно выполнить код, он делает жизнь настолько намного легче, точки останова (особенно условное выражение), точки останова - Вы друг.

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

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

4) Много событий .NET кодируются как общественность, и события могут быть болью для отладки в лучшие времена. Повторно кодируйте их, чтобы быть частными и использовать свойство с, добавляют/удаляют. Можно затем использовать точку останова для наблюдения то, что слушает на событии.

BTW - Я играю в пространстве .NET и хотел бы, чтобы инструмент помог сделать этот вид материала, как Joel, кто-либо там знает о хорошем динамическом инструменте рассмотрения кода?

4
ответ дан 5 December 2019 в 06:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: