像这样在构造函数中调用init方法是否违反Clean Code


问题内容

我在下面的代码中担心的是,构造函数的参数实际上并未直接映射到类的实例字段。实例字段从参数获取值,而我正在使用initalize方法。此外,我做了一些工作,以便可以在随后的代码中直接使用创建的对象,例如,调用drawBoundaries()。我感觉它在做抽象意义上的创建(初始化)画布的意思。

我的构造函数做得太多吗?如果我添加方法从外部显式调用构造函数中的内容,那将是错误的。请让我知道您的意见。

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);
}
...

PS:对不起,这看起来像是一个愚蠢的问题;我的代码将由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;
}

问题答案:

对于构造函数而言,包含非平凡的代码通常是一个坏主意。通常,构造函数最多应将提供的值分配给字段。如果对象需要复杂的初始化,则该初始化应由另一个类(通常是factory)负责。请参阅MiškoHevery关于该主题的出色文章:缺陷:构造函数完成了实际工作