Здравствуйте.
Я путаюсь в SOLID, а именно в принципе единственной ответственность (SRP).
Я приведу пример, а вы опишите, пожалуйста, как все таки правильно?
Вот задача:
Реализовать файловую БД типа ключ-значение. БД должна поддерживать четыре CRUD-операции. Один файл - одна таблица.
Вот мысли:
Нужно создать класс "База данных", который реализует CRUD операции. За таблицу БД будет приниматься файл.
Первый вопрос:
Что должно находиться в таком классе, если нужно следовать принципу SRP? CRUD операции (insert, delete, select, update)? Окей, а метод создания таблицы (файла) расписывать в том же классе или для него нужен отдельный класс?
Так же, допустим, файл содержит строки вида:
Ключ:значение
я хочу создать метод, который будет получать ключ этой строки. Этот метод нужен только для работы CRUD методов. Вопрос: если учитывать SRP и что в класс "База данных" входят CRUD методы, нужно ли выносить метод получения ключа в другой класс или нужно и этот метод писать в класс БД?
Так же хотел уточнить SRP для метода. Вот есть insert. Я понял, что он не правильно написан, так как этот метод принимает внутри себя открытый файл, а надо, чтобы файл открывался в самом методе и закрывался там же, так как иначе у нас может просто висеть открытый файл
spoiler , кстати я не совсем понял зачем. Есть какие-то ограничения на открытые файлы?
.
Мне сказали, что если я буду открывать файлы в самом методе, то это не нарушит SRP. А я не понимаю уже, почему не нарушит, ведь теперь у метода ответственность за открытие файл, за закрытие файла, и за поиск строки по ключу. Я запутался. Как правильно-то, если нужно учитывать SRP?
public function insert($file, $key, $value): void
{
$recordKey = '';
while (($line = fgets($file)) !== false) {
$recordKey = KeyValueDatabaseModel::getKey($line);
if ($recordKey == $key) {
break;
}
}
fseek($file, 0, SEEK_END);
if ($recordKey != $key) {
fwrite($file, "$key:$value\n");
} else {
echo "Ключ " . $key . " уже существует в файле</br>";
}
rewind($file);
}