полиморфная диспетчеризация от объектно-ориентированного программирования с сопоставлением с образцом - PullRequest
0 голосов
/ 20 октября 2019

Ниже приведен абзац одной из книг (подробности о книге ниже), которые я читаю для Scala. Я не могу понять, что автор пытается сказать. Кто-нибудь может предоставить более подробную информацию об этом?

Детали книги:

Программирование Scala, 2-е издание Дин Уэмплер, Алекс Пэйн. Я читаю эту книгу из приложения O'Reilly Safari books, поэтому у меня нет номера страницы. Это с самого конца главы «Глава 1 от нуля до шестидесяти: введение в Scala»

О себе: Я работаю со Scala 2.11 около 1,5 лет и имею некоторый умеренный опыт работы с ним. Я бы оценил себя как 3/5 в моем уровне квалификации. Я пытаюсь прочитать упомянутую книгу, чтобы улучшить свои знания.

Фрагмент из книги: «Следовательно, мы объединили полиморфную диспетчеризацию от объектно-ориентированного программирования с сопоставлением с образцом, рабочую лошадку функционального программирования. Это один из способов, которым Scala элегантно интегрирует эти две парадигмы программирования ».

1 Ответ

1 голос
/ 20 октября 2019

Хотя вы, возможно, захотите указать эту информацию в своем вопросе в следующий раз, я предполагаю, что вы говорите о разделе «Вкус параллелизма» , начинающемся на странице 19, точнее, заключительном абзаце на странице 27.

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

Сопоставление с образцом - это то, что вы можете сделать в функциональных языках, таких как Scala, а именно, чтобы изменить выполнение метода на основепо шаблону, которому следует один или несколько его аргументов (что-то вроде оператора case с наддувом, если метки могут быть гораздо более подробными и включать тип и другие характеристики его аргументов!).

Каркас Akka (который предлагает Scala API) используется для получения легкого параллелизма и основан на модели актера. Актеры отправляют друг другу сообщения, которые обрабатываются асинхронно, неблокирующим образом.

Теперь, когда у нас есть основы, давайте рассмотрим код, к которому относится абзац:

def receive = {  
    case s: Shape => 
        s.draw(str => println(s"ShapesDrawingActor: $str"))
        sender ! Response(s"ShapesDrawingActor: $s drawn")
    case Exit => 
        println(s"ShapesDrawingActor: exiting...") 
        sender ! Finished 
    case unexpected => 
        val response = Response(s"ERROR: Unknown message: $unexpected"
        println(s"ShapesDrawingActor: $response") 
        sender ! response
}

Метод приема актера в Akka вызывается каждый раз, когда он получает сообщение от другого актера. Сообщение может быть любого класса (например, String, Double или даже ваш собственный класс). Когда это происходит, сначала используется сопоставление с образцом (см. Метки регистра?) Для выполнения кода в зависимости от типа (класса) сообщения.

Если субъект получает сообщение класса Shape, первая строка после метки регистра Shape затем вызывает метод draw экземпляра Shape. Если класс сообщения во время выполнения на самом деле является подклассом Shape (он наследуется от Shape), динамическое (полиморфное) разрешение затем используется, чтобы решить, какую реализацию метода draw вызывать.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...