Во-первых, я действительно не хотел публиковать этот код на стеке, потому что это действительно небольшой объем кода, написанный за 5 минут.
Я хочу спросить вас, приемлем ли класс (мой первый в c ++), который я написал. Я действительно не видел много кода на C ++, так что я не могу сравнить это ни с чем.
Но я видел некоторые классы, реализующие только объявления функций, внутренняя часть этих функций была написана где-то еще в коде.
Я прошу вас за любые предложения, если что-то не так. И почему они делают, как я описал в пункте выше? Какой стиль кодирования лучше?
class File {
private:
FILE *_handler;
char *_path;
long _size;
void setHandler(char *mode)
{
this->_handler = fopen(this->_path, mode);
}
public:
File(char *path)
{
this->_path = path;
}
size_t read()
{
this->setHandler("r");
char *buffer = (char*) malloc(sizeof(char)*this->_size);
return fread(buffer, 1, this->_size, this->_handler);
}
void write(char *data)
{
this->setHandler("w");
fputs(data, this->_handler);
}
long size()
{
if(! sizeof(this->_size) > 0)
{
fseek(this->_handler, 0, SEEK_END);
this->_size = ftell(this->_handler);
rewind(this->_handler);
}
return this->_size;
}
}; // End File
Здесь есть технические проблемы и то, что я считаю фундаментальными проблемами дизайна.
Технические:
Сколько раз вы открываете файл? Сколько раз вы закрываете один? Посмотрите, что делают read () и write ().
Где обработка ошибок? Что произойдет, если fopen () потерпит неудачу. Никогда не используйте возвращаемые значения без проверки их.
Основные проблемы дизайна:
Вы выделяете память, кто ее освобождает? Обычно плохая идея разделять ответственность за распределение и освобождение. C ++ люди, как правило, используют умные указатели, чтобы помочь с этим.
Что бы сделал ваш код, если бы получился действительно большой файл?
Самое главное: ваш интерфейс — это интерфейс «вы должны помнить это». Что произойдет, если кто-то вызовет read (), не забыв сначала вызвать size ()? Зачем вашему звонящему это делать? Создайте свой интерфейс с целью сделать жизнь вашего абонента простой.
Там нет необходимости использовать this
если нет двусмысленности
File(char *path)
{
_path = path;
}
То же самое с функциями, которые вы можете оставить this
size_t read()
{
setHandler("r");
char *buffer = (char*) malloc(sizeof(char)*_size);
return fread(buffer, 1, _size, _handler);
}
Реализация функций в объявлениях классов имеет свое применение, но это не обязательно (если только не используются шаблоны), вы можете определить свои функции в исходном файле и включить оттуда файл заголовка класса. Это держит реализацию класса отдельно от интерфейса класса.
Представьте, что вы изменили реализацию одной функции в файле заголовка, все файлы, включая этот заголовок, даже если они не используют эту функцию, нуждаются в перекомпиляции.
Поскольку вы используете C ++, вы можете захотеть изучить использование файловых объектов c ++ (fstream, ifstream, ofstream и т. Д.).
И, наконец, я не вижу смысла в обертывании такого файла, если только ваш класс не предоставляет какую-то дополнительную функциональность, все, что вы здесь сделали, это изменили имя функций и создали еще один уровень абстракции, который мало что дает Таблица.