Студопедия — Жизненный цикл программ.
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Жизненный цикл программ.

 

Развивая идеи Грейнера, И. Адизес предположил, что динамика организационного развития, носит циклический характер. Эту идею он заложил в основу теории жизненных циклов организации. Согласно модели Адизеса, в процессе жизнедеятельности организации можно выделить десять закономерных и последовательных этапов.

 

 

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

 

Этап второй. Младенчество. На данном этапе компания не обладает еще четкой структурой и системой распределения полномочий и ответственности, основатель, возможно, работает больше всех. Его изнурительный труд и нежелание или неумение делиться полномочиями, а также акцент на краткосрочных результатах, пока важнейшие факторы выживания организации. Большое внимание уделяется результатам производства и удовлетворению потребностей конечных потребителей. Денег на этом этапе сильно не хватает – и это, кстати, вполне нормально.

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

Жизненный цикл программ.

Информатика- наука о способах получения, хранения, накопления, преобразования, передачи, защиты и использования информации.

Информатика

· Теоритическая (вычислимость, сложность, логика, формальная семантика)

· Прикладная (бизнес информатика)

· Естественно-научная (преобразование инфо. В естественной среде и живой природе)

· Технология ПО (soft engeneering)

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

Программ. Обеспечение определяется по стандарту ISO/IEC 2382-1:1993

Все или часть программ, процедур или правил и соответствующая документация инфо. Системы

Тех. Пр-м – технология всей процедурной части и безопасности

12207:1995 все бизнес процессы

Основные(приобретение, поставка, разработка, эксплуатация, сопровождение)

Вспоиогательные(документирование, конфигурирование, надзор за качеством, верификация, аттестация, совместная оценка, аудит, разрешение проблем)

Организационные (управление, усовершенствование, обучение, создание инфраструктуры)

Жизненный цикл-совокупность этапов бизнес процессов ПО от момента получения ТЗ (спецификация)и до списания в утиль резервной копии.

Промежуток времени от задумки до окончания

  1. Проектное предложение
  2. ТЗ
  3. Выбор инструментария
  4. Алгоритмизация
  5. Контроль1(проверка соответствий результатов алгорит. ТЗ)
  6. Кодирование
  7. Тестирование(проверка соответствий результатов кодирования ТЗ)
  8. Глобальной оптимизации (возвращение на 6 пункт)
  9. Приемо-сдаточные испытания
  10. Ввод в эксплуатацию
  11. Сопровождение
  12. Апгрейд
  13. Вывод из эксплуатации
  14. Архивирование
  15. Списание

Виды оптимизации. В зависимости от уровня представления программы различают следующие виды оптимизации:

1) Оптимизацию на уровне исходного языка (алгоритмическая). При этом в результате трансформации получается программа, записанная в том же самом языке.

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

3) Машинно-зависимую оптимизацию, то есть оптимизацию на уровне машинного языка.

Ко всем оптимизирующим алгоритмам предъявляется следующие жесткие требования:

1) Максимальная машинная независимость и переносимость на другие платформы.

2) Трудоёмкость разработки (в т.ч. тестирование) не должна превышать 10%-15%.

3) Алгоритм должен давать выигрыш не менее чем на 20%-25% в скорости выполнения.

4) Оптимизация должна допускать безболезненное внесение изменений.

С точки зрения эффективности наиболее предпочтительной является машинно-зависимая

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

Оптимизация по требуемой памяти относиться к машинно-зависимой и должна выполняться в первую очередь, т.к. оперативная память является одним из самых узких мест, сдерживающих производительность всей системы. Типовые алгоритмы обработки данных задействуют быстродействие оперативной памяти едва ли на треть, а зачастую и менее того! Грамотно организованный обмен данными выполняется, как правило, в три – четыре раза быстрее, причём эффективное взаимодействие с памятью достижимо на любом языке (в том числе интерпретируемом!), а не ограничено лишь одним

ассемблером.

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

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

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

рассчитывает обращаться в будущем. “Ручное” управление КЭШ-контроллером позволяет выбрать оптимальную стратегию упреждающей загрузки данных. Реализация программной предвыборки различны для разных типов процессоров (Intel и AMD). Приходится реализовывать функции, использующие предвыборку в 2 вариантах, что зачастую “съедает” выигрыш в производительности и ставит в зависимость программы от платформы. Смысл использовать предвыборку появляется тогда, когда мы можем предсказать адрес следующей обрабатываемой ячейки. Максимальная производительность достигается в случаях:

- предвыборка данных происходит в кэш-иерархию, соответствующую их назначению.

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

