如何重用稍有不同的代码

时间:2014-10-16 08:41:37

标签: java c# logic

我在如何正确设计和实现两种方法方面遇到了一些困难。

我有2个方法,A和B.方法A做2件事,方法B只做1件事。方法A所做的事情之一与方法B的方法相同,因此从方法A中调用方法B是非常合理的。

现在的问题是两种方法都需要向用户发送一封电子邮件。当我调用A时,我想收到1封电子邮件,当我调用B时,我还想收到1封电子邮件。这意味着如果我在A中调用方法B,我现在将在执行1个操作(=调用A)时获得2个邮件。为了使A在A中简单地包含B更具吸引力,两种方法的设置过程实际上是相同的,因此不用重做B中的设置,我可以简单地用来自A的这些设置数据调用方法B.但是我没有直接调用B时提供的设置数据,所以在这种情况下我还是需要进行设置。

解决此类问题的最佳方法是什么?我应该:

  1. 在方法B中添加一个参数,我将在其中说明是否应该发送电子邮件以及设置数据的其他参数
  2. 保持两个方法分开,因为方法B在两个上下文中没有完全完全相同
  3. ...其他建议?
  4. PS。我不确定stackoverflow是否真的适合这样的问题,让我知道是否有更好的stackexchange平台。

    感谢您的任何想法

4 个答案:

答案 0 :(得分:1)

我不知道这是否真的是主题。那说......

在我看来,“发送电子邮件”是方法A需要完成的方法B工作中包含的内容之一。因此,为什么不在方法B中实现呢?然后方法A在调用方法B时免费获取它。

如果电子邮件的确切内容根据方法A是否被调用而有所不同,那么确定...您可以向方法B添加参数以便以某种方式自定义电子邮件。

最后,你对细节非常模糊。通过从方法A调用方法B来节省多少代码并不是很清楚。如果它很重要,那么我就是这样的代码共享的坚定支持者。但是,如果我们只是在谈论一个声明,那么......似乎不值得打扰;也许只是在每种方法中使用相同的单个语句就更好了。

对于模糊的回答,我们深表歉意。 GIGO。 :)

答案 1 :(得分:1)

您可以使用方法返回我们电子邮件的内容:

private String funcA() {
    // foo
    return "Mail from funcA";
}

private String funcB() {
    funcA();      // ignoring the return value here, we later return our on
    // foo
    return "Mail from funcB";   // our own return
}

然后你在这些函数之外发送电子邮件(JUST EXAMPLE CODE):

private void mainFunc() {
    String mail = condition ? funcA() : funcB();

    sendMail(mail);
}

答案 2 :(得分:1)

我有两个想法:

  • 创建表示A和B的常用功能的C方法,并使用不同的参数调用A和B中的C
  • 在A中调用B,但仅提取邮件功能以分离方法C

澄清第一个想法:

methodA() {
        firstAction();
        secondAction(Parameter parameterFromA);
        }

methodB() {
        secondAction(Parameter parameterFromB);
        }

答案 3 :(得分:1)

我建议你进一步分解功能。

目前你有两种方法可以这样描述:

void MethodA()
{
    DoThing1();
    DoThing2();
    SendEmail();
}

void MethodB()
{
    DoThing1();
    SendEmail();
}

所以一个相当简单的答案是将两个方法中的实际功能位提取到自己的方法中,并留下类似于上面的shell。每个DoThingX方法都可以返回构建电子邮件等所需的任何内容。

当然,如果DoThingX方法非常小 - 例如几行左右 - 那么以这种方式突破它们可能没有意义。