[英]Is it bad form to provide excessive overloads for a method or constructor in C#?
我正在使用C#为Unity编写代码。 目前,我正在处理一些较小的类和结构,以快速序列化随机生成的地图。 为此,我处理了一些构造函数,这些构造函数也将这些较小的类和结构中的一些作为参数。
过去,在设置方法和构造函数时,我通常会尝试考虑合理的选项 。 虽然这种做法已被质疑 ,没有人成功地给我任何理由似是而非,为什么我不应该做这样。
考虑以下类和结构:
public class Tile
{
public GridCoordinates position;
public TileCode prefabID;
}
public struct GridCoordinates
{
public int x;
public int y;
}
public struct TileCode
{
public int categoryID;
public int individuaID;
}
通常,在创建构造函数时,我会介绍所有struct
和int
替代方法。 Tile
看起来像这样:
public class Tile
{
public GridCoordinates position;
public TileCode prefabID;
public Tile(TileCode prefabID, GridCoordinates position)
{
this.prefabID = new TileCode(prefabID);
this.position = new GridCoordinates(position);
}
public Tile(TileCode prefabID, int xPosition, int yPosition)
{
this.prefabID = new TileCode(prefabID);
position = new GridCoordinates(xPosition, yPosition);
}
public Tile(int typeID, int individualID, GridCoordinates position)
{
prefabID = new TileCode(typeID, individualID);
this.position = new GridCoordinates(position);
}
public Tile(int typeID, int individualID, int xPosition, int yPosition)
{
prefabID = new TileCode(typeID, individualID);
position = new GridCoordinates(xPosition, yPosition);
}
我倾向于这样做是为了提高效率。 与第一个构造函数/方法串联编写其他构造函数/方法时,我花费了很少的时间,当我后来希望以一种本来不是我原来的方式使用构造函数/方法时,我发现这有时会派上用场预期的。
以前提出的唯一问题是混乱的可能性。 我觉得这并不是真正的问题,因为我的组织和评论清楚地区分了每个变体。
最终,我担心我的老师和同龄人可能还没有意识到其他问题。 我目前正在考虑将其扩展到一个更大的项目,现在改变我的行为,比以后纠正它要容易得多。
如果我为类提供过多的替代构造函数或方法,我将面临什么问题?
只要定义清楚,就可以定义尽可能多的重载,我认为没有错。 我不知道有任何相反推荐的良好做法或原则。 一个明显的缺点显然是代码维护成本的增加。 需要进行更改时进行文档记录和测试。
这使我对您发布的代码产生了极大的抱怨; 我确实在您的代码中感到担忧,而且如果有很多独立的实现,我永远也不会写类似的东西。 如果以后决定更改构造函数逻辑,则必须在整个位置进行更改,这很容易发生错误。 我将重构代码以使用构造函数链接,并在单个重载中实现所有构造逻辑,然后简单地将所有其他构造函数链接/委托给该单个构造函数。
综上所述,我个人的观点是,对于有关您的业务领域的参数应尽可能“强类型化”,您应该尽可能支持重载。 我的意思是:
public Foo(int i, int j, int k, int n) { ... }
容易出错。 对Foo(j, i, k, n)
的调用是完全有效的,并且一旦出现错误,可能很难在调用堆栈中定位,就很难在大型代码库中定位。
但是类型的签名:
public Foo(Bar bar, Blah blah)
安全得多,因为类型系统和编译器可以为您提供帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.