- происходит предвыборка только тех данных, которые действительно необходимы.

Компилятор Оптимизации, выполняемые компиляторами в основном используют аппаратные возможности процессора. Например, Intel,
-Автоматическое распараллеливание циклов при использовании векторных расширений (MMX, SSE, SSE2-4)

  • Удаление недосягаемого («мёртвого») кода и неиспользуемых присвоений
  • Подгонка, обращение циклов
  • Оптимизация множественных ветвлений
  • Развёртка, свёртка, объединение и разделение циклов
  • Вычисление инвариантов циклов, вынесение общих подвыражений и кода в ветвлениях, вынесение ветвлений из циклов
  • Переключение, объединение и разделение ветвлений
  • Предвыборка данных
  • Переупорядочивание функций
  • Встраивание и извлечение функций
  • Оптимальный выбор (замена, объединение, разделение) инструкций
  • Переупорядочивание инструкций
  • Распределение регистров
  • Удаление цепочек переходов
  • Векторизация
  • Понижение силы операций

· протяжка констант (подстановка в выражение величин известных констант)

· протяжка копий

· удаление общих подвыражений

· Изучаются и протягиваются внутрь процедуры свойства конкретных аргументов

способы написания переносимых программ: Использование Кроссплатформенных высокоуровневых ЯП, прикладных библиотек, отсутствие машинно-зависимого кода

Кроссплатформенными можно назвать большинство современных высокоуровневых языков программирования. Например, C, С++ и Free Pascal — кроссплатформенные языки на уровне компиляции, то есть для этих языков есть компиляторы под различные платформы. Java и C# — кроссплатформенные языки на уровне выполнения, то есть их исполняемые файлы можно запускать на различных платформах без предварительной перекомпиляции. PHP, Perl, Python, Tcl и Ruby — кроссплатформенные интерпретируемые языки, их интерпретаторы существуют для многих платформ.

wxWidgets- кросс-платформенная библиотека инструментов с открытым исходным кодом для построения графического интерфейса пользователя (GUI).

Qt- кросс-платформенный инструментарий разработки ПО на языке программирования C++. Позволяет запускать написанное с его помощью ПО в большинстве современных операционных систем путём простой компиляции программы для каждой ОС без изменения исходного кода.

Тестирование – творческий процесс. Главная задача тестирования – нахождение ошибок. Существует 2 подхода к тестированию: 1) функциональное (тестирование по данным, тестирование черного ящика) – структура программы не учитывается, Функциональное тестирование

3 способа:

1. Метод эквивалентного разбиения. Теоретически нужно тестировать на всех возможных данных. Все множество значений исходных данных разделяем на подмножества и предполагаем, что из каждого множества достаточно взять 1 значение (это классы эквивалентности). Различают правильные и неправильные классы эквивалентности (по допустимости исходных данных). Минусы: если исходных данных много, то трудно построить классы эквивалентности.

2. Метод граничных значений. Выявление путем анализа задачи. Рекомендуют проверить граничные условия по выходу. Общий недостаток – трудность отслеживание исходных данных.

3. Метод функциональных диаграмм. Состоит из 6 этапов:

а) разделение внешней спецификации на отдельные независимые участки

б) выделение причины и следствия (причина – те или иные исходные данные, следствие – результат)

в) составление собственно функциональной диаграммы (ФД)

г) на ФД заносятся ограничения, связанные с допустимыми и недопустимыми значениями исходных данных

д) ФД преобразуется в таблицу решений

е) таблица решений преобразуется в тесты

Метод эффективен если много исходных данных и накладываются сложные условия.

2) структурное (тестрование управления, тестирование белого ящика) – известна структура программы и проектируются тесты в зависимости от управленческих структур. Структурное тестирование Известна структура программы и проектируются тесты в зависимости от управленческих структур. Тестирование проводят по следующим уровням.

Самый слабый критерий – составление таких тестов, чтобы каждый оператор выполнялся хотя бы один раз. Если есть блок-схема программы, то составляются тесты так, чтобы каждая ветвь выполнялась хотя бы один раз (при условии, что каждый условный блок содержит одно условие). Более сильный критерий – комбинаторное покрытие условий и решений: должны тестироваться все варианты условий и решений.

 

Тестирование проводят по следующим уровням:

1. Тестирование отдельных процедур и функций.

2. Совместное тестирование процедур и функций.

3. Тестирование функций программного комплекса.

4. Тестирование всего комплекса в целом.

На 1 и 2 может применяться структурное тестирование, на последних – функциональное. Если логика программы очень сложная, то надо провести тщательное структурное тестирование. Особая опасность в компбинациях разных условий.

 

