【发布时间】:2013-06-05 14:54:47
【问题描述】:
第一个问题:箭头反模式是Scala中的做事方式吗?
我已经从 Java 过渡到 Scala 大约 3 个月了。我开始将反箭头模式视为 Scala 中的一种标准。
例如,在 Java 中,我喜欢尽快从方法返回。我们不喜欢很多内部嵌套。如果你有很多,它被称为箭头反模式。你可以在这里阅读:http://c2.com/cgi/wiki?ArrowAntiPattern
Java 示例:
boolean isValid(String input){
if (input.trim().length() <1) return false //return early
if (input.substring(0,3).equals("sth")) return false;
//do some more checks for validity then return true
return true
}
如果我在 Scala 中编写此代码,我将不得不使用匹配大小写语句,这会导致大量缩进。请记住,这只是一个虚拟示例,我尝试仅传达 Scala 的嵌套和缩进。
def isValid(input:String): Boolean = {
(input.trim.length < 1) match {
case true =>
input.substring(0,3) match {
case sthCase if(sthCase=="sth") =>
//do some more checks etc
//eventually arrive at the "true" branch
... case valid => true
case sthElse if (sthCase=="bla") => //some more code etc
case _ => false
}
case _ => false
}
}
我知道这个例子的编写方式可能与我编写 Java 的方式相同,但是如果我不想返回 true 或 false,而是想将该值分配给一个变量,即:val valid = (input.trim.length < 1) match ...,那么这是唯一的方法因为你不能重新分配给 val。我可以使用var 而不是val,但是我会使用Java 而不是Scala。
问题,再次重申:
所以问题是,箭头反模式是在 Scala 中做事的方式还是我错过了什么?在 Scala 中是否有更好的方法来完成我刚刚编写的内容(请记住,我希望将匹配语句结果分配给 val 变量)。
【问题讨论】:
标签: scala coding-style nested standards anti-patterns