代码之家  ›  专栏  ›  技术社区  ›  Tai Squared

在Xcode中组织iPhone MVC代码的标准方法是什么?

  •  16
  • Tai Squared  · 技术社区  · 15 年前

    我有一个iPhone应用程序,它包含几个视图及其关联的控制器。查看示例代码,我看到了组织这些文件的不同方法——要么对所有视图进行分组,然后对所有控制器进行分组,要么按功能对视图和控制器进行分组。

    选项1-视图和控制器分开分组

    -Views
      |
      - EditItemView.h
      - EditItemView.m
      - AddItemView.h
      - AddItemView.m
    
    -Controllers
      |
      - EditItemViewController.h
      - EditItemViewController.m
      - AddItemViewController.h
      - AddItemViewController.m
    

    选项2-按功能分组的项目

    -AddItem
      |
      - AddItemViewController.h
      - AddItemViewController.m
      - AddItemView.h
      - AddItemView.m
    
    -EditItem
      |
      - EditItemViewController.h
      - EditItemViewController.m
      - EditItemView.h
      - EditItemView.m
    

    从MVC的角度来看,选项1似乎更有意义——代码被分组在一起,但我想知道,随着应用程序发展到10+个视图和控制器,这是最合理和可维护的吗?是否有关于这方面的最佳实践建议?目前,我将是唯一一个维护应用程序的人,但无论是否会有多个开发人员,我都希望尽可能多地使用最佳实践。这方面是否有公开的标准?

    7 回复  |  直到 9 年前
        1
  •  18
  •   James Eichele Bernard Igiri    15 年前

    我正在做一个大型的Xcode项目。它不适用于iPhone,但我认为这对于文件结构布局并不重要。)

    我从选项1开始,后来当文件数量增加时,我转到类似选项2的位置。我倾向于按“接口”对事物进行分组,即与应用程序中特定功能领域相关联的所有源,然后根据需要为更大的部分创建子组。

    就命名而言,我更喜欢使用尽可能少的类名real-estate来标识模型、视图和控制器,因此我的类名看起来类似于:

    AM_DillPickle  // model class
    AV_Sasquatch   // view class
    AC_DirtBike    // controller class
    

    这仍然允许快速的目视检查以查看类的类型(m、v或c),但它为名称的描述性部分留出了更多的空间。

    我还发现指定一些不适合MVC模式的类很有用( 喘息 !):

    AU_Helper     // utility class (text formatting, high-level math, etc.)
    AD_Widget     // device class  (used to represent hardware drivers)
    

    无论如何,这已经比你要求的更多了,但是我发现命名问题与布局问题相关,因为真正的问题是: 为一个大型Xcode项目组织代码的最佳方法是什么?

    希望它有帮助。以下是所有这些元素组合在一起时的外观:

    [+] Project
        [-] Target One
        [+] Target Two
            [-] Preferences
            [-] Login
            [+] Main Window
                # MainWindow.XIB
                # AC_MainWindow.h
                # AC_MainWindow.m
                # AC_DisplayScreen.h
                # AC_DisplayScreen.m
                [-] Home Screen
                    # HomeScreen.XIB
                    # AC_HomeScreen.h
                    # AC_HomeScreen.m
                    # AV_FancyDisplay.h
                    # AV_FancyDisplay.m
                [+] Widget Screen
                [+] Other Screen
    
        2
  •  4
  •   Kendall Helmstetter Gelner    15 年前

    第二个选项随着项目的增长变得更有意义。

    此外,默认项目将XIB文件放入“资源”中,但随着项目的增长,将相关文件移到逻辑组中以实现某些屏幕或其他功能更加合理。

    举例来说,一种分组安排是:

    3rdParty (for something like regex)
    Utilities (for category additions to classes like UITableViewCell)
    Tab1Classes
    --Screen1
    --Screen2
    Tab2Classes
    Tab3Classes
    Data (for holding plists or other data you may want to load during an app run)
    Resources (still here for random images it makes sense to keep central)
    

    应用委托可以挂在实用程序中,或者可能只是浮在类下所有这些组的上面。

        3
  •  1
  •   Tony Eichelberger    15 年前

    有时候最好的做法是做对你来说最有意义的事情。我个人喜欢按功能分组,但是如果您不考虑有意义的名称,并且在名称不再描述功能时重构名称,这两种方式都会变得不方便。

        4
  •  1
  •   mmc    15 年前

    我不知道Xcode中有一个标准的组织,特别是因为IDE中的项目组织通常不转换为磁盘上的文件组织。

    也就是说,我通常会做一些类似于你的选项1的事情,没有什么比这更像Rails中的文件夹结构更好的原因了,这是我开始处理iPhone时最习惯的。

        5
  •  1
  •   Alvin George    9 年前

    标准Xcode MVC文件夹结构如下。

    1. coredata:包含数据模型和实体类。

    2. 扩展:包含一个类(默认的Apple类扩展+项目类扩展)。

    3. 助手:包含第三方类/框架(如swrevealController)+桥接类(如基于swift的项目中的obj c类)

    4. 模型:生成用于保存数据的单例类(例如appmodel-nsarray、nsdictionary、string等)。Web服务响应解析和存储数据也在这里完成。

    5. 服务:包含Web服务进程(如登录验证、HTTP请求/响应)

    6. 视图:包含故事板、launchscreen.xib和视图类。创建子文件夹单元格-包含uiTableViewCell、uiCollectionView单元格等。

    7. 控制器:包含与uielements相关的逻辑或代码(例如uibutton_的引用+单击操作)

    参考:

    https://github.com/futurice/ios-good-practices#common-libraries http://akosma.com/2009/07/28/code-organization-in-xcode-projects/

    注意:我提到了AppModel和AppController类(它们是像AppDelegate这样的单例类)

        6
  •  0
  •   Li Fumin    15 年前

    选项2对我来说更有意义。想想看,当你编码的时候,你总是在“视图”及其控制器周围编辑,选项2让你以最有效的方式找到合适的文件。

        7
  •  0
  •   Sakthimuthiah    11 年前

    请参考以下链接。希望它有帮助!

    http://akosma.com/2009/07/28/code-organization-in-xcode-projects/ (请注意此链接中的“结论结构”-此链接末尾)