Как мне смоделировать следующие отношения в Scala? - PullRequest
3 голосов
/ 28 июля 2011

Предположим, у меня есть следующее

abstract class Strategy {
    val lib: TestingLibrary = ...
}

Стратегия и TestingLibrary являются абстрактными, поскольку для них требуется getClosingTime, предоставленный

trait Market {
    def getClosingTime: String
}

Конкретная реализация может быть

trait LSE extends Market {
    def getClosingTime = "16:35:00"
}

Во время выполнения я хочу иметь возможность указать, что конкретная стратегия и библиотека TestingLibrary используют LSE.Это означает, что при вызове getClosingTime они оба должны иметь конкретную реализацию, возвращающую «16:35:00».Я думал о чем-то вроде

val lseStrategy = new Strategy with LSE

Я хотел бы придерживаться черт, если это возможно, но не знаю, как смешать LSE с TestingLibrary.Возможно, весь мой подход необходимо изменить, но основные бизнес-правила:

  • Стратегия имеет - TestingLibrary
  • Стратегия и TestingLibrary оба полагаются на абстрактный метод getClosingTime
  • getClosingTime должен иметь одинаковую конкретную реализацию для обоих во время выполнения
  • Стратегия не должна принимать никаких параметров в конструкторе (из-за дополнительных расширений ее может потребоваться преобразовать в черту)
  • Пользователи стратегиине должен ничего знать о TestingLibrary

На данный момент я нахожу количество различных опций в недоумении.В Java я сделал что-то вроде следующего:

class LSETestingLibrary extends TestingLibrary {
      String getClosingTime {return "16:35:00"}
}

class Strategy {
    TestingLibrary lib;
    Strategy(Market market) {
        if (market == LSE) lib = new LSETestingLibrary();
    }
    String getClosingTime { return lib.getClosingTme();}
}

, но я считаю "если" уродливым способом сделать что-то, так как добавление новых рынков потребовало бы излишне перекомпилировать Strategy

Ответы [ 2 ]

4 голосов
/ 28 июля 2011

То, что вы ищете, называется Cake Pattern .Я связываю только один из многих вопросов, и вы легко можете найти множество блогов в Google.

2 голосов
/ 28 июля 2011

Scala позволяет использовать стиль ООП и стиль FP.Со стилем ОО вы бы использовали Cake Pttern, как предложил Даниэль.Вот хороший обзор - сравнение между OO / FP (включая пример кода): http://debasishg.blogspot.com/2011/03/pushing-envelope-on-oo-and-functional.html

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