2011-04-23 31 views
13

我在下面的代码中担心的是构造函数的param实际上并不直接映射到类的实例字段。实例字段从参数中获取值,我使用initalize方法。此外,我做了一些工作,以便创建的对象可以直接用在后面的代码中。调用drawBoundaries()。我觉得这是做抽象意义上创建(初始化)Canvas的意思。是否违反Clean Code来调用这样的构造函数中的init方法

我的构造函数做得太多了吗?如果我添加方法从外部显式调用构造函数中的东西,那就错了。请让我知道你的意见。

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

我没有看到任何可疑的代码错误。 – 2011-04-23 14:35:04

回答

11

构造函数包含非平凡的代码通常是一个坏主意。通常,构造函数最多应该为字段赋值。如果对象需要复杂的初始化,则该初始化应该由另一个类(通常为factory)负责。请参阅MiškoHevery关于此主题的精彩文章:Flaw: Constructor does Real Work

1

尽管它不是最优雅的方式,但我不认为它从OO的角度来看是有缺陷的。但是,如果您不是从类中的任何其他位置调用private方法initalizeCanvas,则可以考虑将这三行移动到构造函数本身。

0

我看到两个潜在的问题:

  • 是方法,你在initializeCanvas私人或最终打电话?如果它们不是,那么子类就有可能覆盖它们,并在不知情的情况下破坏你的构造函数。

  • 你在做drawBoundaries方法的图形操作吗?构造函数只需要创建一个有效对象所需的最小值就是很好的做法。这些操作对于画布是否有必要具有有效的初始状态?

2

你不应该在构造函数中调用非final方法。 有效的Java在解释原因时做得很好,但基本上你的对象在构造函数返回之前没有处于稳定状态。如果构造函数调用被子类重写的方法,则可能会出现奇怪的未定义行为。

另请参阅this answer

+1

在这种情况下,该方法是'private',所以它不能被子类覆盖。我错过了什么吗? – kunal 2011-04-23 15:56:14

+0

是的,你的私有方法正在调用其他方法。所有这些方法都是私有的还是最终的? – 2011-04-23 15:58:38

+0

几年前,我接受了一次求职面试,他们问我一段代码出了什么问题。在提到明显的问题之后,我告诉他们有一个潜在的设计问题,因为根据经验,我们永远不会从构造函数调用私有方法。 - 这在半小时的讨论中升级了,因为面试官不相信我。最后,他们没有给我这份工作。显然他采取了这个人。据采访者说:“我不明白OOP”。 :-) - 但有一本像“Effective java”这样的书的参考很好。这将是一个明确的胜利。 – bvdb 2016-06-15 09:45:04

0

这取决于。

构造函数调用私有方法并不坏,前提是私有方法不调用可能被覆盖的其他方法。但是,如果方法或其调用的方法之一可能被覆盖,则可能会遇到麻烦。具体来说,覆盖方法将在覆盖类构造函数运行之前调用,并且会在实例字段被初始化之前看到。

第二个问题,如果你的initalizeCanvas方法中的一些方法看起来像我们在完全初始化之前“发布”当前对象。如果应用程序是多线程的,这可能会造成问题,并可能导致其他线程看到过时的字段值。

0

私有初始化函数可能如果您有多个构造函数,其中某些参数是默认或推断的,它们会很有用。一切都确定后,一个私人的初始化函数将填充该对象。

在一个构造函数类中,可能不是。

相关问题