65.9K
CodeProject 正在变化。 阅读更多。
Home

空泡封装

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.43/5 (3投票s)

2014年3月25日

CPOL

2分钟阅读

viewsIcon

8090

一种将数据源和实现更紧密结合的封装方法,允许以一种凡人可以理解的格式实现类似反射的行为。

在您谷歌搜索“Vacuole 封装”之前,让我向您介绍我完全凭空捏造的编程概念:Vacuole(液泡)。

我正在解决一个问题,即单个用户可能拥有 200 个相同的地址对象(每个美国州 4 个)。这种巨大的数据负载最终让我找到了一种解决方案,即使用 map 进行可移植的数据存储,从而共享相同的地址值,将这 200 个地址减少到仅 4 个。

虽然我觉得使用 map 增强数据存储是一种针对特定问题的利基解决方案,但它后来在验证和映射方面带来了一些令人惊喜的舒适协同效应。我开发了一些简单的实用工具,这些工具适用于实现 Vacuole 的任何值 bean。

空泡封装

Vacuole 封装与 封装 略有不同的方法。您仍然可以获得标准的封装访问器和修改器。但是,使用 Map 进行数据存储,并将 Vacuole 作为对象键。这种模式最重要的方面——Vacuole,包含 Bean 及其内容有效运行和蓬勃发展所需的一切,例如

  • 唯一标识符(随机 UUID?)
  • 分类(列名?用于比较类似值很有用)
  • 契约(验证适配器)
  • 数据类型(例如:类)
  • 字段长度(< input maxlength = ” ? ” … />)
  • 必填输入?(*)
  • 或者您认为必要的任何其他内容

使用带有 Vacuole 键的 Map 处理数据,只需很少的代码,就可以使诸如验证、映射和比较之类的常规任务变得轻松,并且跟踪调用非常浅,并且没有反射。

案例示例

您需要从表单填充请求数据。当 Vacuole 的唯一标识符应用于表单元素的输入名称属性时,重新将每个表单变量输入与确切的 bean 结合起来很容易。以下是来自 Request 对象 Validate/BeanMapping 的示例

public class VacuoleUtils {
    public static List<ValidationResult> handleRequest(HttpServletRequest req, 
                  List<VacuoleBean> vBeans) {
        List<ValidationResult> results = new ArrayList<>();
        for (VacuoleBean vBean : vBeans) {
            for (Vacuole v : vacuoleBean.getVacuoles()) {
                for (Validator val : v.getValidations()) {
                    Object value = req.getParameter(v.getId());
                    ValidationResult result = val.check(value);
                    if (result.pass()) vBean.setValue(v,req.getParameter(v.getId()));
                    else results.add(result);
                }
            }
        }
        return results;
    }
}

Vacuole 对我来说仍然是一种新奇事物,我期待着探索和发现这个小想法所蕴含的效用。

在得到 Keyhole 的祝福后,我希望能够在 Github 上提供一些源代码!在此之前,我建议您采用这些概念并独立应用它们。祝你好运!

– Ryan McCullough

© . All rights reserved.