【问题标题】:What is the best practice to set parameters to object and avoid duplicated code?将参数设置为对象并避免重复代码的最佳做法是什么?
【发布时间】:2015-01-07 20:39:28
【问题描述】:

我在一个有一些实体的项目中工作,为了设置实体属性,我们有很多这样的代码:

    public void recordLogFile(int fileSize, int fileHeight, Long idFile) {

    try {

        LogFileEntity logEntity = new LogFileEntity();
        logEntity.setFileSize(fileSize);
        logEntity.setFileHeight(fileHeight);
        logEntity.setFile(FileEntity.find(idFile));
        logEntity.setStatus(LogStatus.SUCESS);
        logEntity.setType(LogType.NORMAL);
        logEntity.persist();

    } catch (Exception e) {
        some log code
    }

}

有很多类需要持久化日志文件实体,但在某些情况下,我们在属性上有不同的值。例如 LogStatus.FAIL LogType.OLD,我们有一段重复的代码只是改变了值。

最好的方法是什么??

谢谢!!!

【问题讨论】:

  • 我建议使用工厂方法模式。您可以传入状态和类型的参数,并让该方法为您返回一个 LogFileEntity 对象。
  • @Joe 我认为工厂模式非常有用.. 谢谢
  • 1.提取到方法 2。使用默认值编写构建器
  • 考虑 recordLogFile() 的内聚性。它的类的名称是什么?这种方法似乎不遵守单一职责原则,这可能是您重复代码的真正原因。查看存在重复的变体也会很有用。

标签: java design-patterns


【解决方案1】:

你可以做几件事。最简单的事情是创建使用默认值构建的对象,并提供构造函数来填充其余部分。例如,您有这个类 LogFileEntity,它似乎有 5 个属性:fileSizefileHeightfilelogStatuslogType。让我们假设LogStatus.SUCESSLogType.NORMAL 是默认值。如果您在LogFileEntity 中设置这些值,客户端将不必一直设置它们。您的类构造函数可能如下所示:

public LogFileEntity()
{
    logStatus = LogStatus.SUCESS;
    logType = LogType.NORMAL;
    // Maybe set other default values
}

也就是说,您能做的最好的事情就是利用Factory Design Pattern 来实现它。

【讨论】:

  • 嗨 hfontanez... 主要是避免创建很多方法,例如 recordErrorLogFile,而只是更改状态.. 另一个更改状态和类型的方法.. 等等...
  • 您可以做很多事情。有些比其他的更复杂。例如,日志文件的单个实例一旦创建就可以更改状态,您可以(并且应该)使用状态模式来确保文件的状态(生命周期)只能从特定状态更改为有效状态;取决于上下文。同样的事情可以用简单的“setter”方法来完成,但显然更简单的解决方案更容易出错,因为客户端可以将状态设置为无效状态。工厂模式解决了创建对象的问题。状态模式解决了改变它的状态。
  • 顺便说一句,这里是State Pattern Tutorial。他们在保持示例简单方面做得很好。这是一个很好的例子,说明了为什么问题分解很重要。需要解决的问题之一是对象的创建(LogFileEntity)。有一些创建模式可以用来解决这个问题。问题的另一部分涉及对象创建后的行为。还有其他几种行为设计模式可供选择。我为您提供了其中两种模式的链接。
  • @Mr.PaulHenry 过度设计是状态模式的风险。请参阅angry-architect.blogspot.ca/2006/08/… 我认为您的状态逻辑可能足够简单,不能保证将其封装到单独的类中。如果 switch/case 中的状态和转换代码占用一页,它比 State 类层次结构的所有复杂性等要好。仅仅因为您的项目有状态,就意味着您需要应用 State 模式。
  • @Fuhrmanator 过度设计对您所做的任何事情都是一种风险。问题是更大的风险是什么。允许客户端错误地设置状态也存在软件太容易出错的风险。在设计解决方案时,必须权衡所有这些风险并继续提出可以提出的最佳解决方案。出于进度、预算、团队经验等原因,通常必须实施风险更高的解决方案。但这是我们无法争论的事情。只有 OP 和他的团队真正知道他们要面对的是什么。由他们决定什么是最好的。
【解决方案2】:

解决您当前问题的最简单方法是添加一个采用附加参数的重载方法:

    public void recordLogFile(int fileSize, int fileHeight, Long idFile) {
        recordLogFile(fileSize, fileHeight, idFile, LogStatus.SUCESS, LogType.NORMAL);
    }

    public void recordLogFile(int fileSize, int fileHeight, Long idFile,
        LogStatus status, LogType type) {

        try {

            LogFileEntity logEntity = new LogFileEntity();
            logEntity.setFileSize(fileSize);
            logEntity.setFileHeight(fileHeight);
            logEntity.setFile(FileEntity.find(idFile));
            logEntity.setStatus(status);
            logEntity.setType(type);
            logEntity.persist();

        } catch (Exception e) {
            // some log code
        }

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    相关资源
    最近更新 更多