Интервью Q - Дизайн файловой системы - Обзор

Все,

Недавно мне было предложено в одном из технических интервью написать проект высокого уровня для File Sysem. Мой ответ на вопрос был следующим. Я прошу всех обратить внимание на обзор и сообщить мне, есть ли предложения/улучшения:

  interface BaseFileSystem
{
    /*Basic file/folder attributes are:
      1. File/Folder Size
      2. File/Folder Date created
      3. File/Folder Date Modified
      4. File/Folder permissions - Read, write and execute
      5. File/Folder Owner - Owner of the file who defines permissions for other users
      6. File/Folder Visibility - Hidden or Visible
      7. File/Folder Name 

      Hence each one of the above attributes would have public <return type> get() and public void set<AttributeName>(<variable datatype>) */
}

public class File implements BaseFileSystem
{
       /*The `File` class should implement all of the methods from interface `BaseFilesystem`.
         In addition, it must also implement following specific methods that can only be associated with physical files*/

        public String getFileExtension(){….}

        public void setFileExtension(String value) {….}

        public String[] getAssociatedPrograms(){ …..}

        public void executable(){ …. };
}

public class Folder implements BaseFileSystem
{

      /*The `Folder` class should implement all of the methods from interface `BaseFileSystem`. In addition, it must also implement following specific methods that can only be associated with the physical 'folders'*/

        public BaseFileSystem[] getSubFoldersAndFiles(){ …. }

        public void addSubFolderAndFiles(BaseFileSystem fileObj) { …. }

        public void executable(){throw new UnsupportedOperationException();}
}

Кроме того, будут приветствоваться любые общие указатели на такие вопросы дизайна.

Ответ 1

Есть три основных операции, которые отсутствуют:

  • чтение содержимого файла
  • запись содержимого файла
  • проверка того, является ли BaseFileSystem File или Folder

С другой стороны, есть некоторые операции, которые я не считаю существенными для файловой системы:

  • расширение файла не имеет никакого значения во всех операционных системах. Тогда почему должен существовать метод для его установки и извлечения?
  • связанные программы имеют смысл только в одной компьютерной/os-комбинации. В файловой системе общего назначения программы могут существовать только временно (потому что загружается другая ОС или устройство перемещено). Он должен ИМХО не храниться как часть метаинформации файла из-за разделения проблем.
  • public void executable() кажется неуместным. Но это только предположение, потому что я не знаю, что должен делать этот метод. Если это исполняет исполняемый файл: это должно выполняться операционной системой вручную. Кроме того, в классе Folder не определяется бизнес.

Кроме того, атрибуты, которые вы определили в BaseFileSystem, делают некоторые предположения о требованиях файловой системы. Возможно, ваша простая система разрешений недостаточна или необходимы файловая система и ACL. Возможно, видимость определяется именем файла (например, в UNIX). Вы должны прояснить это заранее.

Ответ 2

Из того, что я знаю о вопросах интервью, вам нужно убедиться, что вы задаете уточняющие вопросы о файловой системе. Скрытая часть такого вопроса заключается в том, чтобы убедиться, что вы тот, кто может идентифицировать двусмысленность. Также выясните, кем могут быть ваши пользователи, поскольку они могут не заботиться о "Date Modified"

Когда я прочитал этот вопрос, я думал о чем-то * nix-based и использовал бы командные строки! Удачи!

Ответ 3

Я не думаю, что имеет смысл просто давать API. Если вы следуете POSIX, API уже предоставлен вам. Разве не имеет смысла описывать модель данных для файловой системы? Например, как вы связываете данные, отслеживаете используемые/свободные блоки, обрабатываете изменения и т.д....

Мне тоже это не понравилось:

Следовательно, каждый из вышеуказанных атрибутов имел бы public get() и public void set() */

Я действительно ненавижу геттеры/сеттеры. Если бы я собирался создать файловую систему, я бы нажал любые метаданные файлов за пределами файловой системы. Вместо этого предоставляйте общий интерфейс для произвольных метаданных. Например, разрешения могут быть неактуальны во встроенной системе, поэтому зачем делать это частью файловой системы?

Удачи!