在查看一些代码时,我注意到有机会将其更改为使用泛型。(模糊的)代码如下所示:
public void DoAllTheThings(Type typeOfTarget, object[] possibleTargets)
{
var someProperty = typeOfTarget.GetProperty(possibleTargets[0]);
...
}可以用泛型替换此代码,如下所示:
public void DoAllTheThings<T>(object[] possibleTargets[0])
{
var someProperty = type(T).getProperty(possibleTargets[0]);
...
}在研究这种方法的优点和缺点时,我发现了一个叫做泛型滥用的术语。请参见:
我的问题分为两部分:
发布于 2018-02-07 18:59:49
当适当地应用泛型时,它们会删除代码,而不是仅仅重新排列代码。首先,泛型最擅长移除的代码是类型转换、反射和动态类型。因此,泛型滥用可以被松散地定义为创建泛型代码,而与非泛型实现相比,在不显着减少类型转换、反射或动态类型的情况下。
关于您的示例,我希望泛型的适当使用可以将object[]更改为T[]或类似的,并完全避免使用Type或type。这可能需要在其他地方进行重要的重构,但是如果在这种情况下使用泛型是合适的,那么当您完成时,它最终会变得更简单。
发布于 2018-02-07 23:02:35
我会使用一个非废话的规则:泛型,就像所有其他编程结构一样,存在于解决问题上。如果对仿制药没有问题要解决,那么使用它们就是滥用。
在泛型的特定情况下,它们的存在主要是为了从具体类型中抽象出来,允许将不同类型的代码实现折叠到一个通用模板中(或者不管您的语言称之为什么)。现在,假设您有使用Foo类型的代码。您可以用一个通用的T替换该类型,但是如果您只需要使用该代码来使用Foo,那么就没有其他代码可以将其折叠在一起了。因此,不存在需要解决的问题,因此间接添加泛型只会降低可读性。
因此,我建议只编写代码而不使用泛型,直到您看到需要引入它们(因为您需要第二次实例化)。然后,也只有这样,才是重构代码以使用泛型的时候。在那之前的任何用途在我眼里都是虐待。
这听起来有点太迂腐了,所以让我提醒你:
在编程中没有无一例外的规则。这条规则包括在内。
发布于 2018-02-07 17:53:49
密码看起来很奇怪。但是,如果我们要调用它,将类型指定为泛型会更好。
https://stackoverflow.com/questions/10955579/passing-just-a-type-as-a-parameter-in-c-sharp
就我个人而言,我不喜欢这些使调用代码看起来很漂亮的扭曲。例如,整个‘流利’的事情和扩展方法。
但你必须承认它有很受欢迎的追随者。例如,即使是微软也统一使用它。
container.RegisterType<IInterface,Concrete>()https://softwareengineering.stackexchange.com/questions/365530
复制相似问题