- •Парадигмы программирования предпосылки появления, обзор существующих парадигм программирования.
- •3.2. Процедурная парадигма
- •3.2.1. История возникновения парадигмы
- •3.2.2. Языки, поддерживающие парадигму
- •3.2.3. Представление программ и реализация вычислений
- •Основные принципы объектно-ориентированной парадигмы.
- •Наследование и агрегация как реализации принципа иерархии в ооАиП.
- •Анализ и проектирование программного обеспечения: .Цели, классификация.
- •Структурный анализ программных систем: основные принципы, существующие методологии.
- •Диаграммы переходов состояний (std): назначение, нотация, примеры реализации.
- •Объектно-ориентированный анализ: базовые принципы, методология.
- •Язык uml: назначение, структура, нотация.
- •Сущности uml: типы, нотация, примеры описания.
- •Отношения uml: типы, нотация, примеры применения.
- •Диаграммы прецедентов uml: назначение, .Используемые элементы, примеры построения.
- •Диаграммы классов uml: назначение, используемые элементы, примеры построения.
- •Диаграммы взаимодействия uml: назначение, используемые элементы, примеры построения.
- •.Метрики качества структурного и объектно-ориентированного анализа и проектирования.
- •Понятие объекта и класса в объектно-ориентированном программировании. Члены-данные и члены функции.
- •2. Объект - как базовое понятие в объектно-ориентированном программировании
- •17.Конструкотр и деструктор.
- •18. Реализация принципа инкапсуляции ограничением области видимости компонент.
- •19. Аксессоры доступа к закрытым компонентам класса.
- •20. Статические компоненты класса: назначение, особенности и примеры использования.
- •Перегрузка стандартных операций: назначение, синтаксические особенности, примеры реализации.
- •Исключительные ситуации и способы их обработки. Блоки обработки и блоки завершения. Структурная обработка исключительных ситуаций.
- •Реализация принципа наследования в объектно-ориентированных языках программирования. Виды наследования.
- •Объявление наследования. Порядок определения новых и переопределения унаследованных компонент класса. Модификация области видимости компонент класса при наследовании.
- •Множественное наследование: объявление, примеры реализации, недостатки. Виртуальное наследование.
- •Виртуальные функции и полиморфизм – назначение, примеры практического использования.
- •Абстрактные классы: определение, назначение, примеры использования.
- •Интерфейс: назначение, синтаксис определения, примеры использования.
- •Основные принципы обобщенного программирования, его достоинства и недостатки.
- •Обобщение функций и методов: синтаксис определения, инстанцирование, особенности использования.
- •Обобщенные классы: синтаксис определения, примеры объявления и конкретизации.
- •Коллекции с#: реализация интерфейсов для сортировки элементов.
- •Делегаты c# как основной тип функторов.
- •Шаблоны проектирования: определение, классификация, назначение, достоинства и недостатки.
- •Шаблон Одиночка (Singleton): описание и пример программной реализации.
- •Шаблон Адаптер: назначение, структура, пример программной реализации.
- •Шаблон Наблюдатель (Observer): структура, пример реализации на языке c# с использованием событий (Events)
- •Архитектурный шаблон mvc: назначение, возможные структурные решения, примеры практической реализации
Перегрузка стандартных операций: назначение, синтаксические особенности, примеры реализации.
Перегрузка методов – это один из способов, которым достигается полиморфизм в языке С#. Две и более функции могут иметь одно и то же имя, а отличаться набором аргументов в интерфейсе (описании).
Полиморфизм – позволяет использовать один и тот же интерфейс при реализации целого круга различных действий.
Как известно, в языке С# тип переменной определяет набор значений, которые она может хранить, а также набор операций, которые можно выполнять над этой переменной. Например, над значением переменной типа int программа может выполнять сложение, вычитание, умножение и деление. С другой стороны, использование оператора “плюс” для сложения двух экземпляров реализованного программистом класса лишено смысла.
Когда в программе определяется класс, то по существу определяется новый тип данных. Тогда язык C# позволяет определить операции, соответствующие этому новому типу данных.
Например, пусть имеется:
myclass a,bc;…//a,b,c-экземпляры класса myclass
c=a+b; //перегруженная операция сложения для класса myclass
Перегрузка операций обычно применяется для классов, описывающих математические или физические понятия, то есть таких классов, для которых требуется выполнить соответствующие операции.
Общий синтаксис объявления перегруженной операции:
[атрибуты] спецификаторы operator тело операции,
где:
Спецификаторы – public,static,extern
operator – ключевое слово, определяющее перегруженную операцию
тело операции-действия, которые выполняются при использовании операции в выражении
Перегружать можно только стандартные операции.
Алгоритм перегрузки операции:
1. Определить класс, которому данная операция будет назначена.
2. Для перегрузки операций используется ключевое слово operator.
3. Переопределяя операцию, необходимо указать метод, который C# вызывает каждый раз, когда класс использует перегруженную операцию. Этот метод, в свою очередь, выполняет соответствующую операцию.
Правила перегрузки операции:
1. Операция должна быть объявлена как public static
2. Параметры в операцию должны передаваться по значению (не ref, не out)
3. Двух одинаковых перегруженных операций в классе не должно быть
class array2
{ …
//функция перегрузки операции умножения как метод класса
array2& operator*(array2& m2)
{ if(m==m2.n)
{array2 *pta;
int s;
pta=new array2(n,m2.m);
for(int i=0;i<n;i++)
{ for(int j=0;j<m2.m;j++)
{s=0;
for(int k=0;k<m;k++)
s+=mas[i][k]*m2.mas[k][j];
pta->mas[i][j]=s;
}
}
return *pta;
}
else throw invalid_argument(“Не совпадают размеры массивов”);
}
…
};
main()
{ array2 m(2,3),m1(3,4),m2(2,4);
…
m2=m*m1;//можно записать в виде m2=m.operator *(m1)
}
Исключительные ситуации и способы их обработки. Блоки обработки и блоки завершения. Структурная обработка исключительных ситуаций.
Обработка исключительных ситуаций (англ. exception handling) — механизм языков программирования,предназначенный для описания реакции программы на ошибки времени выполнения и другие возможныепроблемы (исключения), которые могут возникнуть при выполнении программы и приводят к невозможности(бессмысленности) дальнейшей отработки программой её базового алгоритма. В русском языке такжеприменяется более короткая форма термина: «обработка исключений».
Общее понятие исключительной ситуации
Во время выполнения программы могут возникать ситуации, когда состояние данных, устройств ввода-вывода или компьютерной системы в целом делает дальнейшие вычисления в соответствии с базовымалгоритмом невозможным или бессмысленными. Классические примеры подобных ситуаций:
Нулевое значение знаменателя при выполнении операции целочисленного деления. Результата у операциибыть не может, поэтому ни дальнейшие вычисления, ни попытка использования результата деления неприведут к решению задачи.
Ошибка при попытке считать данные с внешнего устройства. Если данные не удаётся ввести, любыедальнейшие запланированные операции с ними бессмысленны.
Исчерпание доступной памяти. Если в какой-то момент система оказывается не в состоянии выделитьдостаточный для прикладной программы объём оперативной памяти, программа не сможет работатьнормально.
Появление сигнала аварийного отключения электропитания системы. Прикладную задачу, по всейвидимости, решить не удастся, в лучшем случае (при наличии какого-то резерва питания) прикладнаяпрограмма может озаботиться сохранением данных.
Появление на входе коммуникационного канала данных, требующих немедленного считывания. Чем бы низанималась в этот момент программа, она должна перейти к чтению данных, чтобы не потерятьпоступившую информацию.
Виды исключительных ситуаций
Исключительные ситуации, возникающие при работе программы, можно разделить на два основных типа:синхронные и асинхронные, принципы реакции на которые существенно различаются.
Синхронные исключения могут возникнуть только в определённых, заранее известных точках программы.Так, ошибка деления на нуль, ошибка чтения файла или коммуникационного канала — типичныесинхронные исключения, так как возникают они только в операции целочисленного деления, чтения изфайла или чтения из канала соответственно.
Асинхронные исключения могут возникать в любой момент времени и не зависят от того, какую конкретноинструкцию программы выполняет система. Типичные примеры таких исключений: аварийный отказ питанияили поступление новых данных.
Обработчики исключений Общее описание
В отсутствие собственного механизма обработки исключений для прикладных программ наиболее общейреакцией на любую исключительную ситуацию является немедленное прекращение выполнения с выдачейпользователю сообщения о характере исключения. Можно сказать, что в подобных случаях единственным иуниверсальным обработчиком исключений становится операционная система. Возможно игнорированиеисключительной ситуации и продолжение работы, но такая тактика опасна, так как приводит к ошибочнымрезультатам работы программ или возникновению ошибок впоследствии. Например, проигнорировав ошибкучтения из файла блока данных, программа получит в своё распоряжение не те данные, которые она должнабыла считать, а какие-то другие. Результаты их использования предугадать невозможно.
Обработка исключительных ситуаций самой программой заключается в том, что при возникновенииисключительной ситуации, управление передаётся некоторому заранее определённому обработчику —блоку кода, процедуре, функции, которые выполняют необходимые действия.
Существует два принципиально разных механизма функционирования обработчиков исключений:
Обработка с возвратом подразумевает, что обработчик исключения ликвидирует возникшую проблему иприводит программу в состояние, когда она может работать дальше по основному алгоритму. В этом случаепосле того, как выполнится код обработчика, управление передаётся обратно в ту точку программы, гдевозникла исключительная ситуация (либо на команду, вызвавшую исключение, либо на следующую за ней,как в некоторых старых диалектах языка BASIC) и выполнение программы продолжается. Обработка свозвратом типична для обработчиков асинхронных исключений (которые обычно возникают по причинам, несвязанным прямо с выполняемым кодом), для обработки синхронных исключений она малопригодна.
Обработка без возврата заключается в том, что после выполнения кода обработчика исключенияуправление передаётся в некоторое, заранее заданное место программы, и с него продолжаетсяисполнение.
Существует два варианта подключения обработчика исключительных ситуаций к программе: структурная инеструктурная обработка исключений.
Неструктурная обработка исключений
Неструктурная обработка исключений реализуются в виде механизма регистрации функций или команд-обработчиков для каждого возможного типа исключения. Язык или системные библиотеки предоставляютпрограммисту как минимум две стандартные процедуры: регистрации обработчика и разрегистрацииобработчика. Вызов первой из них «привязывает» обработчик к определённому исключению, вызов второй —отменяет эту «привязку». Если исключение происходит, выполнение основного кода программы немедленнопрерывается и начинается выполнение обработчика. По завершении обработчика управление передаётсялибо в некоторую наперёд заданную точку программы, либо обратно в точку возникновения исключения (взависимости от заданного способа обработки — с возвратом или без). Независимо от того, какая частьпрограммы в данный момент выполняется, на определённое исключение всегда реагирует последнийзарегистрированный для него обработчик. В некоторых языках зарегистрированный обработчик сохраняетсилу только в пределах текущего блока кода (процедуры, функции), тогда процедура разрегистрации нетребуется. Ниже показан условный фрагмент кода программы с неструктурной обработкой исключений:
УстановитьОбработчик(ОшибкаБД, ПерейтиНа ОшБД) // На исключение "ОшибкаБД" установлен обработчик - команда "ПерейтиНа ОшБД"
... // Здесь находятся операторы работы с БД
ПерейтиНа СнятьОшБД // Команда безусловного перехода - обход обработчика исключений
ОшБД: // метка - сюда произойдёт переход в случае ошибки БД по установленному обработчику
... // Обработчик исключения БД
СнятьОшБД: // метка - сюда произойдёт переход, если контролируемый код выполнится без ошибки БД.
СнятьОбработчик(ОшибкаБД) // Обработчик снят
Неструктурная обработка — практически единственный вариант для обработки асинхронных исключений, нодля синхронных исключений она неудобна: приходится часто вызывать команды установки/снятияобработчиков, всегда остаётся опасность нарушить логику работы программы, пропустив регистрацию илиразрегистрацию обработчика.
Структурная обработка исключений
Структурная обработка исключений требует обязательной поддержки со стороны языка программирования— наличия специальных синтаксических конструкций. Такая конструкция содержит блок контролируемогокода и обработчик (обработчики) исключений. Наиболее общий вид такой конструкции (условный):
НачалоБлока
... // Контролируемый код
...
если (условие) то СоздатьИсключение Исключение2
...
Обработчик Исключение1
... // Код обработчика для Исключения1
Обработчик Исключение2
... // Код обработчика для Исключения2
ОбработчикНеобработанных
... // Код обработки ранее не обработанных исключений
КонецБлока
Здесь «НачалоБлока» и «КонецБлока» — ключевые слова, которые ограничивают блок контролируемогокода, а «Обработчик» — начало блока обработки соответствующего исключения. Если внутри блока, отначала до первого обработчика, произойдёт исключение, то произойдёт переход на обработчик, написанныйдля него, после чего весь блок завершится и исполнение будет продолжено со следующей за ним команды. «ОбработчикНеобработанных» — это обработчик исключений, которые не соответствуют ни одному изописанных выше в данном блоке. Обработчики исключений в реальности могут описываться по-разному(один обработчик на все исключения, по одному обработчику на одно исключение и так далее), нопринципиально они работают одинаково: при возникновении исключения находится первыйсоответствующий ему обработчик в данном блоке, его код выполняется, после чего выполнение блоказавершается. Исключения могут возникать как в результате программных ошибок, так и путём явной ихгенерации с помощью соответствующей команды (в примере — команда «СоздатьИсключение»). С точкизрения обработчиков такие искусственно созданные исключения ничем не отличаются от любых других.
Блоки обработки исключений могут многократно входить друг в друга, как явно (текстуально), так и неявно(например, в блоке вызывается процедура, которая сама имеет блок обработки исключений). Если ни одиниз обработчиков в текущем блоке не может обработать исключение, выполнение данного блока немедленнозавершается, и управление передаётся на ближайший подходящий обработчик более высокого уровняиерархии. Это продолжается до тех пор, пока обработчик не найдётся и не обработает исключение.
Иногда бывает неудобно завершать обработку исключения в текущем блоке, то есть желательно, чтобы привозникновении исключения в текущем блоке обработчик выполнил какие-то действия, но исключениепродолжило бы обрабатываться на более высоком уровне (обычно так бывает, когда обработчик данногоблока не полностью обрабатывает исключение, а лишь частично). В таких случаях в обработчике исключенийгенерируется новое исключение или возобновляется с помощью специальной команды ранее появившееся.Код обработчиков не является защищённым в данном блоке, поэтому созданное в нём исключение будетобрабатываться в блоках более высокого уровня.
Блоки с гарантированным завершением
Помимо блоков контролируемого кода для обработки исключений, языки программирования могутподдерживать блоки с гарантированным завершением. Их использование оказывается удобным тогда, когдав некотором блоке кода, независимо от того, произошли ли какие-то ошибки, необходимо перед егозавершением выполнить определённые действия. Простейший пример: если в процедуре динамическисоздаётся какой-то локальный объект в памяти, то перед выходом из этой процедуры объект должен бытьуничтожен (чтобы избежать утечки памяти), независимо от того, произошли после его создания ошибки илинет. Такая возможность реализуется блоками кода вида:
НачалоБлока
... // Основной код
Завершение
... // Код завершения
КонецБлока
Заключённые между ключевыми словами «НачалоБлока» и «Завершение» операторы (основной код)выполняются последовательно. Если при выполнении их не возникает исключений, то затем выполняютсяоператоры между ключевыми словами «Завершение» и «КонецБлока» (код завершения). Если же привыполнении основного кода возникает исключение (любое), то сразу же выполняется код завершения, послечего весь блок завершается, а возникшее исключение продолжает существовать и распространяться до техпор, пока его не перехватит какой-либо блок обработки исключений более высокого уровня.
Принципиальное отличие блока с гарантированным завершением — он не обрабатывает исключение, алишь гарантирует выполнение определённого набора операций перед тем, как включится механизмобработки. Стоит заметить, что блок с гарантированным завершением легко реализуется с помощью команд«возбудить исключение» и «структурный обработчик исключения».
