像这样在构造函数中调用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关于该主题的出色文章:缺陷:构造函数完成了实际工作。