Этот подход обречен на провал и обычно требует переписывания с нуля.
Итак, чтобы решить этот сценарий, мы можем попробовать разделить проблему на несколько подзадач, а затем попытаться решить ее одну за другой. один.
Это не только упрощает нашу задачу, но и позволяет достичь Теперь большой вопрос, как "сломать" не теоретически, а ПРОГРАММНО. Мы увидим несколько различных типов таких единиц в популярных языках ‚Äã‚Äãтаких как C/C++, Python и Java. В иллюстративных целях предположим, что у нас есть все основные вставки связанных списков в одной программе. Поскольку методов (функций) много, мы не можем загромождать программу, записывая все определения методов над требуемой основной функцией. Но даже если бы мы это сделали, могла бы возникнуть проблема упорядочения методов, когда один метод должен быть перед другим и т. д. Итак, чтобы решить эту проблему, мы можем объявить все прототипы в начале программа, а затем основной метод, и ниже мы можем определить их в любом конкретном порядке: Программа: Перейти на C/C++
< a href = # Python> Перейти к Python
Перейти к Java
C / C++
< класс кода ="неопределенные пробелы">
< класс кода ="неопределенные пробелы"> <код класс ="ключевое слово полужирный" > return
|
Компиляция кода: мы можем скомпилировать приведенную выше программу:
gcc linkedlist.c -o linkedlist
И это работает!
Основные проблемы в приведенном выше коде:
Мы уже видим основные проблемы с программой, с кодом не так просто работать ни индивидуально, ни в группе.
Если кто-то хочет работать с вышеперечисленным программа, то некоторые из многих проблем, с которыми сталкивается человек:
- Нужно просмотреть полный исходный файл. для улучшения или улучшения некоторых функций.
- Невозможно легко повторно использовать программу в качестве основы для других проектов.
- Код очень загроможден и совсем не привлекателен, что очень затрудняет навигацию по коду.
В случае группового проекта или крупных программ описанный выше подход гарантированно приведет к увеличению общих затрат, энергии и количества отказов.
Правильный подход:
Мы видим, что эти строки начинаются в каждой программе C/C++, которая начинается с "#include".
Это означает, что включать все функции, объявленные в заголовке "библиотеки" (файлы .h) и, возможно, определенные в файлах library.c / cpp .
Эти строки предварительно обрабатываются во время компиляции.
Мы можем вручную попытаться создать такую библиотеку для наших собственных целей.
Важные вещи, которые следует помнить :
- Файлы ".h" содержат только объявления прототипов (таких как функции, структуры) и глобальные переменные.
- Файлы ".c/.cpp" содержат фактическую реализацию (определения объявлений в файлах заголовков).
- При компиляции всех исходных файлов убедитесь, что несколько определений одной и той же функции, переменная и т. д. не существуют для одного и того же проекта. (ОЧЕНЬ ВАЖНО)
- Используйте статические функции, чтобы ограничить себя файлом, в котором они объявлены.
- Используйте ключевое слово extern , чтобы использовать переменные, на которые ссылаются внешние файлы.
- При использовании C++ будьте осторожны с пространствами имен, всегда используйте namespace_name::function(), во избежание конфликтов.
Разбивая программу на более мелкие коды:
Изучив приведенную выше программу, мы видим, как эту большую программу можно разделить на подходящие маленькие части и затем легко обрабатывается.
Вышеупомянутая программа по существу имеет 2 основные функции:
1) Создание, вставка и сохранение данных в узлах.
2) Отображение узлов
Таким образом, я могу разделить программу таким образом, чтобы:
1) Главный файл был > Драйвер программы, Nice Wrapper из Insertion Modules и где мы используем дополнительные файлы.
2) Вставить - > Настоящая реализация лежит здесь.
С учетом упомянутых важных моментов программа делится на:
linkedlist.c - > Содержит программу-драйвер
insert.c - > Содержит код для вставкиlinkedlist.h - > Содержит необходимые объявления узлов
insert.h - > Содержит необходимые объявления вставки узлов
В каждом заголовочном файле мы начинаем с:
#ifndef FILENAME_H #define FILENAME_H Declarations ... #endif
Причина, по которой мы пишем наши объявления между #ifndef, #define и #endif, , состоит в том, чтобы предотвратить множественные объявления идентификаторов, таких как типы данных, переменные и т. д., когда вызывается один и тот же заголовочный файл. в новом файле, принадлежащем тому же проекту.
Для этого примера программы:
insert.h - > Содержит объявление узла вставки, а также объявление самого узла.
Очень важно помнить, что компилятор может видеть объявления в заголовочном файле, но если вы попытаетесь написать код, который включает объявление в другом месте, это приведет к ошибке, поскольку компилятор компилирует каждый файл .c по отдельности, прежде чем перейти к этапу компоновки. ,
connectedlist.h – > Вспомогательный файл, содержащий объявления Node и его Display, которые должны быть включены в файлы, которые их используют.
insert.c - > Включите объявление узла с помощью #include "connectedlist.h", которое содержит объявление, а также определения всех других методов, объявленных в файле insert.h.
connectedlist.c - > Простая обертка, содержащая бесконечный цикл, предлагающий пользователю вставить целочисленные данные в нужные позиции, а также содержащий метод, отображающий список.
И последнее, о чем следует помнить, это бессмысленность включение файлов друг в друга может привести к множественным переопределениям и приведет к ошибке.
Принимая во внимание вышеизложенное, вы должны тщательно разделить на подходящие подпрограммы.
|
insert.h
|
insert.c
< |