long方法的方法名称

时间:2011-09-15 20:52:05

标签: methods refactoring fluent-interface

好的风格(清洁代码书)说方法的名称应该描述方法的作用。因此,例如,如果我有一个验证地址的方法,将其存储在数据库中,并发送电子邮件,如果名称是verifyAddressAndStoreToDatabaseAndSendEmail(address);

verifyAddress_StoreToDatabase_SendEmail(address);

虽然我可以在3种方法中划分该功能,但我仍然需要一种方法来调用这3种方法。所以一个大的方法名称是不可避免的。

拥有和命名的方法肯定描述了该方法的作用,但IMO它的可读性不是很高,因为名称可能非常大。你会如何解决它?

编辑:也许我可以使用流畅的风格来分解方法名称,例如:

verifyAddress(address).storeToDatabase().sendEmail();

但我需要一种方法来确保调用的顺序。也许通过使用状态模式,但这会导致代码增长。

4 个答案:

答案 0 :(得分:6)

我如何处理这个问题就是如你所提到的那样制作3个较小的方法,然后在调用3个较小的方法的较高方法中,我将其命名为“为什么”我需要做这三件事。

尝试定义您需要执行这些步骤的原因并将其用作方法名称的基础。

答案 1 :(得分:2)

单一方法不应该做3件事。因此将工作分为3种方法:

  1. verifyAddress
  2. storeAddress
  3. sendEmail

答案 2 :(得分:2)

我正在跟进我之前的评论,但是我在这里的评价比合适的评论还多,所以我在回答。

该方法的详细信息属于文档而非方法名称(在我看来)。可以这样想......通过将SendEmail放在方法的名称中,您可以将实现细节提交给方法名称。如果决定通过短信或推特或其他东西而不是电子邮件发送通知怎么办?您是否更改了方法的名称并破坏了API,或者您是否有一个误导API消费者的方法名称?需要考虑的事情。

如果你坚持在名称中保留方法的功能,我建议你找一些更通用的东西。也许就像VerifySaveAndNotify(Address address)一样。这样,方法名称会告诉您它正在做什么,而没有指定如何它。类型Address的参数让您知道正在验证和保存的。所有这些共同努力,使您的方法名称信息丰富,灵活,简洁。

答案 3 :(得分:0)

  

编辑:也许我可以使用流畅的风格来分解方法名称,例如:

     

verifyAddress(地址).storeToDatabase()sendEmail();

     

但我需要一种方法来确保调用的顺序。也许通过使用状态模式,但这会导致代码增长。

为了确保以流畅的方式排序命令,每个结果都是一个只暴露下一步所需功能的对象。例如:

public class Verifier
{
    public DataStorer VerifyAddress(string address)
    { 
        ...
        return new DataStorer(address);
    }
}

public class DataStorer
{
    public Emailer StoreToDataBase()
    {
        ...
        return new Emailer(...);
    }
}

public class Emailer
{
    public void SendEmail()
    {
        ...
    }
}

如果您需要创建一个非常精细的设计并希望优化类的可重用性,这很方便,但在大多数情况下可能会设计过度。更好的可能是因为其他人已经说要选择一个代表整个过程应该代表什么的名称。您可以简单地将其称为“StoreAndEmail”,假设您在将数据提交到任何目的地之前经常进行验证。如果你不介意名字很长,那么另一种选择就是简单地描述它并接受一个长名称是必要的。最后,它确实不会花费你任何东西,但肯定会使你的代码更具体。