Как выйти за рамки программирования обратного вызова? - PullRequest
2 голосов
/ 26 февраля 2009

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

Ответы [ 6 ]

7 голосов
/ 26 февраля 2009

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

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

Псевдокод для этого примера может выглядеть примерно так:

class Clerk implements CheckInNotifyer {
  BunchOfObservers observers = new Bunch();

  public void addObserver(CheckInObserver observer) {
    observers.add(observer);
  }

  private void notifyListeners() {
    observers.all.notifyCheckIn(new CheckInEvent());
  }
}

class Passenger implements CheckInObserver {
  public void notifyCheckIn(CheckInEvent event) {
    event.getPlane().board();
  }
}

class WaitingArea {
  public init() {
    Passenger passenger = new Passenger();
    Clerk clerk = new Clerk();

    clerk.addObserver(passenger);
  }
}
4 голосов
/ 26 февраля 2009
3 голосов
/ 26 февраля 2009

это не плохо, это единственный способ сделать функциональное программирование на нефункциональных языках.

3 голосов
/ 26 февраля 2009

Другой вариант, который особенно хорошо работает, когда у вас есть несколько процедур с обратными вызовами, - это использование WaitHandles.

1 голос
/ 26 февраля 2009

Это зависит. Для Javascript я предпочитаю шаблон наблюдателя для всего, что действительно может знать о событии, вызванном событием - главным образом потому, что вы можете зарегистрировать и управлять несколькими наблюдателями. Но для чего-то вроде вызова AJAX, завернуть его в замыкание и включить метод обратного вызова кажется самым чистым подходом.

0 голосов
/ 01 марта 2009

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

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