Проблема проектирования языкового барьера PHP

Фон

Мне нужно разработать набор служебных классов, которые облегчат доступ файловой системы к нескольким типам удаленных служб (локальный, FTP, WebDAV, SVN, SSH), и я не могу получить «идеальный» дизайн в основном из-за языка барьер - я чувствую, что все пути проектирования, которые я выбрал, были очищены, потому что PHP не имел поддержки определенной функции.

Я нахожу это расстраивающим, и у меня нет идей.

Требования

Базовый абстрактный класс или интерфейс для FileSystem, который наследует любой другой тип файловой системы. Класс FileSystem (и его подклассы) — это «драйвер», который реализует базовые операции FS, такие как «перемещение», «удаление», «создание» и т. д.

Эти операции драйвера не должны быть доступны пользователю класса, вместо этого FileSystem также является фабрикой, которая извлекает записи информации о файле по запросу.

Файл также основан на абстрактном классе или интерфейсе File и Directory, которые разработчики подкласса FileSystem могут или не могут подклассировать. Пользователи класса FileSystem не «заботятся» о типе File (SshFile и SvnFile должны работать одинаково).

Класс FileDirectory) должен каким-то образом взаимодействовать с драйвером файловой системы, создавшим его, при этом пользователь не сможет сделать это вручную через драйвер FileSystem.

Что я пробовал

Естественно, я сделал FileSystem абстрактным классом, затем приступил к кодированию класса File и оказалось, что PHP не поддерживает friend, поэтому File не может иметь доступа к защищенным методам драйвера FileSystem.

Другая идея, которая была отвергнута, заключалась в том, что класс внутри класса — FileSystem и FileSystem::File — PHP не имеет вложенных классов.

Разделите FileSystem на FileSystemDriver и FileSystemFactory, но это приведет меня к той же исходной проблеме.

300 очков репутации в награду за голову

Решателю оригинальной идеи в отсутствие в PHP программных утилит, необходимых для инкапсуляции.


person LiraNuna    schedule 21.11.2009    source источник
comment
Подождите, почему я не могу назначить награду?   -  person LiraNuna    schedule 21.11.2009
comment
@LiraNuna: лол. Вы должны подождать несколько дней.   -  person Crescent Fresh    schedule 21.11.2009
comment
Дратс. Я все равно предложу награду, а затем выберу лучший ответ, если он появится раньше.   -  person LiraNuna    schedule 21.11.2009


Ответы (2)


Почему вы не можете отделить FileSystemDriver от FileSystem? Например:

class SSHFileSystem {   
    private $driver = new SSHDriver();

    function getFile($path)
    {
        return new SSHFile($this->driver, $path);
    }
}
person Tom Dalling    schedule 21.11.2009
comment
Поскольку пользователь может создать экземпляр SSHDriver. Я не хочу, чтобы это использовалось. File должен быть интерфейсом программиста, а не файловой системой/драйвером. - person LiraNuna; 21.11.2009
comment
Я понимаю. По моему опыту работы с PHP, единственный способ обойти это — документировать класс чем-то вроде this class is private, use class XYZ. Вам просто нужно надеяться, что другие разработчики будут следовать документации. - person Tom Dalling; 21.11.2009

Проблема с документацией, а не с кодом.

Оставьте методы файловой системы общедоступными, но задокументируйте, что они должны использоваться только внутренними объектами файлов и каталогов.

Это очень распространено в языках. В Python есть магические методы или нотация _function и т.д.

Если я пользователь, я не просто смотрю на каждый доступный метод и начинаю использовать его, если это звучит весело, я читаю документы и делаю то, что они говорят.

person Paul Tarjan    schedule 21.11.2009
comment
К сожалению, игнорирование (или документирование) проблемы не решит ее. - person LiraNuna; 23.11.2009
comment
На самом деле это не проблема, пока кто-нибудь не проникнет внутрь и не осквернит частные занятия. Если вы пытаетесь заставить плохих программистов стать хорошими, то вы ведете битву, в которой не можете победить. - person Tom Dalling; 23.11.2009