Написание уроков — хорошая практика

Во-первых, я действительно не хотел публиковать этот код на стеке, потому что это действительно небольшой объем кода, написанный за 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

0

Решение

Здесь есть технические проблемы и то, что я считаю фундаментальными проблемами дизайна.

Технические:

Сколько раз вы открываете файл? Сколько раз вы закрываете один? Посмотрите, что делают read () и write ().

Где обработка ошибок? Что произойдет, если fopen () потерпит неудачу. Никогда не используйте возвращаемые значения без проверки их.

Основные проблемы дизайна:

Вы выделяете память, кто ее освобождает? Обычно плохая идея разделять ответственность за распределение и освобождение. C ++ люди, как правило, используют умные указатели, чтобы помочь с этим.

Что бы сделал ваш код, если бы получился действительно большой файл?

Самое главное: ваш интерфейс — это интерфейс «вы должны помнить это». Что произойдет, если кто-то вызовет read (), не забыв сначала вызвать size ()? Зачем вашему звонящему это делать? Создайте свой интерфейс с целью сделать жизнь вашего абонента простой.

7

Другие решения

Там нет необходимости использовать 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 и т. Д.).

И, наконец, я не вижу смысла в обертывании такого файла, если только ваш класс не предоставляет какую-то дополнительную функциональность, все, что вы здесь сделали, это изменили имя функций и создали еще один уровень абстракции, который мало что дает Таблица.

3