Java 如何重用略有不同的代码

Java 如何重用略有不同的代码,java,c#,logic,Java,C#,Logic,对于如何正确设计和实现这两种方法,我遇到了一些困难 我有两种方法,A和B。方法A做两件事,方法B只做一件事。方法A所做的事情之一与方法B所做的事情相同,因此从方法A中调用方法B是非常合理的 现在的问题是,这两种方法都需要向用户发送一封电子邮件。当我调用A时,我希望收到一封电子邮件,当我调用B时,我还希望收到一封电子邮件。这意味着如果我在A中调用方法B,我现在将在执行1个操作(=调用A)时收到2封邮件。为了使简单地将B包含在A中更具诱惑力,两种方法的设置过程实际上是相同的,因此,我不需要在B中重新

对于如何正确设计和实现这两种方法,我遇到了一些困难

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

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

解决这个问题的最好办法是什么?我应该:

  • 在方法B中添加一个参数,其中我将说明是否应发送电子邮件,以及设置数据的另一个参数
  • 将这两个方法分开,因为方法B在两个上下文中做的事情并不完全相同
  • 。。。其他建议
  • 另外,我不确定stackoverflow是否真的适合这样的问题,请告诉我是否有更好的stackexchange平台来解决这个问题


    谢谢你的建议

    我也不知道这是否是真正的主题。也就是说

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

    如果电子邮件的确切内容因方法A是否被调用而不同,那么请确定……您可以向方法B添加一个参数,以某种方式自定义电子邮件

    最后,你在细节上很含糊。通过从方法A调用方法B可以节省多少代码还不是很清楚。如果这很重要,那么我强烈支持这样的代码共享。但是,如果我们只是谈论一个单一的声明,那么……这似乎不值得费心;也许在每个方法中使用相同的语句更好


    对不起,我的回答含糊不清。吉戈:)

    我也不知道这是否是真正的主题。也就是说

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

    如果电子邮件的确切内容因方法A是否被调用而不同,那么请确定……您可以向方法B添加一个参数,以某种方式自定义电子邮件

    最后,你在细节上很含糊。通过从方法A调用方法B可以节省多少代码还不是很清楚。如果这很重要,那么我强烈支持这样的代码共享。但是,如果我们只是谈论一个单一的声明,那么……这似乎不值得费心;也许在每个方法中使用相同的语句更好


    对不起,我的回答含糊不清。吉戈:)

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

    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
    }
    
    然后在这些功能之外发送电子邮件(仅示例代码):


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

    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
    }
    
    然后在这些功能之外发送电子邮件(仅示例代码):

    我有两个想法:

    • 创建表示A和B的公共功能的C方法,并使用不同的参数调用A和B中的C
    • 在A中调用B,但将邮件功能单独提取到单独的方法C中
    要澄清第一个想法:

    methodA() {
            firstAction();
            secondAction(Parameter parameterFromA);
            }
    
    methodB() {
            secondAction(Parameter parameterFromB);
            }
    
    我有两个想法:

    • 创建表示A和B的公共功能的C方法,并使用不同的参数调用A和B中的C
    • 在A中调用B,但将邮件功能单独提取到单独的方法C中
    要澄清第一个想法:

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

    我建议您进一步拆分功能

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

    void MethodA()
    {
        DoThing1();
        DoThing2();
        SendEmail();
    }
    
    void MethodB()
    {
        DoThing1();
        SendEmail();
    }
    
    因此,一个相当简单的答案是将两个方法中的实际函数位提取到它们自己的方法中,并留下一个类似于上述的shell。每个
    DoThingX
    方法都可以返回构建电子邮件等所需的任何内容


    当然,如果
    DoThingX
    方法真的很小,比如几行左右,那么以这种方式将它们分开可能没有意义

    我建议您进一步拆分功能

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

    void MethodA()
    {
        DoThing1();
        DoThing2();
        SendEmail();
    }
    
    void MethodB()
    {
        DoThing1();
        SendEmail();
    }
    
    因此,一个相当简单的答案是将两个方法中的实际函数位提取到它们自己的方法中,并留下一个类似于上述的shell。每个
    DoThingX
    方法都可以返回构建电子邮件等所需的任何内容


    当然,如果
    DoThingX
    方法真的很小,比如几行左右,那么以这种方式将它们分开可能没有意义

    如果从funcB()调用funcA()的返回值,您怎么能忽略它呢?@Tarek只需像上面一样键入它。如果检查/保存返回值,它看起来像
    String resultfloma=funcA()
    但是只有一个调用
    funcA()
    会忽略返回值(忽略意义,您不会对它做任何操作)。感谢您的澄清!非常好的主意,不过对于我目前的项目,我认为这只会增加额外的复杂性。我没有详细描述我的问题,因此您的解决方案只会给类/项目增加额外的复杂性。最好是这样