que otra orden metodos llamar inicializar inicializadores inicializador inicializacion desde declarar constructores como clases clase atributos java oop coding-style

java - otra - ¿Es una violación de Clean Code llamar al método init en un constructor como este?



que es inicializador (6)

Mi preocupación en el siguiente código es que el parámetro para el constructor no está directamente asignado a los campos de instancia de la clase. Los campos de instancia derivan valor del parámetro y para el cual estoy usando el método initalize. Además, hago algunas cosas para que el objeto creado se pueda usar directamente en el código que sigue, por ejemplo, llamando a drawBoundaries (). Siento que está haciendo lo que se entiende por crear (inicializar) un Lienzo en un sentido abstracto.

¿Mi constructor está haciendo demasiado? Si agrego métodos para llamar las cosas en el constructor explícitamente desde afuera, eso será incorrecto. Por favor, hágame saber sus puntos de vista.

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

PD: Lo siento si esto parece una pregunta tonta; mi código será revisado por un gurú de OOP y estoy preocupado: -0

EDITAR:

Leí algunas preocupaciones sobre los métodos para desmantelar a Cánvas (), afortunadamente estos métodos son privados y no requieren ningún otro método.

De todos modos, después de más investigaciones en la red, comencé a gustarme más ... ¡¡Espero que estén de acuerdo !! ??

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


Aunque no es la forma más elegante de hacerlo, no lo veo como defectuoso desde la perspectiva de OO. Sin embargo, si no está llamando al método private initalizeCanvas desde cualquier otro lugar dentro de la clase, entonces puede considerar mover esas tres líneas al propio constructor.


Depende.

No está mal que un constructor llame a un método privado, siempre que el método privado no llame a otros métodos que podrían anularse. Sin embargo, si se puede anular el método o uno de los métodos que llama, puede tener problemas. Específicamente, se llamará al método de anulación antes de que se ejecute el constructor de las clases de anulación y verá los campos de instancia antes de que se hayan inicializado.

Un segundo problema es que si algunos de los métodos en su método initalizeCanvas parecen "publicar" el objeto actual antes de que se haya inicializado por completo. Esto es potencialmente problemático si la aplicación tiene varios subprocesos y podría dar lugar a que otros subprocesos vean valores de campo obsoletos.


En general, es una mala idea para un constructor contener un código no trivial. Como regla general, los constructores deben, como máximo, asignar valores suministrados a los campos. Si un objeto requiere una inicialización compleja, esa inicialización debe ser responsabilidad de otra clase (generalmente una fábrica ). Vea la gran reseña de Miško Hevery sobre este tema: Fallo: Constructor hace Real Work .


Una función init privada puede ser útil si tiene múltiples constructores donde algunos parámetros son predeterminados o inferidos. Una vez que se ha determinado todo, una función de inicio privada rellena el objeto.

En una clase de un constructor, probablemente no.


Veo dos posibles problemas:

  • ¿Los métodos que llama en initializeCanvas privados o finales? Si no lo son, es posible que una subclase los anule y sin querer rompa su constructor.

  • ¿Estás haciendo operaciones gráficas en el método drawBoundaries ? Es una buena práctica para un constructor hacer solo el mínimo necesario para crear un objeto válido. ¿Son necesarias esas operaciones para que el lienzo tenga un estado inicial válido?


Nunca debe llamar a métodos no finales en un constructor. Efectivo Java hace un buen trabajo explicando por qué, pero básicamente su objeto no está en un estado estable antes de que el constructor regrese. Si su constructor llama a métodos que son reemplazados por una subclase, puede obtener un comportamiento extraño e indefinido.

También vea esta respuesta .