Есть ли лучшая альтернатива для реализации Pattern Builder в Scala? - PullRequest
2 голосов
/ 27 ноября 2011

Мне нужно создать экземпляр класса BenchmarkOption на основе аргументов командной строки.Я конечно использую стиль Pojo, но это не является неизменным.Поэтому я использую Builder Pattern в стиле Java.Вот класс, который я реализую:

object CommandLineHelper {
  //TODO: use configuration file ?
  val MILLI_SEC_SEPERATORS = 0 + "," + Int.MaxValue
  val SBE_ID = "SBETEST5";
  val SBE_PSW = "GZ@API53";
  val NUM_OF_REQUESTS = 1
  val NUM_OF_WORKERS = 1
  val PAUSE_IN_MILlI_SECOND = 1L;
}

class BenchmarkOption private {
  import  com.ggd543.mulerestletdemo.{CommandLineHelper => CLH}
  private  var _msSeperators = CommandLineHelper.MILLI_SEC_SEPERATORS
  def msSeperators = _msSeperators

  private var _nOfReq = CLH.NUM_OF_REQUESTS
  def nOfReq = _nOfReq

  private var _sbeId = CLH.SBE_ID
  def  sbeId = _sbeId

  private var _sbePsw = CLH.SBE_PSW
  def  sbePsw = _sbePsw

  private var _pauseInMilliSec = CLH.PAUSE_IN_MILlI_SECOND;
  def pauseInMillSec = _pauseInMilliSec

  private var _dataFile = new File("./data.csv")
  def  dataFile = _dataFile
  // may be too many fields  

}

object BenchmarkOption {
  def newBuilder() = new Builder

  class Builder {
    private val bmo = new BenchmarkOption

    def buildBenchmarkOption = bmo;

    def msSeperators_=(s: String) = bmo._msSeperators = s
    def msSeperators = bmo._msSeperators

    def nOfReq_=(n: Int ) = bmo._nOfReq =  n
    def nOfReq = bmo._nOfReq

    def sbeId_=(s: String) = bmo._sbeId = s
    def sbeId = bmo._sbeId

    def sbePsw_=(s: String ) = bmo._sbePsw = s
    def sbePsw = bmo._sbePsw

    def pauseInMilliSec_=(milliSec: Long) = bmo._pauseInMilliSec = milliSec
    def pauseInMilliSec = bmo._pauseInMilliSec

    def dataFile_=(file: File) = bmo._dataFile = file
    def dataFile = bmo._dataFile

  }


}

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

Ответы [ 3 ]

3 голосов
/ 27 ноября 2011

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

1 голос
/ 27 ноября 2011

Не понимаю, почему вы можете просто использовать аргументы конструктора - все параметры не известны с самого начала?

0 голосов
/ 27 ноября 2011

Как насчет этого?

class BenchmarkOption private {
  protected  val instance = new {
       var msSeperators = CommandLineHelper.MILLI_SEC_SEPERATORS
      var nOfReq = CLH.NUM_OF_REQUESTS
       var sbeId = CLH.SBE_ID
       var sbePsw = CLH.SBE_PSW
       var pauseInMilliSec = CLH.PAUSE_IN_MILlI_SECOND;
     var dataFile = new File("./data.csv" )
    def buildInstance()  = BenchmarkOption.this;
  }

  def msSeperators = instance.msSeperators

  def nOfReq = instance.nOfReq

  def  sbeId = instance.sbeId

  def  sbePsw = instance.sbePsw

  def pauseInMilliSec = instance.pauseInMilliSec

  def  dataFile = instance.dataFile

}

object BenchmarkOption {
  def newBuilder() = new BenchmarkOption{}.instance
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...