我想知道(几乎)总是在C#中使用自定义数据类型而不是依赖于内置类型(如System.Int32和System.String)是疯了。
例如,为了表示人名,想法是使用名为PersonFirstName而不是System.String的数据类型(当然,PersonFirstName数据类型必须包含System.String)。另一个例子是有一个PersonID类,它代表人的数据库标识符,而不是一个System.Int32。
这里会有一些好处:
今天,如果函数将int作为参数,则很容易传入Company对象的ID而不是Person对象的ID,因为两者都是int类型。如果函数使用了CompanyID,如果我尝试传入PersonID,我会收到编译错误。
如果我想将数据库列数据类型从int更改为person的uniqueidentifier,我只需要在PersonID类中进行更改。今天,我将不得不在所有需要代表公司的地方进行更改。
在正确的位置实施验证可能更容易。 “”可能永远不是一个正确的名字,PersonFirstName可以照顾它。
是的,我必须编写更多构造函数。我可以在这些中实现隐式重载,以使它们易于使用。
这是疯了吗?
答案 0 :(得分:5)
是的,完全疯狂 - 总结你的想法,以及释义Blackadder
太疯了!太疯了。这比今年Madman先生竞赛的获胜者Mad Jack McMad更为尴尬
答案 1 :(得分:5)
我不认为这是疯狂的。我认为使用具有强类型对象的业务逻辑对象是非常好事
答案 2 :(得分:2)
不,你没有从中获得任何实际好处。对于某些事情它是有道理的,也许是一个电子邮件类或者也许是一个ID类。但是,拥有“PersonID”或“ClientID”类似乎走得很远。你可以有一个“typedef”或别名或其他什么,但在大多数情况下我不会对此过分。你可以非常快速地过火,最终得到很多工作而没有任何好处。
答案 3 :(得分:2)
是的......是的!你的损失将超过你的收益。
答案 4 :(得分:1)
是的,疯狂和重写......
答案 5 :(得分:1)
这对我来说听起来像是一场维护噩梦。 CompanyID构造函数将采取什么?整数?迟早 - 无论你喜欢与否,你都必须使用原生类型。
答案 6 :(得分:1)
所以我乍一看这里的问题是一个问题。基本上是:
如何降低代码库的复杂性和变化?
我想说你需要看看你想要解决的问题,并首先看看最佳解决方案是什么。如果您正在处理可能在整个代码库中普遍存在的问题,那么您可能希望了解是否违反了SOLID设计原则。如果你有一种类型在很多不同的地方被使用,你的设计太过耦合了,你的关注点很差。
另一方面,如果您知道这种类型将在很多地方使用,并且它也恰好非常不稳定(变化是肯定的),那么您上面提到的方法可能是正确的方法去吧。
问问自己“我想解决什么问题?”然后根据该答案选择一个解决方案。不要从答案开始。
答案 7 :(得分:0)
由 Steve McConnell 提取Code Complete:
面向对象的设计会问:“ID应该被视为对象吗?”根据项目的编码标准,“是”答案可能意味着编程必须编写构造函数,对其进行全部注释;并将其置于配置控制之下。大多数程序员会认为,“不,仅仅为ID创建一个完整的类是不值得的。我只会使用整数。
注意刚刚发生的事情。一个有用的设计替代方案,即简单地隐藏ID的数据类型,甚至没有考虑......
对我来说,这段话是对你的问题的一个很好的答案。我全力以赴。