Python. Рекомендации по правильному структурированию программ с помощью функций

Рекомендации по правильному структурированию программ с помощью функций. Неявный вызов функции. Примеры


Содержание


Поиск на других ресурсах:




1. Рекомендации по разработке (проектированию) функций и модулей в программах

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

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

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

Для решения проблемы взаимодействия нужно:

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

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

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

 

2. Схема организации взаимодействия функции с другими частями программы

На рисунке 1 отображена схема взаимодействия функции с другими частями программы.

Python. Взаимодействие функции с внешними частями программы

Рисунок 1. Взаимодействие функции с внешними частями программы

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

  • с помощью оператора return;
  • с использованием изменяемых аргументов, при условии, что это предполагает вызывающая программа.

 

3. Функции как объекты. Операции над ссылками на объект функции

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

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

 

4. Неявный вызов функции. Понятие. Пример

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

# Функция, на которую будет объявлена ссылка
def Fn(parameters):
    # Код (тело) функции
    ...

# Получить ссылку на функцию
refFn = Fn

# Вызвать по ссылке функцию, параметры должны совпадать
refFn(parameters)

здесь

  • Fn – имя функции, на которую объявляется ссылка;
  • refFn – ссылка на функцию Fn();
  • parameters – список параметров, которые получает функция.

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

Пример. В примере демонстрируется присваивание имени функции Add() другой ссылке на функцию fn(). Затем по ссылке fn() вызывается функция Add() для вычисления суммы двух чисел.

# Ссылка на функцию. Вызов функции по ссылке
# Функция, возвращающая сумму двух чисел
def Add(x, y):
    return x+y

# Присвоить имя функции другому имени
fn = Add # fn - ссылка на функцию Add()

# Вызов функции Add() по ссылке fn
z = fn(3, 8)
print("z = ", z) # вывести результат

 

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

В примере демонстрируется вызов по ссылке одной из 3-х функций:

  • Max2() – определяет максимальное значение между двумя числами;
  • Max3() – определяет максимальное значение между тремя числами;
  • Max4() – определяет максимальное значение между четырьмя числами;

 

# Max2() - возвращает максимум между двумя числами
def Max2(a, b):
    if a>b:
        return a
    return b

# Max3() - максимум между тремя числами
def Max3(a, b, c):
    max = a
    if max<b: max=b
    if max<c: max=c
    return max

# Max4() - максимум между четырьмя числами
def Max4(a, b, c, d):
    max = a
    if max<b: max=b
    if max<c: max=c
    if max<d: max=d
    return max

# Продемонстрировать неявный вызов функций Max2(), Max3(), Max4().
fn = Max2 # ссылка fn указывает на функцию Max2()
maximum = fn(2.85, 7.6)
print("maximum = ", maximum)

fn = Max3 # ссылка fn указывает на функцию Max3()
maximum = fn(8.2, 3.44, 11.2)
print("maximum = ", maximum)

fn = Max4 # ссылка fn указывает на функцию Max4()
maximum = fn(1.6, 2.8, 0.3, 2.9)
print("maximum = ", maximum)

Результат выполнения программы

maximum = 7.6
maximum = 11.2
maximum = 2.9

 


Связанные темы