热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

架构思想

0.我前面所说的意思并不是DataCenter交由APIManager管辖。而是有一个业务Manager,这个业务Manager管辖APIManager和DataCenter。1.

0. 我前面所说的意思并不是DataCenter交由APIManager管辖。而是有一个业务Manager,这个业务Manager管辖APIManager和DataCenter。

1. 这里应该没Table什么事儿。

你通过reformer取出来的recordArray里面的所有record,都必须要符合CTPersistanceRecordProtocol。然后你会有一个DataCenter提供一个例如saveWithRecordList的方法,在这个方法里面,DataCenter操作CTPersistanceTable去存数据。由于recordArray中的每一个record都符合CTPersistanceRecordProtocol,因此每个record都可以直接参与Table的操作。

2. 整个需求中你有三个角色:BusinessManager,APIManager,DataCenter。

BusinessManager下辖APIManager,DataCenterManager。

BusinessManager响应Controller的需求去调用APIManager,然后reformer是在BusinessManager里的。在API回调方法中拿着reformer去获得record,在获得record之后,一方面把recordArray交给DataCenter去存储,另一方面将这个recordArray交给Controlle去展示。

你的WorkCirclePublicRecord没必要去继承CTPersistanceRecord,你的WorkCirclePublicRecord可以就是一个View,然后实现CTPersistanceRecordProtocol中的方法,就可以了。

dictionaryRepresentationWithTable:方法是让你返回这个数据在数据库中的记录的dictionary的表达。传进来的table就是告诉你CTPersistance希望你返回的是这个表相关的dictionary记录,因为record有可能merge了多个表。你挑出你这个对象中跟数据库有关的几个property,然后把它组成字典return出来就好了。

objectRepresentationWithDictionary:方法就是在CTPersistance拿到了dictionary表达的数据后,交给record让record去根据这个数据组装自己的方法。你也可以从中挑出你要的数据,赋值给自己的对象。比如挑出textContent赋值给自己的某个label。

setPersistanceValue:forKey:就是CTPersistance有时候会单独取出记录中的某一个Key来赋值,你在这个方法中拿到key之后判断一下,然后给相应的对象赋值即可。如果key是title,那么你就找到你的titleLable,把titleLabel.text赋值为提供给你的value。

mergeRecord:shouldOverride:的意思就是会给你一个record,然后希望你把这个record的值对应赋值给自己,你根据shouldOverride来决定当自己和record的同一个property都不为nil的时候,采用哪一个。

optional中的availableKeyList:方法是当merge两个record的时候,你有可能不希望所有的key都参与merge,那么这个方法就提供你需要参与merge的key的列表。

3. 其实你样例中的这部分代码是多余的。

当APIManager拿到了dictionary的数据之后,直接丢给record的objectRepresentationWithDictionary:方法就可以了,这样record就会根据dictionary的内容组装好自己了。

4. 同上

5. 在2的回答中我已经告诉你协议里的方法都应该如何实现了。

看完文章觉得懂了,其实只是你看懂我写的字了,看懂我说的逻辑了。但没有想明白背后的思想来源,没有想明白为什么是这个逻辑,所以不知道如何下手。要理解背后的思想,只有有足够的经验才能明白,这个没有捷径的。

一个完整的API对应一个Manager,一组API对应一个Service。http://google/login和http://google/logout分别对应两个APIMananger,但是只有一个Service。



1. APIManager只做网络相关的操作,不负责处理业务。reformer只负责做数据转化,也不算很涉及业务,主要是要跟view的需求做匹配。

如果涉及storage,那这些是交给Controller去调度的。举个例子,API回来的数据要存本地。那么这个场景在我的设计下应该是这样一个过程:

a. controller命令APIManager获取API数据,回调方法在controller内
b. API调用成功,此时走到Controller内部的回调方法,这时候Controller拿着reformer去问APIManager要数据。
c. 数据经过reformer的清洗:格式修改、空数据筛除、脏数据筛除等,得到一个可以直接用于本地化存储的对象。
d. controller拿着APIManager使用reformer吐出之后的对象,交给StorageMananger,完成本地持久化。

2. reformer其实是跟具体哪个view是不相关的。经过reformer得到的数据不光可以被一种View渲染,也可以被其他View渲染。Controller在其中的角色就是,controller知道自己管辖的那个View能够使用哪种类型的数据,然后controller再根据这个去选择合适的reformer(如果没有找到合适的reformer,那就自己写一个咯),把可以直接被那个view使用的数据交给view。

所以,reformer吐出来的数据的key,是要跟着reformer走的,不适合放到ViewController里面去,因为reformer决定了数据输出是什么样的,controller根据数据输出的样子去选择reformer。

3. 转变成model之后的数据,有的时候能保证直接被view使用,有的时候不能保证直接被view使用,比如附近房源列表API返回来的数据如果要在MKMapView上展示,就只能使用MKAnnotation,model是不能直接使用的。这是其一。

API返回的数据不一定都是标准的,但会有不同来源的数据需要同一个view来渲染的情况,如果采用model,就会导致代码混乱。举个例子:租房列表API、新房列表API、二手房列表API,他们返回的数据格式是很有可能不一样的,因为在服务端他们就不处在同一个表,比如房子的名字一个叫name,一个叫houseName,一个叫propertyName。然而在iOS客户端,展现他们的UI却是相同的,只需要一个UITableView。如果用这些库转变成model,做这样的需求就很蛋疼。这是其二

当你做迁移的时候,如果是model代码实体,你不能保证其他人在创建这个model的时候,以及后面维护这个model的时候不去包含其他的代码。一旦有这种情况,迁移起来就很蛋疼。用reformer就消除了model这一层,而reformer是属于非常独立的对象,迁移的时候非常方便。这是其三。

4. 其实还是集约型还是离散型的问题。

我这边是希望一个APIMananger对应单独的一个API。如果App需要的API数量非常多,APIMananger的数量也会多,这是合理的。比如你接下来要开发pad版app,pad版不需要phone那么多API,你只要挑几个APIMananger扔过去就可以了,维护起来还是很方便的。

另外,如果你要针对单独的某个API做拦截器的操作,集约型的就很难做了。数量不怕多,整齐就可以了。离散型API的调用方式虽然也有缺点,但是相对而言,还是较集约型API调用方式为优。

5. 哈哈,我要睡午觉了,回头晚点我再帮你看看~


推荐阅读
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • MVC设计模式的介绍和演化过程
    本文介绍了MVC设计模式的基本概念和原理,以及在实际项目中的演化过程。通过分离视图、模型和控制器,实现了代码的解耦和重用,提高了项目的可维护性和可扩展性。详细讲解了分离视图、分离模型和分离控制器的具体步骤和规则,以及它们在项目中的应用。同时,还介绍了基础模型的封装和控制器的命名规则。该文章适合对MVC设计模式感兴趣的读者阅读和学习。 ... [详细]
  • 本文介绍了MVP架构模式及其在国庆技术博客中的应用。MVP架构模式是一种演变自MVC架构的新模式,其中View和Model之间的通信通过Presenter进行。相比MVC架构,MVP架构将交互逻辑放在Presenter内部,而View直接从Model中读取数据而不是通过Controller。本文还探讨了MVP架构在国庆技术博客中的具体应用。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
author-avatar
mobiledu2502898543
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有