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

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

Похожие вопросы