Классы, предназначенные для повторного использования, не должны делать слишком много предположений о том, где они будут использоваться.Представьте, что вы создаете класс C ++ для инкапсуляции идеи файла, например:
class CFile {
public:
CFile(const char* path);
void rename(const char* new_path);
std::vector<char> get_content();
};
Этот класс можно использовать многократно.Сегодня его можно использовать в консольном приложении, где можно записать информацию в стандартный вывод.Завтра он может быть использован в приложении с графическим интерфейсом, где нет смысла писать в стандартный вывод.Вероятно, для метода rename()
имеет больше смысла выдавать исключение при ошибке, чем для записи в стандартный вывод.Клиентское приложение (консоль против GUI) может затем выбрать обработку ошибки, как они захотят.
Однако на практике вы обнаружите, что большинство систем представляют собой смесь классов многократного использования (классы, которые могут быть легкоизвлекается из одного приложения и используется как есть в другом приложении) и целевые классы (классы, предназначенные для обработки сценария использования, специфичного для программы).Для сфокусированного класса может быть предпочтительнее принять его вариант использования, и в этом случае он может свободно писать в stdout.Например, ваш main()
метод может просто выглядеть примерно так:
int main(int argc, char* argv[]) {
CMyApplication application;
return application.run(argc, argv);
}
В этом случае все функции вашего приложения скорее всего в классах, а «контроллер» или «драйвер» для всехвашего приложения это класс CMyApplication
.Этот класс может писать в стандартный вывод все, что ему нужно, если это уместно.