Есть ли способ следовать восходящему подходу в C? - PullRequest
1 голос
/ 07 сентября 2010

Обычно в языке C используется нисходящий подход, а в C ++ - восходящий.Нужно ли следовать этим подходам?Могу ли я следовать восходящему подходу в C?Если так ... как?

Ответы [ 4 ]

7 голосов
/ 07 сентября 2010

Если это даже правда, это утверждение о программистах на C и C ++, а не утверждение о языках.

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

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

Или такой тенденции может не быть. Ни один язык не мешает ни одному из подходов. Например, предположим, я хочу написать код, который анализирует некоторые данные и печатает отчет. Вот нисходящий подход в C:

# first version of the code (doesn't compile)
raw_data = read_the_data();
processed_data = perform_the_analysis(raw_data);
report = prepare_report(processed_data);
puts(report);

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

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

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

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

1 голос
/ 07 сентября 2010

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

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

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

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

1 голос
/ 07 сентября 2010

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

На практике вы комбинируете разные подходы, например:

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

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

0 голосов
/ 07 сентября 2010

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

Что вы имеете в виду с подходом сверху вниз и снизу вверх?

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