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

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

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

Что такое модульность кода?

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

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

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

Почему важна модульность кода?

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

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

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

Преимущества модульного программирования

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

1. Структура кода и удобочитаемость:

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

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

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

2. Эффективная отладка и тестирование:

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

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

Модульность в Databricks

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

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

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

Методы реализации модульности в Databricks

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

Существует два основных метода, которые можно использовать для реализации модульности кода в Databricks, а именно команда %run и API рабочего процесса блокнота. Оба метода используют ноутбуки в качестве модулей основной программы, но немного отличаются по своей функциональности.

1. Команда %run:

Простейшей формой модульности в Databricks является команда %run. Как следует из названия, эта команда просто запускает внешний блокнот, когда она вызывается во время выполнения другого блокнота. Таким образом, все во внешнем файле (или вызываемом) становится доступным для предварительно открытого (или вызывающего) блокнота.

Основной синтаксис этой команды довольно прост. Все, что нужно сделать пользователю, это написать команду %run, а затем указать путь к файлу вызываемой записной книжки. Затем можно использовать любую функцию или переменную, определенную во вновь указанной записной книжке, даже если она не была определена в записной книжке, в которой работает пользователь.

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

Затем эта функция становится доступной в записной книжке, вызвавшей OtherNotebook, и пользователь может продолжать использовать эту функцию по своему усмотрению в любом месте имеющейся записной книжки.

2. API рабочего процесса ноутбука:

Записную книжку также можно вызвать внутри другой записной книжки, вызвав ее с помощью API запуска, официально предоставляемого Databricks. Основное различие между этим методом и командой %run заключается в том, что использование этого подхода позволяет передавать аргументы и получать возвращаемые значения из вызываемой записной книжки.

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

dbutils.notebook.run(path: String, timeout_seconds: int, arguments:Map)

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

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

Краткое содержание

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

Есть еще два основных способа реализовать модульность кода в Databricks: команда %run и API-интерфейсы рабочего процесса записной книжки. С помощью этих методов пользователи могут сочетать мощность Databricks с эффективностью модульности для удовлетворения всех своих потребностей в данных.