IT-Блог о программировании и операционных системах

О вложенных подпрограммах в Delphi

Доброго времени суток, дорогие читатели. Данная заметка может быть не очень большая, но тем не менее, довольно информативная. В ней я расскажу о такой полезной возможности языка Delphi, как вложенные процедуры и функции (далее автор подразумевает, что значения слов “процедура” и “функция” одинаковы. Для удобства и по привычке). На самом деле, многие программисты Delphi знают, что такая возможность в языке есть, но вот используют ее единицы. Скажу больше – многие так называемые NewSchool Delphi-программисты вообще не имеют представления, что существует подобный вид подпрограмм.

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

Группирование кода по функциональной принадлежности

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

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

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

Повышение удобочитаемости исходного кода проекта

Данный факт – это как следствие из первого. Нам больше не приходится искать глазами, скролить экраны в поиске реализации функции. В нашем случаи, всё будет как бы в одном, т.е. в той самой головной процедуре или функции. В худшем варианте, придётся прокрутить на половину экрана вверх, чтобы посмотреть реализацию функции (или использовать комбинацию с Ctrl). Мы сможем быстро (подправить, дополнить, заменить) участок кода функции которая вызывается головной процедурой, а потом быстро перейти обратно не прибегая к дополнительным возможностям IDE Delphi (например, к закладкам).

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

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

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

Моё маленькое исследование

Я специально заморочился, и спросил 4 программиста-практика с довольно большим стажем работы с языком Си. Хотя в Си и нету такой возможности (использование локальных функций), но всё же, некоторые компиляторы (например GCC) всё таки позволяют это делать. Я задал вопрос: – “Действительно ли оправдано использование вложенных процедур в проектах?”, на что получил четыре весьма неоднозначных ответа, два из которых я трактовал как простое “Да” один как “Затрудняюсь ответить, работаю только со вложенными классами”, и всего один как “Нет”.

Заключение

Использовать или нет такие процедуры в своём коде – дело каждого. Трудно побороть свои устои программирования, которые складывались на протяжении многих лет – это факт. Я и сам, если честно, начал пользоваться таким приёмом совсем недавно. Конечно пока не привычно, и на первых порах кажется, что это неудобно. Но с каждым разом ты как бы переоцениваешь ситуацию и понимаешь, что плюсы от этого всё таки есть…

 

5 комментариев:

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

    ОтветитьУдалить
  2. >> разбираю чей-то чужой код с такими методами жутко путаюсь
    Это чужой ) А я вот свой иногда понять немогу ) Ну ничего главное привыкнуть.

    ОтветитьУдалить
  3. >Скажу больше – многие так называемые NewSchool >Delphi-программисты вообще не имеют >представления, что существует подобный вид >подпрограмм.
    Неправда.
    Программирую год, delphi 2009 - и вложенные функции использую повсеместно. Часто с директивой inline

    ОтветитьУдалить
  4. Ну, значит вы не относитесь к их числу :)

    ОтветитьУдалить
  5. Эта возможность Delphi несёт больше вреда чем пользы, так же как и With.
    Функцию удобнее читать если она умещается на 1 экран.
    А объединение несколько маленьких функций в одну большую ухуджает читаемость кода.
    Подфункции нельзя протестировать.

    Вам не кажется - это дейстительно неудобно.
    Осознание этого придёт с опытом, особенно программирования на других языках.

    ОтветитьУдалить