如何消除称为“大类”的代码的“气味”?

时间:2015-11-27 05:18:08

标签: java oop refactoring

请帮助我理解如何摆脱名为“大类”的代码“气味”。我有一个类,我在其中创建一个GUI。我在GUI上添加了一个面板,之后我在该面板上添加了一些组件。总而言之,它具有相当复杂的结构。这是我开始创建面板的方法:

private static JPanel createTasksMainInfoPanel(JTabbedPane taskTabbedPane) {
JPanel panelForMainInfo = new JPanel();
//some code...
addComponentForMainInfoBox(verticalBoxForTaskMainInfo, new String(),
        createTypeChoicePanel(max, min));
JButton ok = new JButton("OK");
createListenerForOk(ok, fieldForName, fieldForVarQuantity,
        FieldForLimitQuantity, FieldForCritQuantity, max,
        taskTabbedPane);
addComponentForMainInfoBox(verticalBoxForTaskMainInfo, new String(), ok);
panelForMainInfo.add(verticalBoxForTaskMainInfo);
return panelForMainInfo;
}

这里我只显示了方法的开头和结尾。中间大约有50行。最重要的是在方法的最后,我调用了另一种创建我的面板所需的方法。另一个问题是我用很多参数调用这些方法。所以,在结果中我有很长的方法与大型参数列表。而我创建GUI的课程变得非常庞大。我为自己的小组创建个人课程不是更好吗?然后,我在参数中传递的所有内容都可以生成此类中的字段。并且可以分配更紧凑的方法并且没有庞大的参数列表。但我不确定我是对的。我想添加另一个类,所以我想在类之间添加新的关系。那么,是否可以移动负责建立面板的所有代码?这是一个好主意吗?

1 个答案:

答案 0 :(得分:0)

这是一个非常复杂的话题,这里真的无法妥善处理。 Robert C. Martin写了一本名为“干净代码”的精彩书。它提供了一步一步的示例,将大型复杂类重构为更简单的更简单的类。我强烈建议你阅读它。

总的来说(有很多例外)好的设计遵循Single Responsibility Principle - 它应该只尝试做一件事。在实践中,并不总是能够实现这一目标,并且很难确定“一件事”应该有多大。在你的情况下,“一件事”看起来就是在面板中创建组件。与创建面板无关的所有内容(例如,处理与面板相关的事件)都应该在其他类中。

长篇名单通常都是难闻的气味。问问自己,参数列表是否真正代表了应该在他们自己的类中的常见上下文,并作为参考传递给方法。