如何消除名为"large class"的代码中的"smell"?

How to eliminate the "smell" of code called "large class"?

请帮助我了解如何删除名为 "Big class" 的代码 "smell"。我有一个 class,我在其中创建了一个 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 的 class 变得非常大。为我的面板创建一个单独的 class 对我来说不是更好吗?然后我传入的所有参数都可以使这个class中的字段。并且可以分配更紧凑的方法,而无需庞大的参数列表。但我不确定我是对的。我想添加另一个 class,所以我想在 class 之间添加新的关系。那么,是否可以把负责建立面板的代码全部搬走呢?这是个好主意吗?

这是一个非常复杂的话题,在这里真的无法充分讨论。 Robert C. Martin 有一本很棒的书,叫做 "clean code"。它提供了将大型复杂 class 重构为更小的更简单 class 的分步示例。我强烈推荐你阅读它。

一般来说(有很多例外)好的设计遵循 Single Responsibility Principle - 它应该只做一件事。实际上,并不总是可以实现这一点,而且很难决定 'one thing' 应该有多大。在您的情况下, 'one thing' 看起来像是在面板中创建组件。与创建面板无关的所有内容(例如,处理与面板关联的事件)都应在其他 classes.

长长的参数列表通常是难闻的气味。问问自己,参数列表是否真的代表了应该在它们自己的 class 中并作为参考传递到方法中的公共上下文。