Questions tagged «type-conversion»


4
有关类型映射和扩展方法的最佳实践
我想问一些有关映射类型和在C#中使用扩展方法的最佳实践的问题。我知道这个主题在过去几年中已被讨论过多次,但是我读了很多帖子,但仍然有疑问。 我遇到的问题是扩展具有“转换”功能的类。假设我有“ Person”类,该类表示将由某些逻辑使用的对象。我还有一个“客户”类,代表来自外部API的响应(实际上会有多个API,因此我需要将每个API的响应映射到常见类型:Person)。我可以访问两个类的源代码,并且理论上可以在那里实现我自己的方法。我需要将客户转换为人,以便可以将其保存到数据库。该项目不使用任何自动映射器。 我有4种可能的解决方案: Consumer类中的.ToPerson()方法。这很简单,但是对我来说似乎是在打破“单一责任”模式,尤其是Consumer类也映射到其他类(某些其他外部API要求),因此它需要包含多种映射方法。 Person类中的构造函数,以Consumer为参数。也很容易,似乎也打破了单一责任模式。我需要有多个映射构造函数(因为将有另一个API的类,提供与Consumer相同的数据,但格式略有不同) 具有扩展方法的Converters类。这样,我可以为Consumer类编写.ToPerson()方法,并且当另一个API与其自身的NewConsumer类一起引入时,我可以编写另一个扩展方法并将其全部保存在同一文件中。我听过一种意见,即扩展方法通常是邪恶的,仅在绝对必要时才应使用扩展方法,这就是使我受挫的原因。否则我喜欢这个解决方案 转换器/映射器类。我创建了单独的类来处理转换并实现将源类实例作为参数并返回目标类实例的方法。 综上所述,我的问题可以简化为问题的数量(全部与我上面所述的内容相关): 是否将转换方法放入(POCO?)对象中(例如Consumer类中的.ToPerson()方法)是否被视为打破单一责任模式? 在(DTO类)类中使用转换构造函数是否被视为打破单一责任模式?尤其是如果可以从多种源类型转换此类,那么是否需要多个转换构造函数? 在访问原始类源代码的同时使用扩展方法是否被视为不良做法?这样的行为可以用作分隔逻辑的可行模式吗?还是反模式?

9
为什么不能有任何隐式转换?
据我了解,隐式转换会导致错误。 但这是没有道理的-那么正常转换是否还会导致错误? 为什么没有 len(100) 通过将语言解释(或编译)为 len(str(100)) 尤其是因为(这是我知道的)唯一可行的方法。语言知道错误是什么,为什么不解决呢? 对于这个示例,我使用了Python,尽管我觉得对于这么小的东西它基本上是通用的。

2
创建唯一目的是隐式转换为另一个类的类是否不好?
想象一下一种情况,我们正在使用一个允许您创建Circle对象的库,您可以在其中指定半径和圆心来定义它。但是,由于某些原因,它也需要一个必需的flavour参数。现在,我们确实需要Circle在自己的应用程序中使用,但是出于我的应用程序的目的,我可以将风味设置为Flavours.Cardboard每次。 为了“解决”这一问题,我Circle在另一个命名空间中创建了自己的类,该命名空间仅将radius和center作为参数,但具有一个隐式转换器,可以直接转换为Circle仅创建Circle(this.radius, this.center, Flavours.Cardboard)对象的外部库类。因此,在任何需要其他类型的的地方Circle,我都会进行自动转换。 创建这样一个类的后果是什么?有更好的解决方案吗?如果我的应用程序是在此外部库的基础上构建的供其他程序员使用的API,会有所不同吗?

3
依靠隐式参数转换是否被认为是危险的?
C ++具有一项功能(我无法弄清楚它的正确名称),如果参数类型不是期望的参数类型,它将自动调用参数类型的匹配构造函数。 一个非常基本的示例就是调用一个std::string带const char*参数的函数。编译器将自动生成代码以调用适当的std::string构造函数。 我想知道,它是否像我认为的那样对可读性不利? 这是一个例子: class Texture { public: Texture(const std::string& imageFile); }; class Renderer { public: void Draw(const Texture& texture); }; Renderer renderer; std::string path = "foo.png"; renderer.Draw(path); 这样好吗 还是太过分了?如果我不应该这样做,我可以以某种方式让Clang或GCC发出警告吗?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.