1

我有一个接口/抽象类,其中实现可以支持任意大小的字典Nameidentifier. 每个实现都将具有不同的格式,identifier具体取决于实现。

调用者需要Name从提供者那里检索 s 列表,并使用这些列表来询问用户他关心哪个。用户可以选择一个或多个。

我考虑了以下设计,其中调用者获取一个名称数组并通过传入一个整数数组来设置用户的选择,识别用户选择的名称的数组索引。

public abstract String[] GetNames();
public abstract void SetNamesToUse(int[] names);

对此不满意,我还考虑了一个传递对象列表的模型:

public class NameObject {
    public bool SelectedByUser;
    public String Name;
    private String ProviderSpecificData;
}

...

public abstract List<NameObject> GetNames();
public abstract void SetNamesToUse(List<NameObject> names);

这对呼叫者来说似乎更干净、更容易。

我还有什么其他选择?你是如何解决类似问题的?

4

2 回答 2

1

那这个呢?

interface IIdentifier
{
    string Name {get;}
}

abstract class Identifier<T> : IIdentifier
{
    private readonly string _name;
    private readonly T _id;
    public string Name {get;set;}

    protected Identifier(string name, T id)
    {
        _id = id;
        _name = name;
    }
}

class GuidIdentifier : Identifier<Guid>
{
    public GuidIdentifier(string name, Guid identifier)
        :base(name, identifier)
    {
        //?
    }
}

class UserOptions
{
    private IEnumerable<IIdentifier> _identifiers;

    public IEnumerable<IIdentifier> Identifiers {get {return _identifiers;}}

    public IIdentifier Selected {get;set;}

    public UserOptions(IEnumerable<IIdentifier> identifiers)
    {
        _identifiers = identifiers;
    }
}   
于 2012-05-30T22:10:10.050 回答
0

我喜欢你第二个例子的一致性。它与使用 NameObject 类或 List<> 无关。您也可以使您的第一个示例保持一致:

public abstract String[] GetNames();
public abstract void SetNamesToUse(String[] names);

要全选,你现在可以简单地写

SetNamesToUse(GetNames());

根据我的经验,一个用例不足以从众多可能的设计选项中进行选择。但是,如果您为更多用例编写客户端代码,事情就会开始向您扑来。

在我上面的单行示例中,GetNames() 调用看起来模棱两可。是从用户那里获取名称的调用还是获取所有可用名称的调用?更改方法名称可以澄清这一点:

SetNamesToUse(GetAllNames());

Ferenc Mihaly http://theamiableapi.com

于 2012-05-31T16:31:15.223 回答