@vasIvas

Как понять принцип работы с файловой системой?

Сразу оговорюсь, работаю с nodejs но меток наставил больше, так как мне кажется, что разницы нет..

Вот какое дело... До сегодняшнего момента с файловой системой приходилось работать поверхностно, что-то записать, что-то считать. И логика вклинивания файловой системы ( в дальнейшем буду сокращать до fs ) была такова, что создавался класс, который имел ссылку на fs и реализовывал методы write и read. И все было хорошо.
Но сейчас я делаю нечто, что рекурсивно считывает каталог и данные пропускает через множество парсеров, которые модифицирует считанную строку. И логику построения я выбрал точно такую же, но как видно напрасно.
А напрасность заключается вот в чем. После того, как я повторил архитектуру с запихиванием ссылки на fs в один класс и реализовал в нем те же методы write и read, все было так же хорошо, пока не потребовалось проверять в одном из классов-парсере-плагине существование файла.
По всем канонам, плагины, которые у меня парсеры, не могут иметь ссылку на класс, занимающийся записью и чтением..
И целый вечер я ходил кругами и не смог найти ответа. Но потом мне в голову пришла безумная мысль, что я не понимаю, как строят логику в невэб архитектуре.

И после всего сказанного, сформулировать вопрос можно так - можно ли в серверной архитектуре... Или даже - как в серверной архитектуре наиболее правильно связать fs и классы, которые нуждаются в некоторых её методах,
но ссылки иметь не должны?

У меня даже вопрос сформулировать не получается. Чтобы ещё больше объяснить, я добавлю, что в моем понимании, класс должен реализовывать однонаправленное поведенгие, в данном случае, это работа с файлами.
Но так же мне кажется, что если класс парсер-плагин имеет доступ к fs,
то он не может его иметь частично. То есть нельзя же сказать - "вот тебе fs но бери только метод exists, а от остальных отворачивайся". И так же эту теорию подтверждает то, что только один класс должен записывать и считывать, чтобы иметь полный контроль над приложением.

Пока писал подумал о том, что если бы я собирал класс для работы с fs, то он бы реализовывал не один интерфейс и в плагинах бы я бы получал доступ только к тем методам, которые позволены интерфейсом с методом exists.
Но в nodejs интерфейсов нет...

Подскажите хоть что-нибудь.
  • Вопрос задан
  • 2289 просмотров
Решения вопроса 1
MarcusAurelius
@MarcusAurelius Куратор тега Node.js
автор Impress Application Server для Node.js
Думаю, что ни какие классы тут не нужны, просто нужно сделать все в стиле API, разбить его на 2 слоя:
  • Слой доступа к данным (работает с fs и является оберткой, утилитами, позволяющими упростить работу с файлами для следующего более абстрактного слоя), кладем в файл storage.js, структура такая:
    var storage = {};
    module.exports = storage;
    storage.read = function(name, callback) {
      ...
      callback(data); // отдаст data или null
    };
    storage.write = function(name, data, callback) {
      ...
      callback(); // без папаметров
    };
    storage.exists = function(name, callback) {
      ...
      callback(exists); // отдаст true/false
    };

  • Слой обработки данных (парсер и т.д.), кладем в файл processing.js - он использует storage.js как зависимость через require:
    var storage = require('storage');
    var processing = {};
    module.exports = processing;
    processing.parse = function(data) {
      ...
      // тут можем парсить и вызывать storage API
      return parsedStructures;
    };


А теперь в коде верхнего уровня используем обе библиотеки:
var storage = require('storage');
var processing = require('processing');
// далее можем использовать оба API storage и processing
storage.exists(name, function(exists) {
  if (exists) {
    // если файл есть, то читаем
    storage.read(name, function(data) {
      // и теперь его парсим
      var matrix = processing.parse(data);
      // делаем что нужно
    });
  } else {
    // если нету, то создаем дэфолтную структуру
    var matrix = { default: "structure" };
    storage.write(name, matrix, function() {
      // и пишем ее на диск
    });
  }
});
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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