Вы, как и я, постоянно сетовали на отсутствие вашего письма в Хогвартс? Вы, как и я, начинающий разработчик программного обеспечения? Если 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)
. Может быть, он сможет аргументировать (не каламбур), что это была частичка Волан-де-Морта, живущая внутри него, что заставило его сделать это?
Вся эта магия стала возможной благодаря парадигме объектно-ориентированного программирования. Это позволяет нам взаимодействовать с нашим кодом, как если бы мы колдовали над реальными объектами. Так что перестань считать себя маглом или сквибом. Считайте себя ведьмой или волшебником программирования.