【问题标题】:Best Practice - HashMap instead of list of parameters, good idea ?最佳实践 - HashMap 而不是参数列表,好主意吗?
【发布时间】:2012-05-29 09:50:46
【问题描述】:

您好 Stackoverflow 社区,

我正在编写一些代码,其中将可选标准的列表提交给我的 dao。 方法签名包含 +/- 10 个参数的列表,我真的不喜欢并想重新格式化。 另外,我想避免仅仅因为我添加/删除一个标准就必须重构来自不同层的所有方法签名

List searchParams(String name, Long countryCode, ...){
...
}

会变成

List searchParams(HashMap<String,Object> map) {
    BeanUtils.populate(this,map);
    ...
}

我有点担心这种情况会发生,因为这是一种不好的做法,因为我放弃了对地图中传递的内容的控制权以赋予我这种灵活性?所以我的问题是我是否走在正确的道路上?

【问题讨论】:

    标签: java methods parameters signature


    【解决方案1】:

    您可以定义一个新类来保存/处理您的参数集,因此您可以获得比 HashMap 提供的更多控制权。写起来很烦人,或者至少很乏味,但似乎在灵活性和控制力之间取得了更好的平衡。

    【讨论】:

      【解决方案2】:

      您可以查看您的参数,看看您是否可以将它们作为一个逻辑组包装到一个对象中。例如,国家代码的名称可以是人员对象

      public Person {
          private String name;
          private String countryCode;
      }
      

      然后您只需向下传递这个对象,并可以使用 getter 来获取数据,这应该比需要知道多个层上的 HashMap 的所有键更容易阅读和维护。

      【讨论】:

        【解决方案3】:

        当我遇到这样的情况时,我倾向于创建一个Params 类,然后传递那个。好处是:

        • 与使用 Map 时不同,您可以拥有有意义的 getter/设置、正确的验证等;
        • 它是类型安全和自描述的(意味着很容易找出可用的参数及其类型)。
        • 您可以添加新参数而无需重构任何中间层。

        【讨论】:

          【解决方案4】:

          唯一适合使用映射的情况是在您设计工厂时,您需要将不同类型的参数传递给正在创建的不同类。在所有其他情况下,最好使用具有专用参数信息类的解决方案。

          有关传递映射的适当示例,请查看 DriverManager.getConnection 方法:此方法需要将参数传递给正在创建的 Connection 的驱动程序特定实现的构造函数,因此它将映射包装到 @ 987654322@,并让用户将其传递给特定于驱动程序的连接。请注意,DriverManager 没有其他面向未来的解决方案。

          我强烈反对在所有其他情况下使用映射:增加的灵活性将错误检测从编译时转移到运行时,这很有可能使您的头痛倍增,令人难以置信。

          【讨论】:

            猜你喜欢
            • 2021-11-18
            • 2021-11-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-18
            • 2011-09-24
            相关资源
            最近更新 更多