В настоящее время я использую Qt QTextStream для чтения различных текстовых файлов (читай: с разным расширением). Каждый класс «FileReader», который я создаю, начинает иметь похожий шаблон, в котором ему нужно readLine (), например:
// Get the line's first word as float where each word is delimited by a comma
fileData.readLine().split(",")[0].toFloat();
Вы можете представить, что в моей программе десятки таких строк.
Кроме того, возможно, что toFloat () может потерпеть неудачу (например, считываемое значение не конвертируется в float), поэтому я планирую изменить приведенную выше строку следующим образом:
// Get the line's first word as float where each word is delimited by a comma
bool convertible;
fileData.readLine().split(",")[0].toFloat(&convertible);
if(!convertible) throw std::runtime_error("Error!");
Очевидно, что IMO, наименее обслуживаемый код будет состоять в том, чтобы просто повторять приведенный выше код для каждой строки, которую я использую readLine (). Это определенно не тот путь, который я планирую выбрать. (Я бы приветствовал кого-то, кто мог бы доказать в противном случае преимущества этого)
Я мог бы придумать несколько способов рефакторинга этого кода.
1) Вместо непосредственного использования класса Qt QTextStream создайте свой собственный класс, которому принадлежит QTextStream, а затем создайте метод readFirstTokenAsFloat (). Внутри этого метода у меня будет проверка ошибок, как показано выше. Тогда каждый класс «FileReader» теперь переключился бы на использование этого нового класса. Плюсы этого подхода, IMO, заключаются в том, что он выполняет то, что я хочу сделать, но минусы, IMO, в том, что если бы мне нужно было заняться другими делами, или если бы я хотел использовать другие методы QTextStream, я бы нарушил DRY принцип (?) путем дублирования одних и тех же методов, а внутри просто иметь однострочный вызов QTextStream.
2) ИЛИ Я мог бы просто наследовать от QTextStream. Таким образом, я просто расширил бы его функциональность, а также получил бы всю функциональность QTextStream. Но наследование хорошая идея в этом случае?
3) Есть еще мысли? Я уверен, что кто-то сталкивался с чем-то вроде этого. Есть ли конкретное имя для этого шаблона?