Масштабируйте свой код и расширяйте свой язык, создавая расширения

Вам когда-нибудь приходилось менять местами два элемента в массиве или списке? Может быть, вы напишете такую ​​функцию:

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

Единственная проблема в том, что кто-то должен знать, что этот код существует. Чтобы повторно использовать этот код, кто-то должен его найти, а затем использовать. Они могли «обыскать всех» по swap. Они могли посмотреть на служебный класс. Но это не масштабируемое решение. Это не обнаруживается.

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

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

Но если вы только просмотрите этот код, он скрывает истинную мощь расширений. Функция swap, которую написал ваш друг, теперь отображается здесь:

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

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

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

Но если вы планируете работать над базой кода в течение длительного периода времени, вы увидите огромные преимущества, создав этот легко повторно используемый код. Используйте свое здравое суждение. Будет ли код, который вы пишете, кому-то полезен? Является ли эта функциональность естественным продолжением объекта, с которым вы работаете? Сделайте расширение!

Не все расширения одинаковы

Не все языки одинаково относятся к расширениям. В языках, с которыми я в основном работаю сейчас (Swift, Kotlin), расширения являются своего рода «первоклассными» и не требуют особых размышлений или шаблонов использования. Если вы создаете расширение, вы можете его использовать! Он ведет себя как обычная функция.

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

Думаю, теперь я убедился в полезности расширений и много писал на JavaScript. Я почти ничего не знаю об истинном страхе перед использованием прототипов (отсутствие безопасности типов? Обычно это проблема Javascript), но, вероятно, стоит их обойти.

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

Попробуйте сами!

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

Просто убедитесь, что у ваших расширений нет побочных эффектов.