Методологии программирования: структурное программирование; модульное программирование; объектно-ориентированное программирование (ООП). Концепции ООП – инкапсуляция, наследование, полиморфизм, абстрагирование. Абстрактные типы данных. Классы, объекты и методы. Распределение динамической памяти и обработка ошибок в современных ООП языках.

Структурное программирование (программ без go to) — методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков. В соответствии с данной методологией:

1) Любая программа представляет собой структуру, построенную из трёх типов базовых конструкций:

· последовательное исполнение — однократное выполнение операций в том порядке, в котором они записаны в тексте программы;

· ветвление — однократное выполнение одной из двух или более операций, в зависимости от выполнения некоторого заданного условия;

· цикл — многократное исполнение одной и той же операции до тех пор, пока выполняется некоторое заданное условие (условие продолжения цикла).

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

3) Разработка программы ведётся пошагово, методом «сверху вниз».

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

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

Модульное программирование – это разбиение задач на некоторое число различных модулей, использование стандартных модулей путем их параметрических настроек, автоматизации сборки готовых модулей из библиотек, банков модулей.

Основные концепции модульного программирования:

1) каждый модуль реализует единственную независимую функцию;

2) каждый модуль имеет единственную точку входа и выхода;

3) размер модуля по возможности должен быть минимизирован;

4) каждый модуль может быть разработан и закодирован различными членами бригады программистов и может быть отдельно протестирован;

5) вся система построена из модулей;

6) модуль не должен давать побочных эффектов;

7) каждый модуль не зависит от того, как реализованы другие модули.

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

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

Концепция модульного программирования реализована в ряде языков, таких как Modula 2, Turbo Pascal 5.0 и выше, C, и др. Отличие в реализации процедурного программирования от модульного состоит в том, что модуль не виден программе. В отличие от стандартных языков процедурного программирования, в модульных языках лишние модули просто не прикомпановываются на этапе сборки.

Объектно-ориентированное программирование (ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов.

Класс — это тип, описывающий устройство объектов. Понятие «класс» подразумевает некоторое поведение и способ представления. Понятие «объект» подразумевает нечто, что обладает определённым поведением и способом представления. Говорят, что объект — это экземпляр класса. Класс можно сравнить с чертежом, согласно которому создаются объекты. Обычно классы разрабатывают таким образом, чтобы их объекты соответствовали объектам предметной области. Класс является описываемой на языке терминологии (пространства имён) исходного кода моделью ещё не существующей сущности, т.н. объекта.

Объект — сущность в адресном пространстве вычислительной системы, появляющаяся при создании экземпляра класса (например, после запуска результатов компиляции (и линковки) исходного кода на выполнение).

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

Классы могут наследоваться друг от друга. Класс-потомок получает все поля и методы класса-родителя, но может дополнять их собственными либо переопределять уже имеющиеся. Большинство языков программирования поддерживает только единичное наследование (класс может иметь только один класс-родитель), но в C++ допускается множественное наследование — порождение класса от двух или более классов-родителей. Множественное наследование порождает целый ряд проблем, как логических, так и чисто реализационных, поэтому в полном объёме его поддержка не распространена. Вместо этого в 1990-е годы появилось и стало активно вводиться в объектно-ориентированные языки понятие интерфейса. Интерфейс — это класс без полей и без реализации, включающий только заголовки методов. Если некий класс наследует (или, как говорят, реализует) интерфейс, он должен реализовать все входящие в него методы. Использование интерфейсов предоставляет относительно дешёвую альтернативу множественному наследованию. Взаимодействие объектов в абсолютном большинстве случаев обеспечивается вызовом ими методов друг друга.

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

Абстрактный тип данных — это тип данных, который предоставляет для работы с элементами этого типа определённый набор функций, а также возможность создавать элементы этого типа при помощи специальных функций. Вся внутренняя структура такого типа спрятана от разработчика программного обеспечения — в этом и заключается суть абстракции. Абстрактный тип данных определяет набор независимых от конкретной реализации типа функций для оперирования его значениями. Конкретные реализации АТД называются структурами данных. В программировании абстрактные типы данных обычно представляются в виде интерфейсов, которые скрывают соответствующие реализации типов. Программисты работают с абстрактными типами данных исключительно через их интерфейсы, поскольку реализация может в будущем измениться. Такой подход соответствует принципу инкапсуляции в объектно-ориентированном программировании. Сильной стороной этой методики является именно сокрытие реализации. Раз вовне опубликован только интерфейс, то пока структура данных поддерживает этот интерфейс, все программы, работающие с заданной структурой абстрактным типом данных, будут продолжать работать. Разработчики структур данных стараются, не меняя внешего интерфейса и семантики функций, постепенно дорабатывать реализации, улучшая алгоритмы по скорости, надежности и используемой памяти.

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

Инкапсуляция обеспечивается следующими средствами:

1) Контроль доступа. Поскольку методы класса могут быть как чисто внутренними, обеспечивающими логику функционирования объекта, так и внешними, с помощью которых взаимодействуют объекты, необходимо обеспечить скрытость первых при доступности извне вторых. Для этого в языки вводятся специальные синтаксические конструкции, явно задающие область видимости каждого члена класса. Традиционно это модификаторы public, protected и private, обозначающие, соответственно, открытые члены класса, члены класса, доступные только из классов-потомков и скрытые, доступные только внутри класса. Конкретная номенклатура модификаторов и их точный смысл различаются в разных языках.

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

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

