Сколько работы разумно для конструктора объектов? Должна ли она просто инициализировать поля и фактически не выполнять какие-либо операции с данными, или это нормально, чтобы выполнить какой-либо анализ?
Фон: Я писал класс, который отвечает за разбор HTML-страницы и возвращает различную информацию на основе анализируемой информации. Конструкция класса такова, что конструктор класса выполняет разбор, бросая исключение, если возникает ошибка. После инициализации экземпляра анализируемые значения доступны без дальнейшей обработки через аксессоры. Что-то вроде:
public class Parser {
public Parser(final String html) throws ParsingException {
/* Parsing logic that sets private fields */
/* that throws an error if something is erroneous.*/
}
public int getNumOfWhatevers() { return private field; }
public String getOtherValue() { return other private field; }
}
После разработки класса я начал задаваться вопросом, была ли это правильная практика OO. Если код синтаксического анализа должен быть помещен в метод void parseHtml()
, и аксессоры вернутся только к допустимым значениям после вызова этого метода? Я чувствую, что моя реализация правильная, но я не могу не чувствовать, что некоторые пуристы OO могут найти ее неправильной по какой-то причине и что реализация, такая как следующее, будет лучше:
public class Parser {
public Parser(final String html) {
/* Remember html for later parsing. */
}
public void parseHtml() throws ParsingException {
/* Parsing logic that sets private fields */
/* that throws an error if something is erroneous.*/
}
public int getNumOfWhatevers() { return private field; }
public String getOtherValue() { return other private field; }
}
Существуют ли случаи, когда код инициализации, такой как информация о синтаксическом анализе, не должен возникать внутри конструктора, или я просто глупый и второсортный?
Каковы преимущества/недостатки разделения синтаксического анализа на конструктор?
Мысли? Insights?