состояние Лисков принцип замещения, которыйЯвляется ли `PartialFunction extends Function` нарушением LSP?
if
S
is a subtype ofT
, then objects of typeT
may be replaced with objects of typeS
without altering any of the desirable properties of that program.
Однако в Scala, есть PartialFunction
, что не применяется/определяется во всех случаях.
trait Function1 {
def apply(x: A): R
}
trait PartialFunction extends Function1 {
def apply(x: A): R
def isDefinedAt(x: A): Boolean
}
Если применить PartialFunction
на неопределенное значение, вы получите исключение.
Удобный способ создания PartialFunction
в scala - использовать соответствующий шаблон. При этом вы получите MatchError
для неопределенных значений.
val fn:Function1[String, Int] = s => s.length
val pf:PartialFunction[String, Int] = {
case "one" => 3
}
def program(f:Function1[String, Int], s:String):(Boolean, Int) = (
f.isInstanceOf[Function1[String, Int]], f(s)
)
program(fn, "one") == program(pf, "one")
program(fn, "two") == program(pf, "two")
fn: String => Int = <function1>
pf: PartialFunction[String,Int] = <function1>
program: program[](val f: String => Int,val s: String) => (Boolean, Int)
res0: Boolean = true
scala.MatchError: two (of class java.lang.String)
at scala.PartialFunction$$anon$1.apply(delme.sc:249)
at scala.PartialFunction$$anon$1.apply(delme.sc:247)
at ...
Оба fn
и pf
подтипы Function1
, но я не могу заменить fn
на pf
без изменения моего program
. Так что, по-моему, это нарушение LSP.
Как вы думаете?
Это будет прежде всего кусок мнения. У вас есть более конкретный вопрос относительно применения или использования более общего вопроса, который вы задаете? – wheaties
Абсолютно нет. Я просто просил совета у других разработчиков. Может быть, я должен был разместить его в другом сообществе? –
Вы также можете определить 'Function1', который просто генерирует исключения для всех входов, отличных от' 'one ''. Ваш аргумент за нарушение LSP заключается в том, что бросание исключения может быть нежелательным изменением, но 'Function1' все еще может содержать входы, которые генерируют исключения. например 'BigDecimal ("а")'. Основное различие между 'PartialFunction' и' Function1' заключается в том, что у вас есть встроенный способ проверки того, определены ли элементы вначале. –