2009-09-08 4 views
4

При чтении кода someones я обычно предпочитаю подход снизу вверх ... То есть я стараюсь иметь некоторое знакомство с классами в проекте, создавая абстрактную целую картину проекта, а затем копаем глубоко внутри кода для деталей.Чтение кода других пользователей: подход сверху вниз или снизу вверх?

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

Какой подход вы предлагаете и почему?

+0

Соглашаясь с Skeet, я бы хотел вызвать подход, который сначала фокусируется на большой картине, а затем переходит к деталям «Сверху вниз». – ESRogs

ответ

9

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

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

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

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

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

+0

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

+0

Но полагаться на наставников рискованно. Некоторые из них отвечают вам: «Прочтите код!» :-( –

+0

Я тоже их ненавижу :-). Но наступает момент, когда они абсолютно правы ... – jens

12

Я бы сказал, что ваш подход is сверху вниз: получение «большой картины» сначала обычно называется «сверху вниз», тогда как снизу вверх «сначала детали».

Оба подхода имеют свои достоинства: это зависит от ситуации.

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

1

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

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

0

Вашего подход является тот, который работает для меня также:

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

  2. Теперь вы пополняете свои знания о системе по частям. Увеличьте масштаб до одной области за раз. Это помогает, если вы можете внести изменения в код. Таким образом, вы всегда постепенно увеличиваете свое понимание системы. Не спешите.

+0

Как вы узнаете, как модули связаны, не видя кода (при отсутствии документации) –

+0

@Vinko вы правы. Я отредактирую свой ответ, чтобы он дал понять, что я беру на себя некоторую документацию. –

+0

Обычно редакторы помогают ... Вы можете получить все ссылки на вызовы функций и т. Д., Если такой функции нет, вы всегда можете использовать «Найти в файлах», –

1

Я использовал комбинированную технику в нашем последнем проекте, и это произошло несколько успешно. Изучите несколько «следов выполнения». Учитывая интересующий вас вход, посмотрите на трассировку отладки и выберите функцию/класс посередине (не сверху или снизу), которая вызывает все остальные, которые выполняют конкретный тип работы, для которой принадлежит ваш вход. Если обработка включает использование определенных модулей, изучите их также.

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

1

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

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

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

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

0

зависит от цели. Если я хочу построить стул, я буду интуитивно строить сверху донизу: возьмите несколько кусков дерева и соедините их.

Если я хочу построить автомобиль с нуля, я постараюсь сделать колесо первым.