Сокрытие данных — неотделимая часть ООП, управляющая областями видимости. Является логическим продолжением инкапсуляции. Целью сокрытия является невозможность для пользователя узнать или испортить внутреннее состояние объекта.

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

Полиморфизмом называют явление, при котором функции (методу) с одним и тем же именем соответствует разный программный код (полиморфный код) в зависимости от того, объект какого класса используется при вызове данного метода. Полиморфизм обеспечивается тем, что в классе-потомке изменяют реализацию метода класса-предка с обязательным сохранением сигнатуры метода. Это обеспечивает сохранение неизменным интерфейса класса-предка и позволяет осуществить связывание имени метода в коде с разными классами — из объекта какого класса осуществляется вызов, из того класса и берётся метод с данным именем. Такой механизм называется динамическим (или поздним) связыванием — в отличие от статического (раннего) связывания, осуществляемого на этапе компиляции.

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

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

Статические поля используются для хранения данных, общих для всех объектов класса. Эти поля существуют для всех объектов в единственном экземпляре, т.е. не дублируются.

· Память под статические поля выделяется 1 раз, независимо от числа созданных объектов(и даже при их отсутствии) и инициализируются при помощи оператора доступа к области действия::

· Память, занимаемая статическим полем не учитывается при определении размера объекта с помощью операции sizeof

· Статическим методам не передается указатель this т.к. они могут работать только со статическими полями

· Статические методы могут быть вызваны и без создания объекта, при помощи оператора доступа к области действия::

Память, динамически выделяемая при работе с полями объекта, при уничтожении объекта должна освобождаться в деструкторе. В некоторых ЯП(php 5,java,c#) при уничтожении объекта вызывается алгоритм «сбора мусора» который автоматически освободит память, выделенную для объекта(Программист все равно должен следить за закрытием сетевых соединений, файловых дескрипторов и т.д.). Однако программист должен избегать возникновения ситуации циклических ссылок. Исключительная ситуация –возникновение непредвиденного или аварийного события. Исключения позволяют логически разделить вычислительный процесс на две части- обнаружение аварийной ситуации и ее обработка.

Общий механизм обработки исключений: 1. Появление ошибки. Функция в которой она возникла генерирует исключение. Для этого используется ключевое слово throw с параметром, определяющим вид исключения. 2. Отыскивается соответствующий обработчик исключения и ему передается управление. 3. Если обработчик исключения не найден, вызывается функция,аварийно завершающая процесс. Ключевое слово try служит для обозначения контролируемого блока кода в котором может генерироваться исключение.

Обработчики исключений начинаются с ключевого слова catch, в скобках указывается тип исключения.

После обработки исключения управление передается первому оператору, находящемуся за обработчиком. Когда генерируется исключение, то выполняются следующие действия

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



<== предыдущая лекция | следующая лекция ==>
 | Тема: Жизненный цикл семьи.

Дата добавления: 2015-10-02; просмотров: 3171. Нарушение авторских прав; Мы поможем в написании вашей работы!



Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...

Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...

Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

Искусство подбора персонала. Как оценить человека за час Искусство подбора персонала. Как оценить человека за час...

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

Тема 5. Анализ количественного и качественного состава персонала Персонал является одним из важнейших факторов в организации. Его состояние и эффективное использование прямо влияет на конечные результаты хозяйственной деятельности организации.

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

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

Тема 2: Анатомо-топографическое строение полостей зубов верхней и нижней челюстей. Полость зуба — это сложная система разветвлений, имеющая разнообразную конфигурацию...

Studopedia.info - Студопедия - 2014-2024 год . (0.012 сек.) русская версия | украинская версия