Добавлен: 03.04.2023
Просмотров: 392
Скачиваний: 5
ВВЕДЕНИЕ
Поскольку программное обеспечение становится все более сложным, особую важность приобретают хорошо структурированные программы, при разработке которых может быть использован восходящий подход: в первую очередь для заданной предметной области выделяются и реализуются наиболее простые функции . Такие программы легко писать и отлаживать, поскольку они, как правило, предоставляют набор модулей, которые могут быть повторно использованы с целью сокращения будущих временных или финансовых затрат. Подход к проектированию таких программ называют архитектурным, для него характерны глобальные ограничения, накладываемые на проектирование прикладного программного обеспечения: выбор стандартов разработки, парадигмы программирования, архитектурных стилей. Большим шагом на пути к совершенствованию языков программирования стало появление объектно-ориентированного подхода. Объектно-ориентированное программирование, представляющее программу как набор объектов и их взаимодействий, способно внести особый вклад в модульность и быстродействие программ. Таким образом, проектирование прикладных программ на объектно-ориентированных языках программирования является актуальной задачей.
Объектно-ориентированный подход к программированию эффективен в тех случаях, когда некоторый реально существующий предмет характеризуется очень большим числом параметров. Тогда подпрограммы, описывающие алгоритмы обработки или функционирования такого предмета, имеют настолько большое число формальных параметров, что программирование их вызовов слишком трудоемко и сопряжено с большим количеством ошибок. Эффективным методом программирования таких задач является создание в программе объекта, соответствующего рассматриваемому предмету. Этот объект будет включать в себя данные, соответствующие параметрам данного предмета, а также подпрограммы (функции), описывающие алгоритмы обработки или функционирования предмета. Данные объекта должными являться по умолчанию доступными для алгоритмов объекта (иными словами, быть глобальными для этих алгоритмов) и не включаться в списки параметров соответствующих подпрограмм. В этом случае количество параметров подпрограмм существенно уменьшится.
Цель данной курсовой работы – реализация прикладной программы, осуществляющей обработку файлов данных, на одном из объектно-ориентированных языков программирования высокого уровня. В качестве такого языка в работе был выбран язык программирования C++. Для достижения цели в курсовой работе были поставлены следующие задачи:
- получить представление об основных принципах объектно-ориентированного программирования и изучить основы языка высокого уровня C++;
- выявить ключевые особенности проектирования классов, позволяющие вводить информацию, хранить её в файле, а также осуществлять модификацию данных;
- выполнить реализацию программы обработки файлов данных на выбранном языке, а также ее тестирование и отладку.
Объектом исследования является практическое применение объектно-ориентированного подхода к программированию для разработки прикладной программы. Предметом курсовой работы является проектирование классов для обработки файлов данных.
1. Развитие объектно-ориентированного подхода
Выбор парадигмы программирования, определяющей успешность реализации программного продукта, и соответствующего ей языка программирования имеет решающее значение для специалиста в области информационных технологий и программирования [a.1.]. За последние 50 лет появились сотни языков, поддерживающих различные парадигмы, некоторые из них используют несколько парадигм (такие языки называют мультипарадигменными). Однако, несмотря на большое количество языков программирования, существует несколько действительно важных концепций программирования, и не так много языков, которые были бы актуальны на протяжении более десяти лет. Именно парадигмы программирования определяют общий способ проектирования прикладных программ. Парадигмой программирования называют используемый различными языками подход к программированию, то есть, проще говоря, набор идей и понятий, определяющих стиль написания программ [a.1.].
Инструкции первых языков программирования, появившихся в начале 50-х годов XX века и ориентированных на конкретный компьютер, записывались в исходном коде и выполнялись последовательно. Данные, полученные при выполнении предыдущих инструкций, могли быть считаны из памяти или записаны в нее [a.2.]. Таким образом, программы представляли собой последовательность команд, которые должен был выполнить компьютер. Языки программирования, использующие этот подход (прежде всего, это машинные инструкции и язык ассемблера), образовали императивную парадигму программирования. В отличие от декларативного подхода, при котором задается спецификация решения задачи, в императивном широко используются операторы присваивания. Ранние императивные языки сложны для понимания и решения прикладных задач.
Развитие вычислительных устройств и компьютерной техники привело к появлению процедурных языков. Процедурные языки программирования, первые реализации которых относятся к концу 50-х годов, позволили разбивать задачи на шаги и решать их за шагом, причем возможность определять каждый шаг в процессе решения задачи была предоставлена программисту. Эти языки использовали императивную парадигму, но последовательно выполняемые операторы могли быть собраны в подпрограммы, то есть более крупные целостные единицы кода, с помощью самого языка. Согласно некоторым классификациям, такой подход выделяется в самостоятельную парадигму, получившую название процедурной. К процедурным языкам программирования относятся, например, Паскаль, Си, Алгол, КОБОЛ и Фортран.
Процедурный подход потребовал структурирования будущей программы, разделения ее на отдельные процедуры [a.2.]. При разработке отдельной процедуры о других процедурах требовалось знать только их назначение и способ вызова. Появилась возможность перерабатывать отдельные процедуры, не затрагивая остальной части программы, сокращая при этом затраты труда и машинного времени на разработку и модернизацию программ.
Следующим шагом в углублении структурирования программ стало так называемое структурное программирование, при котором программа в целом и отдельные процедуры рассматривались как последовательности канонических структур: линейных участков, циклов и разветвлений. Возможность читать и проверять программу в виде набора последовательных символов текста привела к повышению производительности труда разработчиков при проектировании и отладке программ. Для того, чтобы повысить структурность программы в целом, подпрограммы (процедуры) получили большую, нежели раньше, независимость – они стали связываться с программами, вызывающими их, исключительно путем передачи аргументов. Поэтому стало считаться нежелательным использование в подпрограммах переменных, принадлежащих другим подпрограммам или главной программе.
Процедурное и структурное программирование затронули прежде всего процесс описания алгоритма как последовательности шагов, ведущих от варьируемых исходных данных к искомому результату. Для решения специальных задач стали разрабатываться языки программирования, ориентированные на конкретный класс задач: на системы управления базами данных, имитационное моделирование и т.д. При разработке трансляторов все больше внимания стало уделяться обнаружению ошибок в исходных текстах программ, обеспечивая этим сокращение затрат времени на отладку программ.
Все универсальные языки программирования, несмотря на различия в синтаксисе и используемых ключевых словах, реализуют одни и те же канонические структуры: операторы присваивания, циклы и разветвления. Во всех современных языках присутствуют предопределенные (базовые) типы данных (целые и вещественные арифметические типы, символьный и, возможно, строковый тип), имеется возможность использования агрегатов данных, в том числе массивов и структур (записей). Для арифметических данных разрешены обычные арифметические операции, для агрегатов данных обычно предусмотрена только операция присваивания и возможность обращения к элементам агрегата. Вместе с тем при разработке программы для решения конкретной прикладной задачи желательна возможно большая концептуальная близость текста программы к описанию задачи. Например, если решение задачи требует выполнения операций над комплексными числами или квадратными матрицами, желательно, чтобы в программе явно присутствовали операторы сложения, вычитания, умножения и деления данных типа комплексного числа, сложения, вычитания, умножения и обращения данных типа квадратной матрицы. Решение этой проблемы возможно несколькими путями:
- Построением языка программирования, содержащего как можно больше типов данных, и выбором для каждого класса задач некоторого подмножества этого языка. Такой язык иногда называют языком-оболочкой. На роль языка-оболочки претендовал язык ПЛ/1, оказавшийся настолько сложным, что так и не удалось построить его формализованное описание. Отсутствие формализованного описания, однако, не помешало широкому применению ПЛ/1 как в Западной Европе, так и в СССР.
- Построением расширяемого языка, содержащего небольшое ядро и допускающего расширение, дополняющее язык типами данных и операторами, отражающими концептуальную сущность конкретного класса задач. Такой язык называют языком-ядром. Как язык-ядро были разработаны языки Симула и Алгол-68, не получившие широкого распространения, но оказавшие большое влияние на разработку других языков программирования.
Дальнейшим развитием второго пути явился объектно-ориентированный подход к программированию.
Основные идеи объектно-ориентированного подхода опираются на следующие положения:
- Программа представляет собой модель некоторого реального процесса, части реального мира;
- Модель реального мира или его части может быть описана как совокупность взаимодействующих между собой объектов;
- Объект описывается набором параметров, значения которых определяют состояние объекта, и набором операций (действий), которые может выполнять объект;
- Взаимодействие между объектами осуществляется посылкой специальных сообщений от одного объекта к другому;
- Сообщение, полученное объектом, может потребовать выполнения определенных действий, например, изменения состояния объекта.
- Объекты, описанные одним и тем же набором параметров и способные выполнять один и тот же набор действий представляют собой класс однотипных объектов.
С точки зрения языка программирования класс объектов можно рассматривать как тип данного, а отдельный объект - как данное этого типа. Определение программистом собственных классов объектов для конкретного набора задач должно позволить описывать отдельные задачи в терминах самого класса задач (при соответствующем выборе имен типов и имен объектов, их параметров и выполняемых действий).
Таким образом, объектно-ориентированный подход предполагает, что при разработке программы должны быть определены классы используемых в программе объектов и построены их описания, затем созданы экземпляры необходимых объектов и определено взаимодействие между ними.
Классы объектов часто удобно строить так, чтобы они образовывали иерархическую структуру. Например, класс “Студент”, описывающий абстрактного студента, может служить основой для построения классов “Студент 1 курса”, “Студент 2 курса” и т.д., которые обладают всеми свойствами студента вообще и некоторыми дополнительными свойствами, характеризующими студента конкретного курса. При разработке интерфейса с пользователем программы могут использовать объекты общего класса “Окно” и объекты классов специальных окон, например, окон информационных сообщений, окон ввода данных и т.п. В таких иерархических структурах один класс может рассматриваться как базовый для других, производных от него классов. Объект производного класса обладает всеми свойствами базового класса и некоторыми собственными свойствами, он может реагировать на те же типы сообщений от других объектов, что и объект базового класса и на сообщения, имеющие смысл только для производного класса. Обычно говорят, что объект производного класса наследует все свойства своего базового класса.
Некоторые параметры объекта могут быть локализованы внутри объекта и недоступны для прямого воздействия извне объекта. Например, во время движения объекта-автомобиля объект-водитель может воздействовать только на ограниченный набор органов управления (рулевое колесо, педали газа, сцепления и тормоза, рычаг переключения передач) и ему недоступен целый ряд параметров, характеризующих состояние двигателя и автомобиля в целом.
Таким образом, объектно-ориентированная парадигма программирования является одним из наиболее эффективных подходов. Она позволяет объединить данные и функции-члены, относящиеся к одной сущности, и работать с ними как с одним целым, что является необходимым для решения сложных задач.