Java 为对象设置参数并避免重复代码的最佳实践是什么?
我在一个有一些实体的项目中工作,为了设置实体属性,我们有很多这样的代码:Java 为对象设置参数并避免重复代码的最佳实践是什么?,java,design-patterns,Java,Design Patterns,我在一个有一些实体的项目中工作,为了设置实体属性,我们有很多这样的代码: public void recordLogFile(int fileSize, int fileHeight, Long idFile) { try { LogFileEntity logEntity = new LogFileEntity(); logEntity.setFileSize(fileSize); logEntity.setFileHeigh
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
}
}
public LogFileEntity()
{
logStatus = LogStatus.SUCESS;
logType = LogType.NORMAL;
// Maybe set other default values
}
有很多类需要持久化日志文件实体,但在某些情况下,我们在属性上有不同的值。例如LogStatus.FAIL LogType.OLD,我们有一段重复的代码,只改变了值
让这更好的最佳方法是什么
谢谢 如果我正确理解你的问题,我想你可以做几件事。最简单的事情是创建使用默认值构建的对象,并提供构造函数来填充其余的内容。例如,您有一个类
LogFileEntity
,它似乎有5个属性:fileSize
、fileHeight
、file
、logStatus
和logType
。让我们假设LogStatus.success
和LogType.NORMAL
是默认值。如果在LogFileEntity
中设置这些值,则客户端不必一直设置它们。您的类构造函数可以如下所示:
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
}
}
public LogFileEntity()
{
logStatus = LogStatus.SUCESS;
logType = LogType.NORMAL;
// Maybe set other default values
}
也就是说,IMHO,您所能做的最好的事情就是利用来实现这一点。解决当前问题的最简单方法是添加一个重载方法,该方法采用附加参数:
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
}
}
我建议采用工厂方法模式。您可以传入状态和类型的参数,并让该方法为您返回LogFileEntity对象。@Joe我认为工厂模式非常有用。。谢谢。提取到方法2。使用
recordLogFile()
的defaultsConsider内聚编写生成器。它的类名是什么?这种方法似乎不符合单一责任原则,这可能是您复制代码的真正原因。这将是有用的,看看变种有重复,太。嗨hfontanez。。。主要的是避免创建很多方法,比如recordErrorLogFile,而只是更改状态。。另一个用于更改状态和类型的。。等等…你可以做很多事情。有些比其他更复杂。例如,日志文件的单个实例可以在创建后更改状态,您可以(并且应该)使用状态模式确保文件的状态(生命周期)只能从特定状态更改为有效状态;取决于上下文。同样的事情也可以通过简单的“setter”方法来完成,但显然更简单的解决方案更容易出错,因为客户端可以将状态设置为无效状态。Factory模式解决了创建对象的问题。状态模式解决了更改其状态的问题。顺便说一句,下面是示例。他们很好地保持了示例的简单性。这是一个很好的例子,说明了问题分解的重要性。需要解决的问题之一是创建对象(LogFileEntity)。有几个创新模式可以用来解决这个问题。问题的另一部分涉及对象创建后的行为。还有其他几种行为设计模式可供选择。我向您提供了其中两种模式的链接。@PaulHenry先生,过度设计是一种带有状态模式的风险。看,我认为您的状态逻辑可能足够简单,不足以保证将其封装到单个类中。如果开关/案例中的状态和转换代码占用一页,那么它比状态类层次结构等的所有复杂性都要好。仅仅因为您的项目有状态,这并不意味着您需要应用状态模式。@Fuhrmanator过度设计对于您所做的任何事情都是一种风险。问题是什么风险更大。由于允许客户端错误地设置状态,软件也有太容易出错的风险。在设计解决方案时,必须权衡所有这些风险,并采用能够想到的最佳解决方案。通常,为了日程安排、预算、团队经验等,必须实施风险更高的解决方案。但这是我们不能争论的问题。只有OP和他的团队真正知道他们面对的是什么。由他们决定什么是最好的。