为C#中的方法或构造函数提供过多的重载是不好的形式?

时间:2016-12-11 09:29:28

标签: c# resources unity5 overloading

我正在使用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;
}

通常,在创建构造函数时,我会涵盖所有structint替代项。 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);
    }

我倾向于这样做以提高效率。与第一个构造函数/方法一起编写额外的构造函数/方法需要花费大量的多余时间,我发现当我后来希望以一种我原本没有使用的方式使用构造函数/方法时,这有时会派上用场。预料到的。

之前提出的唯一问题是混淆的可能性。我认为这不是一个真正的问题,因为我的组织和评论清楚地区分了每个变体。

最终,我担心可能存在我的老师和同事未发现的其他问题。我目前正在考虑扩展到一个更大的项目,现在更容易改变我的行为,而不是稍后纠正。

如果我为课程提供过多的替代构造函数或方法,我会面临什么问题?

  • 我并不关心美学和标准问题,尽管一个好的答案可能会提到它们。我尝试遵循C#标准,但不总是
  • 对这可能造成的潜在资源需求感到担忧,所以一个好的答案可能会承认这可能存在的任何问题。
  • 正如我所提到的,我正在为Unity写作。我知道虽然大多数C#约定都是标准的,但在Unity中运行的上下文中有一些变体。特别是解决这个问题的奖励点,但一般来说,一个好的答案将解决使用该语言的问题。

2 个答案:

答案 0 :(得分:2)

我认为只要有明确的文档记录,就可以看出你认为合适的多次重载是错误的。我不知道有任何好的做法或原则提出相反的建议。明显的缺点显然是代码维护的成本增加;在需要更改内容时进行文档和测试。

这引起了我对你发布的代码的主要抱怨;我在你的代码中发现令人担忧的东西,我从来没有写过类似的东西,因为我的是如此多的独立实现。如果您以后决定更改构造函数逻辑,那么您将不得不在整个地方进行更改,这将非常容易出错。我重构代码以使用构造函数链接并在一个单独的重载中实现所有构造逻辑,并简单地将所有其他构造函数链接/委托给那个构造函数。

所有这一切,我个人的观点是,你应该尽可能多地支持论点为#34;强类型"尽可能关注您的业务领域。我的意思是:

@Singleton

非常容易出错。对@Singleton public class MockMessageService implements MessageService { public String subject; public String message; @Override public void sendMessage(String subject, String message) { this.subject = subject; this.message = message; } } 的调用是完全有效的,一旦错误出现,可能很难找到一个大的代码库,可能在调用堆栈中很久。

但是类型的签名:

public Foo(int i, int j, int k, int n) { ... }

更安全,因为类型系统和编译器可以帮助你。

答案 1 :(得分:2)

您的方法存在的问题是它违反了Don't Repeat Yourself原则(也称为" DRY")。添加"便利构造函数"将参数传递给依赖项会增加两个模块之间的代码耦合(具体来说,control coupling),这通常是应该避免的做法。

但是,有一种情况是您应该更喜欢方便构造函数:当TitleCodeTitle被视为GridCoordinates的实现细节时会发生这种情况,因此不应公开。在这种情况下,您应该只公开最后一个构造函数,并从类的公共接口中删除所有依赖TitleCode<table style="background-color:#ffe6e6;width:50%;"> <tr><th colspan="6" style="border-bottom:1px solid #AAAAAA;">Credits</th></tr> <tr><th>User</th><th>Account</th><th>Item</th><th>Unit Price</th> <th>Quantity</th><th>Amount</th></tr> <tr id="student_entry"> <td> <select name="account" class="form-control" required style="width: 100px;"> <option value=""><?php echo get_phrase('select_account');?></option> <?php $categories = $this->db->get_where('account', array('category1' => 'EXPENSE'))->result_array(); foreach ($categories as $row): ?> <option value="<?php echo $row['componentId'];?>"><?php echo $row['description'];?></option> <?php endforeach;?> </select> </td> <td> <select id="item_selector_holder" name="item[]" class="form-control" style="width: 100px; margin-left: 0px;"> <option value=""><?php echo get_phrase('select_item');?></option> <?php $categories = $this->db->get('item')->result_array(); foreach ($categories as $row): ?> <option value="<?php echo $row['componentId'];?>"><?php echo $row['itemName'];?></option> <?php endforeach;?> </select> </td> <td> <input type="text" style="width: 80px;" name="unitPrice" data-validate="required" data-message-required="<?php echo get_phrase('value_required');?>"/> </td> <td> <input type="text" style="width: 80px;" name="unitPrice" data-validate="required" data-message-required="<?php echo get_phrase('value_required');?>"/> </td> <td> <input type="text" style="width: 80px;" name="quantity" data-validate="required" data-message-required="<?php echo get_phrase('value_required');?>"/> </td> <td> <span style="margin-right: 0px; padding-left: 20px"> <input onclick="deleteParentElement();" type="button" style="width: 3px; font-weight: bold;font-size: large;" value="-"/> </span> </td> </tr> <tr id="student_entry_append2"></tr> <tr><th> <input onclick="append_credit_table_row();" type="button" style="padding: 3px 8px;font-weight: bold;font-size: large;" value=" + "/> </th><th colspan="3">Total</th><th id="ttlcr">0.00</th></tr> </table> 的构造函数。