在JSP中包含scriptlet使得调试代码中的问题变得困难。 此外,在JSP中加入scriptlet很难将业务逻辑与视图层分离,这违反了单责任原则和MVC设计模式。
代码只写一次,但读多次。 我们会花一些时间在前面清理我们编写的代码,这样我们和其他开发者需要稍后阅读它时,就会付出回报。
理想情况下,其他程序员不必打开一个模块来了解其功能。 同样,他们应该能够在不阅读方法的情况下判断方法的用途。 我们订阅这些想法越好,阅读代码就越容易,编写和更改代码的速度就越快。
在AEM代码库中,使用以下约定:
<Interface>Impl
,即ReaderImpl
。<Variant><Interface>
,即JcrReader
和FileSystemReader
。Abstract<Interface>
或Abstract<Variant><Interface>
。com.adobe.product.module
。 每个Maven藏物或OSGi捆绑包必须有其自己的包。请注意,这些约定不一定需要应用于客户实施,但必须定义和遵守约定,以使代码保持可维护性。
理想情况下,名字应该能揭示出自己的意图。 当名称不应该清晰时,常用的代码测试是存在说明变量或方法用途的注释:
不清晰 |
清除 |
int d;//已用时间(天) |
int elapsedTimeInDays; |
//get tagged images |
公共列表getTaggedImages(){} |
DRY声明,不应复制同一组代码。 这也适用于字符串文字等内容。 代码复制为任何需要改变的事物打开了缺陷之门,需要找出并消除缺陷。
CSS规则应该特定于应用程序上下文中的目标元素。 例如,应用于.content .center的CSS规则将过于宽泛,可能最终影响整个系统的大量内容,要求其他人将来覆盖此样式。 .myapp- centertexttw将是更具体的规则,因为它将在应用程 ** 序上下文中指定居中文本。
当API被弃用时,总是最好找到建议的新方法,而不是依赖已弃用的API。 这将确保将来更顺利地升级。
创作者未提供的任何字符串都应打包在通过JSP/Java中的I18n.get()和JavaScript中的CQ.I18n.get()调用AEM的i18n词典中。 如果找不到任何实现,此实现将返回传递给它的字符串,因此这优惠了在主语言中实现这些功能后实现本地化的灵活性。
虽然JCR中的路径不应包含空格,但它们的存在不应导致代码中断。 Jackrabbit提供具有escape()和escapePath()方法的文本实用程序类。 对于JSP,Granite UI显示granite:encodeURIPath()EL函数。
AEM提供了一个XSS API,可轻松清理参数并确保避免跨站点脚本攻击的安全性。 此外,HTL还直接将这些保护内置到模板语言中。 可从开发——准则和最佳实践下载API备忘单。
对于Java代码,AEM支持slf4j作为记录消息的标准API,并应与通过OSGi控制台提供的配置结合使用,以便在管理中保持一致。 Slf4j显示五个不同的日志记录级别。 我们建议在选择在哪个级别登录消息时使用以下准则:
对于JavaScript,console.log只应在开发过程中使用,并且在发布之前应删除所有日志语句。
避免在不了解代码功能的情况下复制代码。 如果存疑,最好向对模块或API有更多经验、但您不清楚的人询问。