首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是滥用仿制药?

什么是滥用仿制药?
EN

Software Engineering用户
提问于 2018-02-07 17:23:03
回答 4查看 10.4K关注 0票数 37

在查看一些代码时,我注意到有机会将其更改为使用泛型。(模糊的)代码如下所示:

代码语言:javascript
复制
public void DoAllTheThings(Type typeOfTarget, object[] possibleTargets)
{
    var someProperty = typeOfTarget.GetProperty(possibleTargets[0]);
    ...
}

可以用泛型替换此代码,如下所示:

代码语言:javascript
复制
public void DoAllTheThings<T>(object[] possibleTargets[0])
{
    var someProperty = type(T).getProperty(possibleTargets[0]);
    ...
}

在研究这种方法的优点和缺点时,我发现了一个叫做泛型滥用的术语。请参见:

我的问题分为两部分:

  1. 转向这样的仿制药有什么好处吗?(表演?可读性?)
  2. 什么是泛型滥用?每次有类型参数时使用泛型是滥用吗?
EN

回答 4

Software Engineering用户

回答已采纳

发布于 2018-02-07 18:59:49

当适当地应用泛型时,它们会删除代码,而不是仅仅重新排列代码。首先,泛型最擅长移除的代码是类型转换、反射和动态类型。因此,泛型滥用可以被松散地定义为创建泛型代码,而与非泛型实现相比,在不显着减少类型转换、反射或动态类型的情况下。

关于您的示例,我希望泛型的适当使用可以将object[]更改为T[]或类似的,并完全避免使用Typetype。这可能需要在其他地方进行重要的重构,但是如果在这种情况下使用泛型是合适的,那么当您完成时,它最终会变得更简单。

票数 88
EN

Software Engineering用户

发布于 2018-02-07 23:02:35

我会使用一个非废话的规则:泛型,就像所有其他编程结构一样,存在于解决问题上。如果对仿制药没有问题要解决,那么使用它们就是滥用。

在泛型的特定情况下,它们的存在主要是为了从具体类型中抽象出来,允许将不同类型的代码实现折叠到一个通用模板中(或者不管您的语言称之为什么)。现在,假设您有使用Foo类型的代码。您可以用一个通用的T替换该类型,但是如果您只需要使用该代码来使用Foo,那么就没有其他代码可以将其折叠在一起了。因此,不存在需要解决的问题,因此间接添加泛型只会降低可读性。

因此,我建议只编写代码而不使用泛型,直到您看到需要引入它们(因为您需要第二次实例化)。然后,也只有这样,才是重构代码以使用泛型的时候。在那之前的任何用途在我眼里都是虐待。

这听起来有点太迂腐了,所以让我提醒你:

在编程中没有无一例外的规则。这条规则包括在内。

票数 5
EN

Software Engineering用户

发布于 2018-02-07 17:53:49

密码看起来很奇怪。但是,如果我们要调用它,将类型指定为泛型会更好。

https://stackoverflow.com/questions/10955579/passing-just-a-type-as-a-parameter-in-c-sharp

就我个人而言,我不喜欢这些使调用代码看起来很漂亮的扭曲。例如,整个‘流利’的事情和扩展方法。

但你必须承认它有很受欢迎的追随者。例如,即使是微软也统一使用它。

代码语言:javascript
复制
container.RegisterType<IInterface,Concrete>()
票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/365530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档