代码之家  ›  专栏  ›  技术社区  ›  zekel lepture

为什么我不应该只定义define nsfm[nsfilemanager defaultmanager]而不是每次都写出来?

  •  4
  • zekel lepture  · 技术社区  · 15 年前

    有一个内置的快捷方式nsapp,有什么理由我不应该为nsvillemanager添加一个吗?

    #define NSFM [NSFileManager defaultManager]
    

    我认为省略这将使我的代码更干净,而且我看不出保留它有什么好处。(我计划从现在开始在我的所有项目中进行此项工作,因此不会模糊不清。)

    NSFileManager *fm = [NSFileManager defaultManager] 
    
    3 回复  |  直到 15 年前
        1
  •  5
  •   Barry Wark    15 年前

    为什么不使用局部变量呢?

    NSFileManager *fm = [NSFileManager defaultManager];
    // use fm...
    

    或者更好的是,将文件管理器作为方法参数插入:

    - (void)myMethod {
      //using [NSFileManager defaultManager]
    }
    

    变成

    - (void)myMethodWithFileManager:(NSFileManager*)fm {
     //usin fm
    }
    

    由于DefaultManager是一个单例(实际上是一个全局的),它使得测试非常困难。注入依赖项可以节省您在方法中键入的内容(根据您的需要),并使单元测试更加容易,您可以注入一个测试双精度而不是默认管理器。

    最后,Cocoa和Objective-C通常倾向于使用显式代码而不是短代码。其基本原理是,使用更详细的名称可以使代码更容易阅读(从而便于维护)。这一理念一直延伸到Objective-C的选择器样式,带有交错的命名参数。除非你 真正地 无法处理额外的输入(Xcode的代码完成对您来说不起作用),请使用现有的名称。在罗马的时候…

        2
  •  3
  •   Community CDub    8 年前

    如果它能让你的代码更干净,我完全赞成。请记住,任何其他必须阅读您的代码的开发人员都不会 立即 知道什么 NSFM fm 代表。

    我建议使用更具描述性的名称: NSFileMgr . 对于大多数Cocoa开发人员来说,这将使变量的用途更加清晰,而无需查找它。

    更新: Barry Wark's answer 对于测试方面的一些非常好的观点。

        3
  •  1
  •   cocteau    15 年前

    我每次都会使用一个局部变量,因为使用defaultmanager不是线程安全的。如果在任何时候你开始在你的应用程序中使用线程,你可能最终会发现很难发现的错误,并且直到你运行时才知道为什么。 this bit of documentation .