@ant123455432143

Объясните, пожалуйста, что такое SRP (SOLID) на приведенном примере?

Здравствуйте.
Я путаюсь в 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);
}
  • Вопрос задан
  • 158 просмотров
Пригласить эксперта
Ответы на вопрос 1
Adamos
@Adamos
Ваш класс БД будет работать с таблицами. Зачем ему лезть в файлы? Его задача (и единственная ответственность) - прослойка между кодом, который обращается к БД, и кодом, который реализует хранение. Не нужно в него совать куски ни из того, ни из другого.
Сделайте таблицу отдельным классом, который принимает имя файла в конструкторе. В нем уже читайте и пишите данные в файл.
Сделайте фабрику, которая по имени файла выдает класс таблицы-файла либо создает его, проверяя наличие такого имени в системе и инкапсулируя в себе ВСЮ логику имен файлов, путей и проч. Классу БД об этом знать незачем, классу таблицы - тем более.
В общем, делите код на то, что надо сделать вот здесь на этом уровне логики, и выкидывайте из него все, что требует опуститься на уровень ниже, в соответствующие классы. И работайте только с их методами, не вникая в реализацию. Не размазываете реализацию конкретных вещей по коду - собирайте ее в одно место, и пусть за нее отвечает только один класс.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