【问题标题】:Should user input verification be done at class level or UI level?用户输入验证应该在类级别还是 UI 级别进行?
【发布时间】:2018-03-23 10:42:33
【问题描述】:

假设您有一个控制台应用程序:

Main.javaClassA.java

您的主类包含运行程序的public static void main(String[] args) 方法,它使用用户输入作为参数来调用ClassA 中的方法。

在将参数发送到ClassA 方法之前,您是否将用户输入验证放在main 方法中?

您是否将用户输入验证放在ClassA 方法中,这些方法会转发一条消息,指示输入是否成功?还是抛出异常?

Integer.Parse(...) 在输入无效时抛出 NumberFormatException

【问题讨论】:

  • 输入是来自控制台还是来自“ClassA”中提供的图形用户界面?如果你想象这些类是人......谁会“拥有”这些论点?你能想象在另一个具有完全相同参数的上下文中使用 ClassA 吗?是否只有 ClassA 或 ClassB 和 ClassC 使用这些参数?
  • @Stefan 输入来自控制台(非图形用户界面)
  • 而 ClassA 只被 'main' 方法使用。
  • 我认为没有明确的答案。但是采用 MVC(模型视图控制器)设计方法,验证(在我看来)应该由控制器进行,以确保模型(A 类)不会收到无效请求。就我个人而言,我不认为输入验证是业务逻辑,因此不属于模型。如果您引入了控制器,那么您将能够切换到图形视图(而不是控制台),而无需重新实现 vaidstion 逻辑。由于这可能不是问题,因此我会将验证逻辑引入您的 Main 类。

标签: java parameters user-input inputverifier


【解决方案1】:

您可能希望在 classA 中抛出有意义的异常,并让您的 main 方法决定是否/如何处理这些异常。当您重用 A 类时,新的调用者可能想要做出其他决定。

我推荐 Book CleanCode (Robert C. Martin) 的“ErrorHandling”一章。例如,它说“定义正常流程”、“使用异常而不是返回代码”、“分离您的业务逻辑和错误处理”。

在某些情况下,获得快速反馈很重要...不要等待两个小时才能完成计算并在 90 % 时获得异常。在其他情况下,获得详细的反馈更为重要。另见Data validation: fail fast, fail early vs. complete validation

检查您的代码是否易于阅读并理解正常流程。每个函数应该只做一件事/建模一个抽象级别。异常处理是一级 ob 抽象。

【讨论】:

  • 谢谢,我已经决定在 UI 级别确保输入是正确的数据类型以传递给类方法(即信用卡号实际上是一个数字)。并在类方法中验证业务逻辑(即信用卡号是否真的是信用卡号)。
  • 您对 Mabe commons cli 感兴趣:commons.apache.org/proper/commons-cli 解析命令行参数的更多选项:stackoverflow.com/questions/367706/…
猜你喜欢
  • 2012-04-23
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 2014-04-24
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多