问题 采访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();}
}

此外,非常感谢任何关于此类设计问题的一般指示。


5963
2018-04-01 05:03


起源



答案:


缺少三项基本操作:

  • 读取文件的内容
  • 写一个文件的内容
  • 测试是否一个 BaseFileSystem 是一个 File 或者a Folder

另一方面,有些操作我认为对文件系统不重要:

  • 文件扩展名在所有操作系统中都没有任何意义。那么为什么要设置和检索它的方法呢?
  • 相关程序仅在单个计算机/ os组合中具有含义。在通用文件系统中,程序可能只是暂时存在(因为引导了不同的操作系统或移动了设备)。由于关注点的分离,IMHO不应该作为文件的元信息的一部分存储。
  • public void executable() 似乎不合适。但这只是猜测,因为我不知道这种方法应该做什么。如果这执行可执行文件:应由操作系统手动完成。此外,它没有在类Folder中定义业务。

此外,您定义的属性 BaseFileSystem 对文件系统的要求做一些假设。也许您的简单权限系统不够,或者需要文件系统和ACL的目的。可能的可见性取决于文件的名称(如在UNIX中)。你应该事先澄清一下。


9
2018-04-01 05:36



你是对的。 read 和 write是我在解决方案中遗漏的基本功能。关于与文件扩展名相关的程序,为什么你认为它不应该是文件系统的一部分?从某种意义上说,你在哪里看到逻辑拟合?如果我有一个与之关联的n个程序的文件,我认为该文件负责告诉O.S O.S可以使用哪些程序来读取文件中的数据。 - name_masked
正如Oswald所说,用户A可以将文件与程序X,用户B与程序Y相关联。此外,在大多数操作系统中,您不会将程序与特定文件相关联,而是与特定类型的文件相关联(由文件扩展名确定,某些文件的属性或其他)。 - Jirka
在BaseFileSystem或文件夹上是否需要“路径”? - user3795309


答案:


缺少三项基本操作:

  • 读取文件的内容
  • 写一个文件的内容
  • 测试是否一个 BaseFileSystem 是一个 File 或者a Folder

另一方面,有些操作我认为对文件系统不重要:

  • 文件扩展名在所有操作系统中都没有任何意义。那么为什么要设置和检索它的方法呢?
  • 相关程序仅在单个计算机/ os组合中具有含义。在通用文件系统中,程序可能只是暂时存在(因为引导了不同的操作系统或移动了设备)。由于关注点的分离,IMHO不应该作为文件的元信息的一部分存储。
  • public void executable() 似乎不合适。但这只是猜测,因为我不知道这种方法应该做什么。如果这执行可执行文件:应由操作系统手动完成。此外,它没有在类Folder中定义业务。

此外,您定义的属性 BaseFileSystem 对文件系统的要求做一些假设。也许您的简单权限系统不够,或者需要文件系统和ACL的目的。可能的可见性取决于文件的名称(如在UNIX中)。你应该事先澄清一下。


9
2018-04-01 05:36



你是对的。 read 和 write是我在解决方案中遗漏的基本功能。关于与文件扩展名相关的程序,为什么你认为它不应该是文件系统的一部分?从某种意义上说,你在哪里看到逻辑拟合?如果我有一个与之关联的n个程序的文件,我认为该文件负责告诉O.S O.S可以使用哪些程序来读取文件中的数据。 - name_masked
正如Oswald所说,用户A可以将文件与程序X,用户B与程序Y相关联。此外,在大多数操作系统中,您不会将程序与特定文件相关联,而是与特定类型的文件相关联(由文件扩展名确定,某些文件的属性或其他)。 - Jirka
在BaseFileSystem或文件夹上是否需要“路径”? - user3795309


根据我对面试问题的了解,您需要确保要求澄清有关文件系统的问题。这样一个问题的隐藏部分是确保你是一个可以识别歧义的人。同时找出您的用户可能是谁,因为他们可能不关心“修改日期”

当我读到这个问题时,我正在考虑基于* nix的东西,并会使用命令行!祝你好运!


1
2018-04-01 05:08



好吧,我不得不以电子方式提交答案。所以我不得不承担一些功能,而且从来没有机会来回讨论。因此我在这里问过它!谢谢回复 - name_masked
对不起,我不同意你关于“修改日期”的功能。最重要的是,这段代码不是基于UI的,因此我不确定为什么我需要了解观众。我会在设计UI而不是文件系统时这样做。 - name_masked
是的,我不是说标题修改日期应该被排除在外。我的主要亮点是确保你要求澄清问题=] - Matthew Chan


我认为只提供一个API是不合理的。如果您关注POSIX,则已经为您提供了API。描述文件系统的数据模型不是更有意义吗?例如,如何链接数据,跟踪已用/空闲块,处理修改等...

我也不喜欢这样:

因此,上述每个属性都有public get()和public void set()* /

我真的讨厌吸气鬼/二传手。如果我要设计一个文件系统,我会将任何文件元数据推送到文件系统之外。而是为任意元数据提供通用接口。例如,权限可能与嵌入式系统无关,那么为什么要将其作为文件系统的一部分呢?

祝你好运!


1
2018-04-11 09:00