2016-09-02 8 views
0

Допустим, у нас есть завод чертаFactory Method с ненужными параметрами

trait Factory { 
    def createObject(paramA, paramB) 
} 

И теперь у нас есть реализации этого завода - FactoryV1 и FactoryV2, которые выбраны во время выполнения. В то время как FactoryV2 использует оба параметра для создания объекта, FactoryV1 использует только paramA. Поэтому, когда мы вызываем метод createObject FactoryV1, мы передаем ненужный параметр в paramB. Насколько плохо передается дополнительный параметр? Некоторые альтернативы:

  1. Один из способов улучшить это, чтобы иметь paramB как вариант Scala, и в зависимости от завода используется, мы проходим None для FactoryV1.createObject и Some для FactoryV2.createObject.

  2. Другой альтернативой было бы иметь два метода в базовом признаке: один с параметром paramA и другой с обоими параметрами. В зависимости от используемой фабрики (V1 или V2) мы вызываем соответствующий метод с 1/2 параметрами (я не вижу очень чистого способа сделать это, хотя).

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

По существу, что нам делать, если для фабричных реализаций не нужны все параметры метода Factory?

+1

Вы можете использовать значение по умолчанию для второго параметра. Затем вы можете вызвать свой метод только с первым параметром. см. http://alvinalexander.com/scala/scala-functions-named-default-arguments-parameters-methods – Samar

+0

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

+0

Я голосую за параметр по умолчанию для второго параметра –

ответ

0

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

val factory: Factory = new FactoryV2 // this is the one that needs both params to create an object 

// Assuming signature createObject(param1, param2 = default) 
// if you use default parameter, is it ok to create an object with default value? THis may be difficult to notice. 
factory.createObject(param1) 

// Assuming signature createObject(param1, Option[param2])  
// Is it ok to fail when second param not supplied? 
factory.createObject(param1, None) 

Выберите решение на основе желаемой семантики.