在构造函数中调用 init 方法是否违反了 Clean Code,如下所示

2022-09-04 02:17:24

我在下面的代码中担心的是,构造函数的参数实际上并没有直接映射到类的实例字段。实例字段从参数派生值,我为其使用了 initalize 方法。此外,我做了一些事情,以便创建的对象可以直接在后面的代码中使用,例如调用drawBoundaries()。我觉得它正在做抽象意义上的创建(初始化)Canvas 的含义。

我的构造函数是否执行了太多操作?如果我添加方法从外部显式调用构造函数中的内容,那将是错误的。请让我知道你的看法。

public class Canvas {

private int numberOfRows;
private int numberOfColumns;
private final List<Cell> listOfCells = new LinkedList<Cell>();

public Canvas(ParsedCells seedPatternCells) {
     initalizeCanvas(seedPatternCells);
}

private void initalizeCanvas(ParsedCells seedPatternCells) {
    setNumberOfRowsAndColumnsBasedOnSeedPatten(seedPatternCells);
    drawBoundaries();
    placeSeedPatternCellsOnCanvas(seedPatternCells);
}
...

P.S.:抱歉,如果这看起来像一个愚蠢的问题;我的代码将由OOP大师审查,我只是担心:-0

编辑:

我读到一些关于 initalizeCanvas() 中的方法被覆盖的担忧 - 幸运的是,这些方法是私有的,不调用任何其他方法。

无论如何,在对网络进行进一步研究之后,我开始更喜欢这个...我希望你们同意!!??

public class Canvas {

private int numberOfRows;
private int numberOfColumns;
private final List<Cell> listOfCells = new LinkedList<Cell>();

private Canvas() {
}

public static Canvas newInstance(ParsedCells seedPatternCells) {
    Canvas canvas = new Canvas();
    canvas.setNumberOfRowsAndColumnsBasedOnSeedPatten(seedPatternCells);
    canvas.drawBoundaries();
    canvas.placeSeedPatternCellsOnCanvas(seedPatternCells);
    return canvas;
}

答案 1

构造函数包含非平凡的代码通常是一个坏主意。通常,构造函数最多应将提供的值分配给字段。如果一个对象需要复杂的初始化,则该初始化应由另一个类(通常是工厂)负责。参见Miško Hevery关于这个主题的精彩文章:缺陷:构造器做真正的工作


答案 2

切勿在构造函数中调用非最终方法。有效的Java很好地解释了原因,但基本上你的对象在构造函数返回之前并不处于稳定状态。如果构造函数调用被子类重写的方法,则可能会得到奇怪的、未定义的行为。

另请参阅此答案