【问题标题】:How to reuse a method, but adding more features to the second one?如何重用一种方法,但在第二种方法中添加更多功能?
【发布时间】:2020-08-14 17:28:54
【问题描述】:

我在Register 类中有一个方法addUser(),它作为常规形式工作,向系统用户询问诸如“firstName”、“lastName”之类的信息"、“用户名”和“密码”。

class Register {
  void addUser() {
    try {
      System.out.print("First Name:\n> ");
      String firstName = userInput.nextLine();
      (...)
  }
}

只有一次用户注册并登录后,他们可以使用 Customer 类中的方法添加新客户,其执行方式与 addUser() 相同,但添加更多字段,例如“ 地址”和“电子邮件”。

class Customer {

/*At the moment I'm redoing all over again just because it works.
and because I didn't know how to implement in any other way.*/

  void addCustomer() {
    try {
      System.out.print("First Name:\n> ");
      String firstName = userInput.nextLine();

      System.out.print("Address:\n> ");
      String address = userInput.nextLine();
      (...)


如何利用用户作为条件登录的事实在Customer 类中重用addUser() 方法?提前感谢您的宝贵时间。

【问题讨论】:

  • 继承,再扩展类,在子类中添加附加指令
  • 一点旁注:通过初始化 try 块中的变量,您可以使它们无法从 try 块/范围之外访问。您可能想要的是初始化整个类 Customer 的变量,然后在 try 块中设置它们。无法解决您的问题 - 但我刚刚注意到
  • 这不是 OOP 应该如何工作的。用户和客户是您的域中的两个不同概念。您需要在不同地方向用户询问一组信息这一事实应该会引导您找到一个可以做到这一点的类(使用不同的“配置”)。
  • 我确实尝试过继承,但是我在尝试访问时遇到了问题,但我没有意识到这是因为try/catch,它说了很多。感谢那。至于我是否应该继续这样做,这是一个公平的观点。我只是想在这里应用代码可重用的概念。

标签: java reusability code-reuse


【解决方案1】:

首先,我建议您将 addUser 方法从 Register 和 Customer 中移出 - 这样您就可以保证该方法不与任何特定用例绑定,因此可以重复使用。

然后您将需要为调用上下文(客户和注册)创建机制以与 addUser 方法交互。为此,您可以使用他们交换的某种数据对象,然后一旦他们取回它,他们就会提取他们想要的数据,或者您可以让他们都实现一个接口,addUser 方法可以通过该接口传递,并且返回它捕获的内容。

在这种情况下,我不认为使用继承是重用的良好推动力。继承是必须小心完成的事情,因为它也会增加依赖关系。重要的是要坚持在使用继承时,被继承的 2 种类型实际上应该具有某种继承关系 - 我认为这里不是这种情况。

那么Register用户可以调用这个addUser方法,Customer类可以调用这个addUser方法,然后添加它包含的额外字段。

【讨论】:

  • 谢谢,我会在此基础上重新考虑另一种方法。这实际上有很大帮助。
【解决方案2】:

您可以使用设置为 false 的静态布尔值(例如:isLoggedIn)。如果用户登录成功,则将其更改为 true。然后仅当 isLoggedIn 变量等于 true 时才在 Customer 类中调用此方法(创建 Register 对象)

【讨论】:

  • 因为您想要的代码当时只能由一个人使用?
  • 不,这只是检查用户是否登录。上面评论中所述的继承也可能为此提供解决方案。
  • 布尔值只能判断 a 用户是否登录。继承在这里根本没有帮助。 OP 的代码需要重构,超越简单的“创建子类”。
  • 这是真的。我确实尝试过使用静态布尔值,但没有成功。我的继承问题是方法的实现。如何向继承的方法添加更多指令?
【解决方案3】:

我将把您的问题改写为“如何通过重用来减少我的代码重复性和更易于维护?”

这种情况下的解决方案是创建一个可重用函数,该函数负责打印提示和从键盘读取的重复任务:

public class Console {

  public static String prompt(String field) {
    System.out.print(field + ":\n> ");
    return userInput.nextLine();
  }
}

然后你可以简化你的其他功能:

void addUser(){
  try {
    String firstName = Console.prompt("First Name");
    (...)
  }
}

void addCustomer(){
  try {
    String firstName = Console.prompt("First Name");
    String address = Console.prompt("Address");
    (...)
  }
}

其他形式的复用还有对象组合和继承,但是根据你给出的示例代码,我觉得没有必要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 2020-12-17
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2019-02-28
    • 2013-05-22
    • 2023-03-16
    相关资源
    最近更新 更多