2

下面是我的界面 -

public interface IClient {
    public String executeSync(ClientInput input);
}

这是我的接口实现 -

public class TestingClient implements IClient {

    @Override
    public String executeSync(ClientInput input) {

    }
}

现在我有一个工厂,它得到这样的实例TestingClient-

IClient client = TestingClientFactory.getInstance();

现在客户将调用executeSyncmyTestingClient接受ClientInput参数的方法,下面是ClientInput.

public final class ClientInput {

    private Long userid;
    private Long clientid;
    private Long timeout = 20L;
    private boolean debug;
    private Map<String, String> parameterMap;

    public ClientInput(Long userid, Long clientid, Map<String, String> parameterMap, Long timeout, boolean debug) {
        this.userid = userid;
        this.clientid = clientid;
        this.parameterMap = parameterMap;
        this.timeout = timeout;
        this.debug = debug;
    }

 ... //getters here
}    

所以当客户调用我们的executeSync方法时TestingClient,他们会ClientInput像这样创建参数,然后使用工厂获取实例,TestingClient然后相应地调用executeSync方法。

Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("attribute", "segmentation");

ClientInput input = new ClientInput(109739281L, 20L, paramMap, 1000L, true);

IClient client = TestingClientFactory.getInstance();
client.executeSync(input);

问题陈述:-

  1. 如上所示,这是制作ClientInput参数并传递给方法的正确方法吗?executeSync
  2. 我的 ClientInput 中已经有三个 Long 类型的参数,其他开发人员可能不清楚哪个位置是哪个字段(尤其是在那些漫长的夜晚......)。任何想法如何避免这种情况?
  3. 如果需要更多输入,它会使构造函数声明更长。我该如何克服这种情况?
4

4 回答 4

1

如果您有更多参数,请使用构建器模式。这使代码干净。(见这个例子)

例如,您可以拥有

clientinput.userid("userid)
           .clientid("clientid")

如果未指定,某些参数可以是可选的。就像没有设置 timeout 和 debug 一样,它们可以采用默认值

于 2014-01-10T07:01:42.580 回答
1

对于这种情况,最好使用 Setters 和 Getters 所有这些字段而不是 Constructor

private Long userid;
private Long clientid;
private Long timeout = 20L;
private boolean debug;
private Map<String, String> parameterMap;
于 2014-01-10T06:59:37.097 回答
0

我建议您使用 setter 和 getter,因为将来您的 Object 字段(状态)可能会增加,这将始终要求您在构造函数中进行更改。

于 2014-01-10T07:01:42.367 回答
0

1 听起来不错,就像你做的那样。方法将包含所有信息的包装对象作为参数 -> 良好的设计,好像对象中的信息发生了变化,方法不需要改变。显然比采用 5 个不同参数的方法要好。

2 我认为调用该方法的通常方式如下:

Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("attribute", "segmentation");

ClientInput input = new ClientInput(user.getUserId(), client.getClientId(), 20L, paramMap, 1000L, true);

IClient client = TestingClientFactory.getInstance();
client.executeSync(input);

所以应该足够清楚,可以避免错误

3. 如果可能出现更多参数,请尝试将它们分组到其他一些包装类中,然后这些包装类将用于创建调用对象(组合)。

于 2014-01-10T07:03:47.573 回答