小编Tod*_*wen的帖子

为什么在"if x then return"之后很少使用"else"?

这个方法:

boolean containsSmiley(String s) {
    if (s == null) {
        return false;
    }
    else {
        return s.contains(":)");
    }
}
Run Code Online (Sandbox Code Playgroud)

可以等同地写成:

boolean containsSmiley(String s) {
    if (s == null) {
        return false;
    }

    return s.contains(":)");
}
Run Code Online (Sandbox Code Playgroud)

根据我的经验,第二种形式更常见,特别是在更复杂的方法中(可能有几个这样的退出点),"throw"和"return"也是如此.然而,第一种形式可以说使代码的条件结构更加明确.有什么理由比较喜欢一个吗?

(相关:一个函数应该只有一个return语句吗?)

java if-statement coding-style function-exit

60
推荐指数
5
解决办法
2万
查看次数

为什么在持久层(如JDO或Hibernate)上放置DAO层

数据访问对象(DAO)是一种常见的设计模式,由Sun推荐.但最早的Java DAO示例直接与关系数据库进行交互 - 它们本质上是做对象关系映射(ORM).如今,我看到DAO在成熟的ORM框架之上,如JDO和Hibernate,我想知道这是不是一个好主意.

我正在使用JDO作为持久层开发Web服务,并且正在考虑是否引入DAO.我在处理包含其他对象映射的特定类时遇到了问题:

public class Book {
    // Book description in various languages, indexed by ISO language codes
    private Map<String,BookDescription> descriptions;
}
Run Code Online (Sandbox Code Playgroud)

JDO足够聪明,可以将其映射到"BOOKS"和"BOOKDESCRIPTIONS"表之间的外键约束.它透明地加载BookDescription对象(我​​相信使用延迟加载),并在Book对象持久化时保留它们.

如果我要引入一个"数据访问层"并编写一个像BookDao这样的类,并将所有JDO代码封装在其中,那么这个JDO对子对象的透明加载不会绕过数据访问层吗?为了保持一致性,不应该通过一些BookDescriptionDao对象(或BookDao.loadDescription方法)加载和保存所有BookDescription对象吗?然而,以这种方式进行重构将使得模型的操作变得不必要地复杂化.

所以我的问题是,在业务层中直接调用JDO(或Hibernate,或者你想要的任何ORM)有什么问题?它的语法已经非常简洁,并且与数据存储区无关.如果有的话,将它封装在数据访问对象中有什么好处?

architecture persistence dao data-access-layer jdo

32
推荐指数
5
解决办法
2万
查看次数

为什么F#计算表达式需要构建器对象(而不是类)?

F#计算表达式具有以下语法:

ident { cexpr }
Run Code Online (Sandbox Code Playgroud)

ident构建器对象在哪里(此语法取自Don Syme的2007年博客条目).

在我看到的所有示例中,构建器对象是单例实例,无状态引导.Don给出了定义一个名为的构建器对象的示例attempt:

let attempt = new AttemptBuilder()
Run Code Online (Sandbox Code Playgroud)

我的问题:为什么F#不AttemptBuilder直接在计算表达式中使用该类?当然,符号可以像实例方法调用一样轻松地去除静态方法调用.

使用实例值意味着理论上可以实例化同一类的多个构建器对象,可能以某种方式参数化,甚至(天堂禁止)具有可变的内部状态.但我无法想象这将是多么有用.


更新:我上面引用的语法表明构建器必须显示为单个标识符,这是误导性的,可能反映了该语言的早期版本.最新的F#2.0语言规范将语法定义为:

expr { comp-or-range-expr }
Run Code Online (Sandbox Code Playgroud)

这清楚地表明任何表达式(评估为构建器对象)都可以用作构造的第一个元素.

f# computation-expression

17
推荐指数
3
解决办法
1573
查看次数

RESTful Web服务的HTML界面*没有*javascript

即使我提供PUT和DELETE的替代品(参见"低REST"),如何为从浏览器访问我的Web服务的用户提供用户友好的表单验证,同时仍然暴露RESTful URI?表单验证问题(如下所述)是我当前的问题,但我想问的更广泛的问题是:如果我试图同时提供RESTful公共接口非JavaScript HTML界面,那么它是否会让生活更轻松或更难?他们一起玩吗?

从理论上讲,它应该仅仅是改变输出格式的问题.机器可以查询URL"/ people",并获取XML列表.人类用户可以将他们的浏览器指向相同的URL,并获得漂亮的HTML响应.(我正在使用微格式wiki中URL示例,这看起来相当合理).

通过对"/ people"URL的POST请求来创建新的人员资源.为此,人类用户可以首先访问"/ people/new",它返回用于创建资源的静态HTML表单.表单有method = POST和action ="/ people".如果用户的输入有效,这将正常工作,但如果我们在服务器端进行验证并发现错误怎么办?友好的事情是返回表单,填充用户刚输入的数据,加上错误消息,以便他们可以解决问题并重新提交.但是我们无法将输出直接从POST返回到"/ people",或者它会破坏我们的URL系统,如果我们将用户重定向回"/ people/new"表单,则无法报告错误和重新填充表单(除非我们将数据存储到会话状态,这将更少RESTful).

使用javascript,事情会容易得多.只需在后台执行POST,如果失败,则在表单顶部显示错误.但是当javascript支持不可用时,我希望应用程序优雅地降级.目前,我得出的结论是,一个非平凡的Web应用程序无法在没有javascript的情况下实现HTML界面,使用传统的RESTful URL方案(例如微格式wiki上描述的方案).如果我错了,请告诉我!

Stack Overflow上的相关问题(两者都不涉及表单验证):

html forms rest webforms

9
推荐指数
1
解决办法
8095
查看次数

应该在Scala中编写Java应用程序的哪些部分?

我正在使用Struts 2编写Java应用程序,但现在我想将它改为混合Java和Scala项目.我对Scala没有多少经验,但几年前我在大学时学过Haskell - 我真的很喜欢功能性编程范例,但当然在课堂上我们只能给出非常适合功能性解决方案的问题!在现实世界中,我认为一些代码更适合命令式样式,我想继续使用Java(我知道Scala支持命令式语法,但我还没准备好朝着纯Scala项目的方向发展) (还).

在混合项目中,如何决定用Java编写代码以及在Scala中编码什么?

java interop scala

6
推荐指数
4
解决办法
830
查看次数