代码之家  ›  专栏  ›  技术社区  ›  YuvShap

当需要设计模块化架构时,对象投射是现实的必然性吗?

  •  1
  • YuvShap  · 技术社区  · 7 年前

    Why should casting be avoided? 这个问题得到了一些答案,并有很好的论证:

    1. By Jerry Coffin:

      从更广泛的角度来看,情况相当简单(至少 从一种类型到另一种类型的东西。如果你这样做,就会提高 你为什么不把它定义为那种类型呢?不是这样的 说从来没有理由做这样的转换,但任何时候都可以 如果发生这种情况,它会提示您是否可以重新设计

    2. By Eric Lippert

      编译器没有的东西?”如果你在那种情况下 编译器确实能处理现实问题。那你就不需要

      第二种类型的演员提出了一个问题:“为什么不手术 首先在目标数据类型中完成?”如果你需要的话 一个国际比赛的结果那为什么你在第一场比赛中拿着一个双人

    继续我的问题,最近我开始研究众所周知的开源项目的源代码 AutoFixture

    ISpecimenBuilder 定义了一个抽象的方法:

    object Create(object request, ISpecimenContext context);
    

    如您所见,请求参数类型是object,因此它接受完全不同的类型,接口的不同实现按其运行时类型处理不同的请求,检查它们是否正在处理某个请求,否则返回某种无响应表示。

    界面的设计似乎不符合“良好实践”,即对象铸造应该少用。


    here 但是它的可伸缩性似乎不是很强,访问者必须有几十种不同的方法,因为接口有很多不同的实现,能够处理不同类型的请求。

    虽然事实上,我基本上同意的论点,反对使用铸造作为一个好的设计在这个特定的场景中的一部分,它似乎不仅是最好的选择,而且是唯一现实的一个。

    综上所述,当需要设计模块化和可扩展的体系结构时,对象投射和非常一般的契约是现实的必然吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Mark Seemann    7 年前

    我不认为对于任何类型的应用程序或框架,我都可以笼统地回答这个问题,但我可以提供一个具体讨论AutoFixture的答案,以及对其他使用场景的一些推测。

    如果我今天必须从头开始写AutoFixture,我肯定会做一些不同的事情。特别是,我不会围绕这样的东西来设计日常API ISpecimenBuilder outlined here .

    QuickCheck

    但是,AutoFixture支持用户定义的类型,而不需要用户编写自定义生成器。它是通过.NET反射实现的。在.NET中,反射API是非类型化的;所有生成对象和调用成员的方法都采用 object 作为输入和返回 对象

    有没有可能在没有反射的情况下编写数据生成器?我没有尝试下面的方法,但也许可以采用一种策略,直接在IL中为数据生成器编写“代码”并使用它 动态编译包含生成器的内存程序集。

    这有点像 Hiro container 工作,IIRC。我想人们可以围绕这个概念设计其他类型的通用框架,但我很少看到它在.NET中实现。