Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП.doc
Скачиваний:
1
Добавлен:
24.09.2019
Размер:
522.24 Кб
Скачать

Вопрос 1) Эволюция парадигм программирования. Основные идеи и принципы ООП

Парадигмы программирования

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

Рис. 1. Схематическое представление поколений языков программирования

Рис. 2.Эволюция парадигм программирования

Императивная, или процедурная парадигма, представляет традиционный подход к процессу программирования. Действительно, именно в соответствии с этой парадигмой построен цикл обработки команды центрального процессора: "извлечь-декодировать-выполнить". Как следует из названия, императивная па­радигма определяет процесс программирования как запись последовательности команд, которая при выполнении выполнит обработку данных, необходимую для получения желаемого результата. Таким образом, для решения задачи импера­тивная парадигма предлагает попытаться найти алгоритм ее решения.

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

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

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

Вопрос 2) Понятие класса и объекта

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

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

--------------------------------------------------------------------------------------------------------------------

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

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

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

Вопрос 3) Структура класса и синтаксис декларации класса

С++

Синтаксис

Здесь показана основная форма:

class имя_класса : список_базовых_классов {

public: // Модификатор доступа относится

// ко всем перечисленным после

// него членам до следующего

// модификатора доступа

// Объявление общедоступных членов класса

protected:

// Объявление членов класса, доступных

// только для производных классов

private:

// Объявление защищенных членов класса

};

В объявлении класса список__объектов не обязателен. Имя_класса также не обязательно, но с точки зрения практики оно необходимо. Доводом в пользу этого является то, что имя_класса становится именем нового типа данных, которое используется для объявления объектов класса.

Функции и переменные, объявленные внутри объявления класса, становятся, членами (members) этого класса. По умолчанию все функции и переменные, объявленные в классе, становятся закрытыми для класса. Это означает, что они доступны только для других членов того же класса. Для объявления открытых членов класса используется ключевое слово public, за которым следует двоеточие. Все функции и переменные, объявленные после слова public, доступны как для других членов класса, так и для любой другой части программы, в которой находится этот класс.

Декларация:

<Имя класса> <Имя обьекта класса>;

C#:

Вторая попытка написать что-то полезное для совсем начинающих в С#. Если в таком вот виде кому-то полезно — отпишитесь, если нет, но вы знаете как сделать лучше — пишите. Я постараюсь написать понятнее и полезнее, но мне тяжело догадываться, что именно вам нужно.

Чуть-чуть о структуре кода: верхним элементом структуры являются пространства имен (namespace), довольно фиктивная вешь, призванная упорядочить ту кучу классов, списков, интерфейсов и констант, которые уже существуют и будут создаваться. В namespace могут входить другие namespace, классы, enum, константы и интерфейсы. Класс состоит из функций, переменных и констант. По поводу переменных — они могут быть объявлены на любом уровне, и существовать будут только в пределах (и во время жизни) того блока, в котором объявлены. Например: переменная объявленная в классе доступна для всего класса, часто для других классов, живет все время, пока жив класс (если он статичный) или объект класса (если не статичный). Другой пример: переменная объявленная в пределах блока if { }, который находится внутри блока for { }, который находится внутри функции класса... такая переменная будет доступна только в пределах блока if {}, в котором объявлена и будет жить пока не закончится выполнение блока, т.е. даже до конца функции не доживет. О том, что такое статический класс, что значит переменная объявлена и пр — читайте ниже.

Синтаксис деклараций Декларации — или объявления — это определение имени и формирование типа, прикрепляемого к этому имени. Т.е. если вам нужно место для хранения целого числа, вы должны объявить переменную, с понятным вам именем, типа данных целое (int). К слову, int = integer = целое число. И помните, декларация не создает объект и не выделяет память — это только закрепление имени за типом. Для создания декларированного объекта необходимо его инициализировать (или определить), т.е. либо присвоить начальное значение, либо запустить конструктор. Декларация классов, функций и переменных на уровне класса требует указания модификатора доступа. Впрочем, если не указывать будет использован стандартный, обычно private. Модификаторы доступа — это ключевые слова, определяющие, откуда можно будет получить доступ к декларированной переменной/функции и пр. Их всего несколько: private — доступ возможен только изнутри класса, в котором объявлена. protected — доступ возможен из этого класса и всех наследников. internal — доступ возможен из всей assembly (сборки/библиотеки, файла короче). Также применяется для классов, enum и интерфейсов. public — доступ возможен откуда угодно. Также применяется для классов, enum и интерфейсов. Есть еще модификаторы состояния, определяющие принципиальное состояние функций: static — функция статична, т.е. возможно ее исполнение без создания объекта класса. Например, функции класса System.Math — статичные, поскольку выполняются простым вызовом, без создания объекта класса Math. Также применяется для классов, тогда все входящие в него функции и переменные должны быть static. abstract — функция только декларирована, а определение функции должно быть в классах наследниках. Используется для создания шаблона класса, все наследники которого обязательно имеют некий набор функций. Может существовать только в abstract классе. Также применяется для классов. virtual — функцию можно переопределить в классе наследнике. override — используется для указания, что описываемая функция переопределяет родительскую. Модификатор доступа для функции/переменной внутри класса не может быть более доступным, нежели модификатор доступа всего класса. Переменные, декларируемые внутри функций модификатора доступа не требуют.

Декларация переменных обязательно состоит из типа данных и имени, остальное — по ситуации и желанию. Примеры деклараций переменных:

int i;

public double myDouble1, myDouble2;

internal static System.String const_string = "константа";

Декларация функций обязательно состоит из типа возвращаемых данных, имени и списка аргументов, остальное — по ситуации. Возращаемым типом данных может быть void — пустой — т.е. нет возвращаемых данных. Список аргументов тоже может быть пустым. Функции, в отличии от переменных, не могут быть только декларированы — они обязательно сразу определяются. Единственное исключение — тип функций abstract, они только декларируются, а определяются уже в классах наследниках. Примеры деклараций и определения функций:

private void MyFunc1(int i1, double d1) {}

internal abstract string GetAsString();

internal override string GetAsString() {}

public static double GetSum(double d1, double d2) { return d1+d2; }

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

internal class MyClass1 : MyParentClass1, IInterface1, IInterface2

{

}

Декларация конструктора класса может включать указание на другой конструктор, который должен быть запущен до декларируемого, например, конструктор родительского класса:

public class MyClass : ParentClass {

public MyClass(int i1) : base() {

}

public MyClass() : this(0) {

}

}

И последнее — декларация Enum. Enum = enumeration = перечисление. Список значений. Создается для двух целей: его можно использовать программисту — связать список целочисленных значений с понятными словами, и пользоваться словами, а не числами, в которых легко запутаться; его можно использовать пользователям — имена значений в списке можно легко вывести на пользователя. Пример декларации Enum:

public enum ImageFileFormat {

JPEG,

PNG,

TIFF,

Bitmap}

public enum SupportedLanguages {

Русский=1,

English=10,

German=11}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]