Файл: Основные правила работы с функциями: примеры и ограничения использования функций в различных языках программирования (Языки программирования высокого уровня).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 23.04.2023

Просмотров: 609

Скачиваний: 7

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

В C# для объектов, которые должны быть видны в пределах сборки введён специальный модификатор internal (аналог default в языке программирования Java), а protected позволяет сохранить свой изначальный смысл, который был взят из языка программирования C++ - доступ выполняется только из классов-потомков.

Допускается выполнять некоторую комбинацию методов доступа к членам класса protected и internal в этом случае получается область доступа, которая соответствует типу доступа protected в языке программирования Java.

Внутренние классы.

Оба языка программирования обеспечивают определение класса внутри пользовательского класса. В объектно-ориентированном языке программирования Java внутренние классы могут быть использованы для эмуляции замыканий. Внутренние классы языка программирования Java имеют доступ к нестатическим членам родительского класса, то есть «знают о this».

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

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

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

В языке программирования C# есть лямбды и замыкания. Подход C# более напоминает язык программирования C++: внутренние классы в C# могут получить специальный доступ только к статическим членам внешних классов, а для выполнения доступа к нестатическим членам необходимо выполнить явное указание на экземпляр внешнего класса [18]. В тоже время, внутренние локальные классы в языке программирование C# и не поддерживаются.

В языке программирования Java начиная с 8 версии также появились лямбда выражения.

Методы.

В обоих языках программирования методы могут быть определены через внутренние функции классов. Тело используемого метода может быть расположено внутри описания определенного класса. Также, поддерживаются языками программирования C# и Java абстрактные методы и статические методы.


В языке программирования C# представлены механизмы явной реализации методов интерфейса, что обеспечивает классам реализовывать методы интерфейса отдельно от собственных методов или давать разные реализации одноимённых методов, которые принадлежат различным интерфейсам [12].

В объектно-ориентированном языке программирования Java базовые типы (byte, int, double, float, bool и пр.) могут быть переданы по значению, а для остальных (объектные) по значению может быть передана ссылка на необходимый объект.

В C# запрещено давать методам название, которое совпадает с названием некоторого класса, что позволяет устранить ошибки (в Java программисты могут определять конструктор, который будет на самом деле являться методом).

В языке программирования C# в дополнение к примитивным типам можно передавать по значению структуры (struct), остальные типы могут быть переданы по средствам использования технологии ссылок. В объектно-ориентированном языке программирования C# поддерживается явное описание выполнения передачи необходимых параметров по ссылке с использованием ключевых слов out и ref.

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

Язык программирования C# спроектирован в полной пере кросплатформенным, однако его развитие не пошло в этом направлении. Поэтому под управлением операционной системы Windows образовалась достаточно полная .net информационная инфраструктура; на других же вычислительных платформах равноценной инфраструктуры впоследствии не появилось [13].

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

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


И хотя язык программирования С# возможно использовать для построения прикладных программных приложений под не-Windows платформы, проблемы, вызываемые использованием технологии .net в не-Windows окружении, сводят на нет многие преимущества выбора языка программирования C#. Поэтому рекомендовать его для кроссплатформенного использования можно разве что если код на C# уже написан. При этом надо четко понимать, что в перспективе это будет приносить дополнительные затраты на поддержку.

Глава 2. Функции в языках программирования

2.1. Функции в языке программирования С++

Функции представляют собой блоки кода, которые выполняют определенные вычислительные операции. Если возникает необходимость, функция может определять входные параметры, которые позволяют вызывающим объектам выполнять передачу ей аргументы. При возникновении необходимости функции также могут возвращать выходное значение. Функции являются достаточно полезными для инкапсуляции базовых операций в едином блоке, который может быть в последствии многократно использован [10]. В идеальном случае имя такого блока должно четко описывать функциональное назначение функции.

Следующая функция принимает от вызывающего ее объекта два целых числа и возвращает их сумму. Переменные a и b являются параметрами целого типа int.

int summ(int a, int b)

{

return a + b;

}

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

int main()

{

int i = summ(11, 33);

int j = summ(i, 67);

cout << "Значение j составляет " << j << endl;

}

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

Функции, которые определены в области видимости пользовательского класса, называют функциями-членами. В языке программирования C++, в отличие от других языков программирования, функции можно также определять непосредственно в области видимости пространства имен (включая неявное глобальное пространство имен) [15]. Подобные функции принято называть свободными или функциями, которые не являются членами. Такие функции часто используются в стандартной библиотеке языка программирования.


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

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

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

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

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

Функция не может возвращать другие функции и встроенные массивы. Однако возможен возврат указателей на эти типы, а также лямбда-выражений, создающих объект-функцию. За исключением этих случаев функция может вернуть значение любого типа, входящего в ее область видимости, а также не возвращать никакого значения [11]. В последнем случае возвращаемый тип – void.

В C++14 можно использовать auto, чтобы дать компилятору команду получения возвращаемого типа из тела функции без использования завершающего возвращаемого типа. Обратите внимание, что auto всегда сводится к возвращению по значению. Используйте auto&&, чтобы дать компилятору команду выведения ссылки.

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


Локальные статические объекты удаляются во время завершения, определенного директивой atexit. Если статический объект не был создан из-за того, что поток кода программы обошел соответствующее объявление, попытка удаления этого объект не предпринимается.

В C++ локальные переменные можно объявлять как статические. Переменная является видимой только в теле функции, однако для всех экземпляров функции существует только одна копия переменной.

2.2. Функции в языке программирования С#

Функция являет собой небольшую подпрограмму. Если просто программа - это решение какой-то прикладной задачи, то функция – это тоже решение, только уже в рамках программы и, соответственно, она выполняет задачу «попроще». Функции позволяют уменьшить размер программы за счет того, что не нужно повторно писать какой-то фрагмент кода - просто необходимо вызвать сколько угодно и где нужно объявленную функцию [20].

Функции в С# также называют методами, которые определяются в классах. Весь программный код пишется в функции main. Функция main является главной функцией приложения и точкой входа программы. Любая функция в С# может быть объявлена только в рамках класса, так как C# - полностью объектно-ориентированный язык программирования (ООП). Объявление пользовательской функции внутри другой функции (например main) недопустимо. Объявление функции имеет следующую структуру:

[модификатор доступа] [тип возвращаемого значения] [имя функции] ([аргументы])

{

// тело функции

}

Модификатор доступа (области видимости) может быть public, private, protected, internal.

Между модификатором и типом может стоять ключевое слово static, что означает, что функция будет статичной. Из статичной функции можно вызывать другие функции, если они тоже статичные. Главная функция main – всегда static, поэтому все представленные функции будут статичными [19].

Функция может возвращать значение или не возвращать. Если функция, например, возвращает целое число, то нужно указать тип int. Если функция не возвращает никакого значения, то для этого необходимо использовать ключевое слово void. Также, необходимо отметить, что функции, которые не возвращают значение, еще называют процедурами.

Называть функции стоит так, чтобы имя отображало суть функции. Для чего можно использовать глаголы или словосочетания с глаголами. Например: GetAges(), Sorts(), SetVisibilitys().