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

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

Чтобы лучше понять концепцию уровня абстракции, рассмотрим эту ситуацию.

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

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

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

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

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

Объектно-ориентированные языки программирования, такие как Java, позволяют писать программное обеспечение в манере, напоминающей эту структуру взаимодействия. Объект обычно вызывает метод интерфейса, который описывает передаваемое сообщение высокого уровня. В этом случае клиент (вы) вызывает метод orderMeal для любого человека, который может работать с интерфейсом Waiter (например, Waiter W). Вы также передали соответствующую информацию, такую ​​как название блюда и название напитка. Это параметры метода. Официант, в свою очередь, принимает заказ, выполняет некоторые служебные действия, такие как запись этой информации в системе управления заказами, а затем вызывает такой метод, как prepareMeal, для человека, который может обрабатывать интерфейс Chef (например, Chef C). Повар, в свою очередь, передает сообщения, вызывая такие методы, как chopVegetable, для человека, обрабатывающего (реализующего) интерфейс Helper (помощник H) и т. Д. Вы уловили идею.

Что касается программного обеспечения и компьютерных систем, каждый клиентский объект (который хочет, чтобы что-то было сделано) вызывает метод объекта, который может выполнить задание. На этом этапе уровень абстракции меняется, и задача становится более подробной. Эта задача далее разбивается на конструкции еще более низкого уровня. Этот процесс продолжается до тех пор, пока абстракция очень низкого уровня, такая как инструкция ЦП, не приступит к его выполнению.

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

Именно благодаря этим уровням абстракции так много процессов могут работать эффективно. Компании могут сосредоточиться на своей основной компетенции и делегировать другие задачи другим компаниям (которые могут быть экспертами в решении этих других задач). Это также свидетельствует о гибкости системы, которую вы можете построить с помощью этих идей. Например, ресторан может работать с уборщицей из компании A в этом году и заменить ее на компанию B в следующем году, не влияя на остальную часть их бизнеса. В объектно-ориентированных терминах вы можете заменить одну реализацию другой, если они реализуют один и тот же интерфейс.

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