Сразу оговорюсь, работаю с nodejs но меток наставил больше, так как мне кажется, что разницы нет..
Вот какое дело... До сегодняшнего момента с файловой системой приходилось работать поверхностно, что-то записать, что-то считать. И логика вклинивания файловой системы ( в дальнейшем буду сокращать до fs ) была такова, что создавался класс, который имел ссылку на fs и реализовывал методы write и read. И все было хорошо.
Но сейчас я делаю нечто, что рекурсивно считывает каталог и данные пропускает через множество парсеров, которые модифицирует считанную строку. И логику построения я выбрал точно такую же, но как видно напрасно.
А напрасность заключается вот в чем. После того, как я повторил архитектуру с запихиванием ссылки на fs в один класс и реализовал в нем те же методы write и read, все было так же хорошо, пока не потребовалось проверять в одном из классов-парсере-плагине существование файла.
По всем канонам, плагины, которые у меня парсеры, не могут иметь ссылку на класс, занимающийся записью и чтением..
И целый вечер я ходил кругами и не смог найти ответа. Но потом мне в голову пришла безумная мысль, что я не понимаю, как строят логику в невэб архитектуре.
И после всего сказанного, сформулировать вопрос можно так - можно ли в серверной архитектуре... Или даже - как в серверной архитектуре наиболее правильно связать fs и классы, которые нуждаются в некоторых её методах,
но ссылки иметь не должны?
У меня даже вопрос сформулировать не получается. Чтобы ещё больше объяснить, я добавлю, что в моем понимании, класс должен реализовывать однонаправленное поведенгие, в данном случае, это работа с файлами.
Но так же мне кажется, что если класс парсер-плагин имеет доступ к fs,
то он не может его иметь частично. То есть нельзя же сказать - "вот тебе fs но бери только метод exists, а от остальных отворачивайся". И так же эту теорию подтверждает то, что только один класс должен записывать и считывать, чтобы иметь полный контроль над приложением.
Пока писал подумал о том, что если бы я собирал класс для работы с fs, то он бы реализовывал не один интерфейс и в плагинах бы я бы получал доступ только к тем методам, которые позволены интерфейсом с методом exists.
Но в nodejs интерфейсов нет...
Думаю, что ни какие классы тут не нужны, просто нужно сделать все в стиле API, разбить его на 2 слоя:
Слой доступа к данным (работает с fs и является оберткой, утилитами, позволяющими упростить работу с файлами для следующего более абстрактного слоя), кладем в файл storage.js, структура такая:
Слой обработки данных (парсер и т.д.), кладем в файл 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() {
// и пишем ее на диск
});
}
});