Scala Дополнительные лучшие практики - PullRequest
2 голосов
/ 28 апреля 2020
def canAppendOffset(offset: Long): Boolean = {
  toRelative(offset).isDefined
}

private def toRelative(offset: Long): Option[Int] = {
  val relativeOffset = offset - baseOffset
  if (relativeOffset < 0 || relativeOffset > Int.MaxValue) None
  else Some(relativeOffset.toInt)
}

Я запутался, когда столкнулся с вышеупомянутым кодом. Код если из Кафки LogSegment. Мне интересно, зачем нам нужен здесь Optional, а не просто возвращать логическое значение в canAppendOffset(). Мне кажется ненужным, почему нам нужно создать Optional и получить доступ к полю, в котором записывается нужное мне логическое значение. Я думаю, что должны быть некоторые логики c в аспектах проектирования программного обеспечения. Может ли кто-нибудь дать какие-либо предложения о том, где и почему использовать Optional в Scala?

Ответы [ 2 ]

3 голосов
/ 28 апреля 2020

Здесь, кажется, есть несколько заблуждений.

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

Там здесь нет поля isDefined - это метод в классе Option, который проверяет, является ли этот экземпляр Some() или None.

... почему нам нужен здесь Optional, а не просто возвращать логическое значение в canAppendOffset().

Но canAppendOffset() действительно"просто возвращает Boolean". Это toRelative(), который "создает" Option, и он делает это потому, что, хотя предполагается для возврата "относительного" из заданного смещения, он может фактически не выполнить это, если верный результат невозможно.

Таким образом, он возвращает Option[Int], что говорит вызывающей стороне: «Вот Some(relative), если его можно вычислить по заданному смещению, но это None, если я не могу вычислить товар результат для вас. "

1 голос
/ 28 апреля 2020

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

Я согласен. будет иметь смысл создать метод toRelative, возвращающий Option[Int], если он использовался в других местах, где фактически использовалось бы вычисленное смещение. Вполне может быть, что этот метод ранее использовался для других случаев использования, и понимание того, какое относительное смещение фактически использовалось.

Если вы хотели только узнать, можно ли добавить смещение, вы можете упростить:

private def canAppendOffset(offset: Long): Boolean = {
  val relativeOffset = offset - baseOffset
  relativeOffset >= 0 && relativeOffset < Int.MaxValue
}
...