的里氏替換原則狀態'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
爲不確定的值,你會收到一個異常。
在scala中創建PartialFunction
的一種簡便方法是使用模式匹配。這樣做,您會收到一個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
亞型,但我不能代替通過pf
fn
不會改變我的program
。所以我認爲這是對LSP的違反。
您認爲如何?
這將主要是一個意見件。你有關於應用或使用更一般問題的更具體問題嗎? – wheaties
絕對不是。我只是要求其他開發人員的建議。也許我應該將它發佈到另一個社區? –
你也可以定義一個'Function1',它僅僅爲''one'''以外的所有輸入引發異常。你違反LSP的論點是拋出一個異常可能是一個不希望的改變,但是一個'Function1'仍然可以有輸入來拋出異常。例如'的BigDecimal( 「ABC」)'。 'PartialFunction'和'Function1'之間的主要區別在於你有一個內置的方法來檢查元素是否被首先定義。 –