Вы, как и я, постоянно сетовали на отсутствие вашего письма в Хогвартс? Вы, как и я, начинающий разработчик программного обеспечения? Если waiting_for_letter && budding_developer, я здесь, чтобы сказать вам, что, хотя вы и беспалочковые, у вас под рукой больше магии, чем вы можете себе представить - не что иное, как ваши навыки программирования!

В рамках этого поста я углублюсь в уникальную магию объектно-ориентированного программирования. Я буду использовать язык Ruby для конкретных примеров.

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

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

Встроенные методы похожи на базовые заклинания, которые каждый изучает на первом году обучения в Хогвартсе. Они входят в ваши учебники и довольно просты в использовании с самого начала (если вы не Невилл Лонгботтом). Когда вы изучаете одно из этих заклинаний, все, что вам действительно нужно, - это знать синтаксис (произносить «Алохомора!» И размахивать палочкой определенным движением) и знать, на какие типы объектов вы можете наложить заклинание (двери / замки) . Довольно просто, правда? Вам не нужно было вставлять ключ и поворачивать его, как это делают магглы. То же самое и со встроенными методами.

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

Это потому, что #length - это метод, который встроен в определенные классы объектов в Ruby. Он предоставлен вам непосредственно в вашем учебнике Charms или в онлайн-документации Ruby (в зависимости от того, какой ресурс вы выберете).

Но что, если вы хотите выполнить какие-то функции, которых нет ни в одном заклинании в ваших учебниках? Вы можете создать собственное заклинание или метод!

Северус Снейп в какой-то момент своей жизни решил, что ему нужна способность разрезать плоть своих врагов и позволить им истекать кровью в очень медленной и ужасной смерти. И что он сделал? Он создал свой собственный метод в классе Person! Я никогда не видел исходный код, но думаю, что это примерно так:

class Person
  ...
  def sectumsempra(enemy)
    enemy.flesh.split("")
    self.dark_wizard = true
  end
end

Каждый экземпляр класса Person имеет атрибут dark_wizard, для которого установлено логическое значение. Объект Person всегда создается со значением dark_wizard, равным false (на случай, если вам интересно). Поэтому, когда экземпляр класса Person вызывает метод #sectumsempra, значение его атрибута dark_wizard изменяется на true по очевидным причинам.

Аргумент, передаваемый этому методу, должен быть другим экземпляром класса Person. Объекты Person также имеют атрибут flesh, который указывает на объект String. Объекты String имеют встроенный метод #split, который при вызове с аргументом (“”) позволяет разделить компоненты строки в массив. Теперь любой экземпляр класса Person, к сожалению, можно передать в качестве аргумента для метода #sectumsempra.

К счастью, Снейп был достаточно любезен, чтобы написать еще один метод, который полностью изменил метод #sectumsempra:

Class Person
  ...
  def vulnera_sanentur(enemy)
    enemy.flesh.join
    self.dark_wizard = false
  end
end

После вызова #sectumsempra на enemy, enemy.flesh теперь является массивом. Массивы имеют встроенный метод #join, который объединяет элементы массива в строку. Следовательно, метод #vulnera_sanentur позволяет залечивать раны, нанесенные методом #sectumsempra.

#vulnera_sanentur также устанавливает значение dark_wizard для экземпляра, который вызвал метод, равным false, потому что, если бы у них хватило смелости отменить #sectumsempra, они не могли бы быть такими уж плохими. Однако это ставит под сомнение значение атрибута dark_wizard Гарри, поскольку он сам не вызывал #vulnera_sanentur метод после вызова harry.sectumsempra(malfoy). Может быть, он сможет аргументировать (не каламбур), что это была частичка Волан-де-Морта, живущая внутри него, что заставило его сделать это?

Вся эта магия стала возможной благодаря парадигме объектно-ориентированного программирования. Это позволяет нам взаимодействовать с нашим кодом, как если бы мы колдовали над реальными объектами. Так что перестань считать себя маглом или сквибом. Считайте себя ведьмой или волшебником программирования.