草庐IT

ios - MVC 设计模式 iOS 中的项目结构

coder 2023-09-07 原文

首先,我很了解 MVC 并且一直在项目中使用它,但是当涉及到组织类和那里的角色时,我有点不确定是否有正确的实现。让我们来看一个场景:

将显示所有员工和部门的示例。数据将从 Web 服务 (Json) 中获取,并将存储为离线(核心数据)。

所以 MVC 模式将是:

  1. View 将成为我的 Storyboard,其中包含 Employee 和 Department UIViewController。
  2. Controller 将是 EmployeeViewController.swift 和 DepartmentViewController.swift
  3. 模型将是 Employee.swift 和 Department.swift

    class Employee: NSObject {
        var name: String?
    }
    
    class Department: NSObject {
        var departmentName: String?
    }
    
    1. 将调用 Web 服务的 ServiceManager。

    2. ParseData 将解析 Web 服务响应并将其转换为 Employee 和 Department 对象

    3. CoreDataManager 是单例类,用于管理离线数据库上的 CRUD 操作。

以下是我对上述场景的一系列问题:

  1. 我的理解正确吗?我尝试构建的结构是否遵循正确的 MVC?
  2. Controller 将如何与这些组件(服务管理器、ParseData、CoreDataManager)交互。是否应该有另一个类来促进 Controller 和数据管理之间的通信(如果 Controller 这样做,那么它将是一个紧耦合的结构并且也是巨大的)。
  3. 模型是否应该有除属性和初始化方法之外的任何代码,因为我看到的大多数模型只有属性声明?
  4. 是否应该使用单独的 UIView 类而不是 Storyboard来创建合适的 MVC 结构?

最佳答案

Is my understanding correct? Is the structure which i am trying to build follows proper MVC?

首先我会说“合适的”MVC 取决于您问的是谁。它的起源通常归因于Trygve Reenskaug当他在 70 年代将其引入 Smalltalk 时。然而,他的 MVC 类型与当今最常用的臃肿版本有很大不同。关于 MVC 的现代思考方式是

  • 模型 = 主要是一个主要封装数据的哑类
  • View = 我们在屏幕上显示的任何内容
  • Controller = 几乎可以做所有事情的一大块代码, 有时由一两类经理分担

但是,Reenskaug 会有一个模型、一个 View 和一个按钮 Controller 。为了一个标签。对于一个字段。我并不是说那是我们应该争取的,但应该有比使用Massive ViewController 模式(在 iOS 社区中被戏称为)。

幸运的是,有。

Uncle Bob正在讲道Clean Architecture .这有几种实现方式,许多人已经为 iOS 制作了自己的实现方式,例如 VIPER。和 Clean Swift .

How the controller will interact with these components (Service Manager, ParseData, CoreDataManager). Should there be another class which will facilitate the communication between controller and data management(if controller does this then it will a tightly-coupled structure and massive as well).

遵循简洁架构的原则,您应该将这些功能封装到层中,这样您不仅可以将代码拆分为多个组件,还可以在需要时用其他组件替换它们。 (但是,是的,至少要避免将所有这些都放在你的 Controller 中!)

Should Model be having any code other then property and initialization method as most of the model which i have seen only have property declaration?

同样,这里没有单一的答案。一些“真正的”OOP 的支持者会说每个对象都应该是自服务的(即模型对象应该知道如何持久化自己),而其他人则将此类操作的知识提取到“管理器”中。将代码用于将对象持久化到对象中可能意味着将持久化功能散布到许多对象中,或者需要您依赖子类化或其他解决方案来避免这种耦合。

Should there be separate UIView classes instead of storyboard to create a proper MVC structure?

Storyboard 与否并不能确定您是否在使用“正确的”MVC。此外,您选择哪种类(UIView 或 UIViewController)来表示 View 也不重要。您的 ViewController 可以简化到不包含任何逻辑的程度(将它确实具有的逻辑转发给另一个类,即 VIPER 中的 Presenter)。

我会推荐阅读有关 Clean Architecture 的内容,也许还可以观看 video of Uncle Bob explaining it ,读别人的reports on implementing it ,然后考虑 MVC 是否是您的 iOS 项目的正确模式。

关于ios - MVC 设计模式 iOS 中的项目结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37192447/

有关ios - MVC 设计模式 iOS 中的项目结构的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  3. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  4. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  5. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  6. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  7. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  8. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  9. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  10. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

随机推荐