Программирование приложения во многом похоже на написание романа. У романов и программных приложений есть основная цель — рассказать историю в случае романа и предоставить некоторые автоматизированные функции в случае приложения. Цель сериала о Гарри Поттере — рассказать историю мальчика, который выжил, а цель Facebook — предоставить платформу, на которой люди могут общаться друг с другом в Интернете. .

Однако в книгах о Гарри Поттере есть нечто большее, чем история Гарри, а в Facebook есть нечто большее, чем функциональность — красота и согласованность, присущие творению, помимо функциональности, также имеют значение. В некотором смысле, достижение основного результата (заставить приложение работать или рассказать всю историю) на самом деле только «половина истории».

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

Жил-был парень по имени Гарри. Раньше он жил в чулане под лестницей, а теперь нет. Он пошел в школу — там были мальчики и девочки. Его друг по имени Хагрид был очень большим, потому что мама Хагрида была великаншей. Школа называлась Хогвартс, и ее местоположение было невозможно нанести на карту.

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

В этом примере способ представления понятий затрудняет понимание истории, вызывает вопросы и способствует ошибочным предположениям:

  • Поскольку шкаф и его школа появляются в соседних предложениях, есть ли какая-то связь между этими двумя понятиями? Гарри перестал жить под лестницей, потому что ходил в школу?
  • Часть о том, что мама Хагрида — гигант, буквальна или метафорична? Это будет зависеть от того, есть ли в этом мире гиганты. Где я могу найти эту информацию?
  • Почему столь своеобразный факт о жизненном положении Гарри приводится без каких-либо объяснений?

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

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

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

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

Одним из запутанных способов группировки понятий в романе было бы описание каждого персонажа в одном абзаце до начала истории. Звучит как хорошая идея? Тогда вам не придется беспокоиться о развитии персонажа, потому что читатель будет знать все, что нужно знать о персонаже с самого начала! Посмотрим:

Гарри — волшебник со шрамом на лбу. Он хорош в квиддиче, но посредственен в школе. Однажды он вел секретный урок по Защите от темных искусств под названием «Армия Дамблдора»… Гермиона — ведьма, которая очень хорошо учится в школе, и ее часто дразнили за то, что она ботаница. Иногда она становится мишенью предвзятых хулиганов, потому что ее родители - маглы.

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

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

Точно так же, как это делают авторы, разработчики программного обеспечения группируют понятия, инкапсулируя их в конструкции (например, в модули, объекты и функции). Функция является наименьшей из этих групп (аналог абзаца) и предназначена для короткого, легко читаемого фрагмента кода с четко определенной целью. функция обычно не длиннее 10 строк — точно так же, как абзац обычно не длиннее 10 предложений — в идеале 5. Объект, напротив, больше похож на главу и содержит множество функций. Обычно объект будет содержать максимум около 20 функций.

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

// A module — analogous to a chapter — about playing Quidditch.
module PlayQuidditch:
  function fly_into_air()
    get_onto_broom
    kick_off_from_ground
  end
  function chase_snitch()
    look_for_snitch
    fly_towards_snitch
  end
  function dodge_bludgers()
    check_for_beaters
    until safe_from_bludgers?
      fly_high_into_air
      fly_rapidly_side_to_side
    end
  end
  function safe_from_bludgers?()
    if can_see_bludger_approaching?
      return false
    end
 
   return can_see_beater_aiming_for_me?
  end
  function catch_snitch()
    extend_arm
    balance_on_broom
    until snitch_in_hand?
      reach_for_snitch
      grasp_snitch
    end
  end
  // Runs the sequence of events for playing quidditch.
  function main
    get_broomstick
    fly_into_air
    chase_snitch
    dodge_bludgers
    catch_snitch
  end
end