Как мне реорганизовать мой код в этом случае? - PullRequest
0 голосов
/ 30 января 2010

В настоящее время я использую 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) Есть еще мысли? Я уверен, что кто-то сталкивался с чем-то вроде этого. Есть ли конкретное имя для этого шаблона?

1 Ответ

1 голос
/ 30 января 2010

Если вы думаете, что используете все функциональные возможности QTextStream, то наследование - это путь IMO. Наследование само по себе не является плохой вещью, в некоторых случаях его следует избегать. Но если в QTextStream есть хотя бы метод, который вообще не следует вызывать, то это, вероятно, приведет к странному замыслу (возможно, использование интерфейса поможет в этом случае)

Теперь, если вы используете подмножество функциональных возможностей, то композиция (подход № 1) - это путь.

Я бы дополнительно предложил создать интерфейс с методом readFirstTokenAsFloat () и любым другим методом, который вам нужен, а затем реализовать интерфейс (и использовать его в ваших «FileReaders»). Таким образом, у вас будет меньше связанных и легче изменить дизайн.

Если что-то не ясно или был противоречивым, не стесняйтесь писать в комментариях, так что мы можем улучшить ответ =).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...