编码提示 coding-tips
尽可能使用taglibs或HTL use-taglibs-or-htl-as-much-as-possible
在JSP中包含scriptlet会导致难以调试代码中的问题。 此外,通过在JSP中包含scriptlet,很难将业务逻辑与视图层分离,这违反了单责任原则和MVC设计模式。
可写可读代码 write-readable-code
代码只写入一次,但读取多次。 花一些时间提前清理编写的代码,会在您和其他开发人员稍后阅读代码时产生回报。
选择表明意向的名称 choose-intention-revealing-names
理想情况下,其他程序员不必打开模块即可了解其功能。 类似地,他们应该能够在不阅读方法的情况下判断方法的用途。 您能更好地订阅这些想法,越容易阅读代码,您就能越快地编写和更改代码。
在AEM代码库中,使用以下约定:
- 接口的一个实现名为
<Interface>Impl
,即ReaderImpl
。 - 接口的多个实现名为
<Variant><Interface>
,即JcrReader
和FileSystemReader
。 - 抽象基类名为
Abstract<Interface>
或Abstract<Variant><Interface>
。 - 包名为
com.adobe.product.module
。 每个Maven工件或OSGi捆绑包必须具有自己的包。 - Java™实施位于其API下的实施包中。
这些约定不一定适用于客户实施,但定义约定并遵守这些约定很重要,这样代码才能持续可维护。
理想情况下,名字应该表明他们的意图。 当名称不够清晰时,常见的代码测试是存在解释变量或方法的用途的注释:
不要重复您自己 don-t-repeat-yourself
DRY表示绝不应复制同一组代码。 这也适用于字符串文本等。 代码复制为某些必须更改的内容打开了缺陷之门,应寻找并消除这些缺陷。
避免使用裸露的CSS规则 avoid-naked-css-rules
CSS规则应该特定于应用程序上下文中的目标元素。 例如,应用于 .content .center 的CSS规则过于宽泛,最终可能会影响您系统中的许多内容,因此将来需要其他人覆盖此样式。 而 .myapp-centertext 将是一个更具体的规则,因为它在应用程序的上下文中指定居中的 text。
消除使用已弃用的API eliminate-usage-of-deprecated-apis
弃用API后,最好查找新的推荐方法,而不是依赖已弃用的API。 这将确保未来能够更平稳地升级。
编写可本地化的代码 write-localizable-code
任何不是由作者提供的字符串都应通过JSP/Java中的 I18n.get() 和JavaScript中的 CQ.I18n.get() 包含在对AEM i18n词典的调用中。 如果找不到任何实施,此实施将返回传递给它的字符串,因此在使用主要语言实施功能后,这提供了实施本地化的灵活性。
为安全而转义资源路径 escape-resource-paths-for-safety
虽然JCR中的路径不应包含空格,但它们的存在不应导致代码中断。 Jackrabbit提供了包含 escape() 和 escapePath() 方法的文本实用程序类。 对于JSP,Granite UI公开 granite:encodeURIPath() EL 函数。
使用XSS API和/或HTL防止跨站点脚本攻击 use-the-xss-api-and-or-htl-to-protect-against-cross-site-scripting-attacks
AEM提供了一个XSS API,用于轻松清除参数并确保免受跨站点脚本攻击的安全。 此外,HTL将这些保护直接内置到模板语言中。 API备忘表可在开发 — 准则和最佳实践中下载。
实施适当的日志记录 implement-appropriate-logging
对于Java™代码,AEM支持slf4j作为用于记录消息的标准API,并且应该与通过OSGi控制台提供的配置一起使用,以确保管理的一致性。 Slf4j公开五个不同的日志记录级别。 Adobe建议在选择要在哪个级别记录消息时遵循以下准则:
- 错误:当代码中的某些内容损坏时,处理无法继续。 这通常因意外异常而发生。 在这些场景中包含栈栈跟踪很有帮助。
- 警告:当某些内容未正确工作时,可以继续处理。 这通常是我们所预期的异常的结果,例如 PathNotFoundException。
- 信息:监视系统时有用的信息。 请记住,这是默认设置,大多数客户会将其保留在其环境中。 因此,请勿过度使用它。
- DEBUG:有关处理的较低级别信息。 在使用支持功能调试问题时,此变量将非常有用。
- TRACE:最低级别的信息,如输入/退出方法。 这通常仅供开发人员使用。
如果存在JavaScript,则只能在开发期间使用 console.log,并且应在发布之前删除所有日志语句。
避免狂热的编程 avoid-cargo-cult-programming
避免在不了解代码用途的情况下复制代码。 如有疑问,请始终询问对您不了解的模块或API拥有更多经验的人员。