我有一个像这样的
interface
:
public interface IIdentifierManager
{
Task<bool> Method1(string identifierName, string identifier);
Task<bool> Method2(IEnumerable<string> ids);
}
并且有五个
classes
已经实施了它,例如:
public class CatIdentifierManager: IIdentifierManager
{
// you know the dill!
}
所以当我:
IEnumerable<IIdentifierManager> idManagers;
取决于我想要哪种实现,我会这样做:
var myVar1 = idManagers.OfType<JoeIdentifierManager>()?.FirstOrDefault();
var myVar2 = idManagers.OfType<HisIdentifierManager>()?.FirstOrDefault();
var myVar3 = idManagers.OfType<HerIdentifierManager>()?.FirstOrDefault();
var myVar4 = idManagers.OfType<CatIdentifierManager>()?.FirstOrDefault();
var myVar5 = idManagers.OfType<DogIdentifierManager>()?.FirstOrDefault();
我正在寻找更好的设计建议,所以也许我可以有一个主要实现,其中包含所有这五个,也许我通过一个
parameter
来告诉它使用哪一个。
你建议如何做?
不要做任何愚蠢的事情,比如使用设置参数来选择实现的方法。您可能需要一个静态工厂方法,为您选择一个实现,然后您可以调用该方法。
不要害怕有一些额外的类或方法,只要它们漂亮且整洁即可。许多开发人员认为方法和类越少越好,但根据我的经验,随着代码库的增长,这会导致混乱。您想要更改现有行为,但它与该函数的所有其他变体完全耦合。