Tag: 软件开发

依赖注入和链接委托调用

可测试的代码很棒。 即使您实际上没有编写任何单元测试,也可以使您的生活更轻松。 您将获得易于维护和重构的模块化结构。 到处都使用单例并不是可测试的代码。 我们经常听到人们对此表示同意,但是随后他们提出了“委托地狱”的论点。 我需要从应用程序的多层一直发送一些数据。 您是否建议我将其注入所有这些对象或使用十二个链接的委托调用? 啊! 好吧,让我们一起看看。 问题: 在这里使用共享实例并不能使我们的代码更具可测试性,清晰性或结构性,但是很容易实现: 解决方案1:共享实例 似乎链委托调用是这里唯一的选择,但是这种解决方案看起来很丑陋。 首先,链接的委托呼叫非常脆弱-您可以轻松地忘记一个。 其次,所有与主题菜单无关的对象现在也知道那里发生了某些事情。 解决方案2:链接的委托呼叫 还有其他解决方案吗? 当然! 现在的问题是,我们正在将构造责任与业务逻辑责任混在一起。 当我们需要一个对象时,我们只需在我们的类中内联实例化它即可。 我们的调用图与实例化图几乎相同。 让我们尝试将它们分开! 想象一下,应用程序下面的某些层需要一个数据库才能工作。 您可以清楚地说明此依赖性,并且您的层会在构造函数中请求数据库。 现在,它上面的一层不会说“我需要一个数据库才能将它传递给下面的层”,而是说“我需要下面的一层”! 上面的层没有关于数据库的线索。 如果您应用中某处的某个对象需要数据库,则并不意味着您需要在整个类层次结构中传递该数据库。 这是这样的: 解决方案3:工厂 最后,如果您还没有看过,请观看MiškoHevery的这场“清洁代码”演讲。

在18个步骤中成为iOS开发人员

苹果的移动操作系统已有10多年的历史了。 如果五年前研究目标C和几个辅助框架就足够了,那么现在很容易被众多选择所震惊。 这就是我决定创建可视手册的主要原因,该手册将: 逐步展示值得学习该主题的方式 给出一个连贯的图片,您可以通过它跟踪进度 我没有目标创建学习iOS开发的唯一真实方法,就像我无意为您选择方法和技巧一样。 我想为您提供最广阔的视野,以便您可以判断建议的方案中哪个更适合解决特定任务,而不是追求通用解决方案或最笨拙的解决方案。 事不宜迟,让我们开始做正事。 在下面,您可以找到有关每个项目的评论,并提供指向所提到的解决方案和资源的链接。 祝好运! 1.选择一种语言 有2个选项:Objective C或Swift。 我建议Swift更现代且易于掌握。 如果您已经有使用另一种类似C语言的经验,Swift对您来说似乎很熟悉。 Swift允许更简洁和更具表现力,以编写更安全的代码。 但是不要将Objective C丢在公共汽车底下。 在任何已经存在数年的项目中,总是会有一部分目标C代码。 所有大公司都有大量的代码,其基础结构和专业知识。 当您熟悉基于Swift的iOS开发的基础知识时,就值得回过头来学习ObjectiveC。 2.安装Xcode 要开始编写和运行代码,您需要一个环境。 Apple对此进行了照顾,并创建了Xcode,其中包括让您感到舒适的所有内容。 Xcode在AppStore中免费分发,要下载Xcode,您需要在developer.apple.com上注册。 这是免费的。 仅当您要将应用程序放置在AppStore中时才需要付费。 JetBrains还有一个付费替代方案-AppCode。 3.边玩边学 为什么要选择Swift的另一个重要点是它使用Xcode内置的Playgrounds工具易于学习的功能。 使用Playgrounds,您可以实时监视代码执行的结果。 苹果还提供处理Swift所需的所有信息。 了解内存如何在Swift中工作,如何防止内存泄漏和循环依赖。 掌握了该语言后,应编写尽可能多的小程序: 记住典型的数据结构:链表,堆栈,二叉树 编写经典算法:二进制搜索,堆排序或动态编程 4.构建您的第一个应用 要开始为iOS开发,您需要学习UIKit。 这是所有iOS应用程序的基础。 在Xcode中创建一个空的iOS应用程序,并开始学习该应用程序的主要组件:UIApplication,AppDelegate,UIViewController,Storyboards等。阅读这些组件中每个组件的内置Xcode文档,直到您习惯了。 当您弄清楚iOS应用程序中的内容时,请开始编写基本示例。 这里有一些想法: 显示朋友列表和有关他们的详细信息。 创建2个屏幕:第一个屏幕将显示一个名称列表,通过单击每个屏幕上的另一个屏幕,显示更多详细信息。 显示从网上下载的几张图片。 使屏幕看起来像标准的“照片”应用。 了解如何从网上下载图片。 通过单击图片,使用“缩放”选项将其完整显示。 5.在会话之间保存数据 到目前为止,您的应用程序像《 Groundhog Day》电影中的主角一样活着。 每次发射对他们来说都是新的。 了解如何保存数据:从UserDefaults开始,然后熟悉Coding协议,然后转到CoreData。 在Realm和Firebase中定居也将很有用。 […]

Swift中的编码

通过利用Swift的语言功能来创建和维护健壮的代码库。 因为您不想在承受提供功能的压力时发现并修复错误。 减少消防时间,增加创新时间。 不变性和可变性 健壮的代码可以很好地处理所有极端情况。 通过支持不变性,我们可以强制排除尽可能多的情况。 因此,使用let关键字声明的变量总是更有利的。 由于变量无法突变,因此我们消除了所有其他情况,从而使运行时的行为更易于推论。 枚举 枚举是我们可以确保对所有案件进行详尽说明的另一种方法。 当使用带有Swift枚举的切换条件时,编译器会强制处理所有可能的情况。 即使不注意,程序员也很难错过任何东西。 依靠快速的编译器将释放更多的认知资源来解决更大的问题。 选装件 不要使用隐式展开。 使用了! 产生nil值的运算符会导致运行时错误。 可选参数的目的是使零大小写对开发人员来说很明显,并将其作为预期或意外的情况处理。 主体类似于错误处理。 我们不应忽略可能的错误,也不应忽略可能的值不可用。 面向协议的编程 组合总是优先于继承。 每当发现需要让多个类型共享相同的行为时,请将它们抽象为协议,然后使用扩展名为该协议定义默认行为。 在下面的示例中,通常将Polygon作为基类,并使用Square和Triangle子类Polygon。 子类化确实可以工作,但是测试很尴尬,因为为继承的方法编写测试用例似乎很愚蠢。 但是,有可能方法被意外覆盖。 对于实现协议的纯快速对象,无法覆盖默认扩展名。 因此,在上述情况下仅测试Polygon扩展就足够了。 此外,通过子类化,sides属性将必须从超类继承。 这意味着该属性必须是可变的,以便子类更改它们。 因此,我们将无法排除我们不想考虑的情况。 而且,子类一次只能继承一个类。 如果您需要对许多不同的抽象建模,则很难将它们分开。 这对协议来说不是问题,因为类型可以实现多个不同的协议。 这些也在这里讨论:https://developer.apple.com/videos/play/wwdc2015/408/ 类型和协议 AnyObject或AnyClass的用法应为红色标记。 Swift的强类型系统是它的最佳功能之一,我们不应该绕过它。 知道函数期望和返回什么类型,将使人们更容易推断其行为。 实际上,我们可以进一步缩小范围,仅定义所需的协议。 考虑将物品从愿望清单移动到购物车的功能。 该协议从专利上明确了该功能的意图和作用。 在上面的示例中,我们知道购物车上仅执行添加操作,而在心愿单中执行删除操作。 这些对象的状态也保留在磁盘上。 而且,这允许我们传入实现上述协议的任何类型,从而减少耦合。 委托模式 在许多情况下,委托模式不是最佳模式。 一个很好的例子来说明这一点,它是iOS8之前的版本中的可可自己的UIAlertView和新的UIAlertController。 使用旧的UIAlertView,您必须像这样实现委托: 当多个UIAlertViews共享同一委托时,事情变得繁琐。 您必须找出哪个UIAlertView触发了委托。 另外,这还会引入代码碎片,其中显示警报视图的代码和处理解雇的代码位于代码库的不同部分。 使用UIAlertController,我们可以传入闭包来处理后续事件。 每个闭包实例将仅与UIAlert的一个实例相关联,没有歧义。 将职能视为头等公民。 […]

Swift中基于属性的测试-使用SwiftCheck

在上一篇文章中,我们描述了一种称为基于属性的测试的测试方法。 我们不用编写示例来测试我们的代码,而是编写输出必须具有的属性。 我们可以继续编写约束该输出的属性,直到我们对我们的软件需要做什么进行准确的说明。 Swift中基于属性的测试—简介 这是Swift进行的基于属性的测试(PBT)系列的第一部分。 在这第一篇文章中,我们将… medium.com 尽管无需任何库就可以执行这种类型的测试,但是有些工具可以帮助我们简化这些任务。 在Swift中,我们可以使用SwiftCheck (一种秉承Haskell的QuickCheck精神的开源库)。 在您的项目中包括SwiftCheck就像使用CocoaPods一样容易。 只需添加pod ‘SwiftCheck’, ‘~> ‘ ,将替换为该库的最新版本。 安装好吊舱,就可以开始了! 使用SwiftCheck编写基于属性的测试 在上一篇文章中,我们使用了String串联示例。 我们可以使用SwiftCheck重写三个基于属性的测试: 让我们分解一下这些测试的结构: 我们必须通过扩展XCTestCase并添加带有test前缀的方法来创建常规的单元test 。 在每个单元测试中,我们创建一个带有String的property ,该property描述我们要测试的内容。 使用运算符<- ,我们调用forAll ,它收到一个闭包。 此闭包接受许多参数,这些参数的类型实现Arbitrary协议。 现在不用担心,该库为我们扩展了基本的Swift类型。 这个闭包的参数将是用于基于属性的测试的随机字符串(在上randomString()文章中,我们是使用randomString()创建的)。 在闭包的主体中,我们执行要测试的方法或函数。 最后,我们不需要编写断言,而是返回Testable表达式。 在我们的例子中,我们从正在执行的比较中返回一个Bool 。 运行这些测试将多次执行我们的闭包。 默认情况下,每个属性都会运行100次,尽管可以增加或减少此数目。 如您所见,使用SwiftCheck编写基于属性的测试非常容易。 在这些系列的最后一篇文章中,我们将展示如何约束这些测试的输入(有时我们可能会对输入类型的某些子集感兴趣)以及如何为我们的自定义类型提供输入。

在iOS中使用Firebase Cloud Messaging进行推送通知

Firebase云消息传递(FCM) Cloud Messaging是Firebase的免费酷功能之一。 将推送通知从服务器发送到FCM很容易,它可以处理iOS,Android和Web的其余部分。 我将在本文中跳过设置。 您可以按照精心编写的设置指南,将Firebase添加到您的项目中。 您可以通过Firebase控制台或应用服务器连接到Firebase Cloud Messaging。 Firebase控制台非常简单,但这是手动工作。 我将在这篇文章中介绍应用服务器。 通过FCM发送通知的方式有三种 。 您可以将通知发送到一个设备或设备组或主题 。 我想向特定用户的所有设备发送通知,并且我不想存储令牌。 在这里,我将跳过仅将通知发送到一种设备的方式。 设备组也用于将一个用户的所有设备分组。 这样,您可以将通知发送到一个用户的所有设备。 因此,它们两个都需要存储令牌。 如果您需要将每个用户的消息发送到多个设备,Firebase建议使用设备组。 但是正如我所说,我不想存储令牌。 因此,我将只关注本文中的主题。 如果您更喜欢存储令牌并进行处理,则可以使用其他两种方式。 什么是主题 ? 主题基于发布/订阅模型。 每个设备可以订阅不同的主题。 服务器向主题发送请求。 FCM处理休息,所有订阅的设备都收到通知。 这样简单而强大的方法。 但是,作为每项服务,它都有优点和缺点。 主题未针对快速交付进行优化。 因此,发送通知和接收通知之间可能会有延迟。 主题针对吞吐量进行了优化。 现实生活场景 我们有一个微服务,当它接收到事件时会创建推送有效载荷。 我们可爱的推送程序不了解客户端设备,也没有任何存储空间。 当基础系统上发生新事件时,它将得到通知。 然后,它将通知发送到移动平台。 我们的推送程序将HTPP请求发送到FCM。 您可以在此处了解有关FCM的服务器实现的更多信息。 我们的基本请求结构如下: https://fcm.googleapis.com/fcm/send 内容类型:application / json 授权:key = SERVER_API_KEY { “ condition”:“主题中的“ condition1”和主题中的“ condition2””, […]

iOS工程师工具包(或如何保持理智)

我曾经使用命令行进行所有操作。 编译,在Vim中编写代码,推送到git –这几乎是您作为iOS工程师所需要做的一切。 没有错。 如果您不遗余力地执行所有这些操作,则将为您提供更多功能,但这不是我的事。 远离命令行的一部分涉及构建我的工具箱。 对于软件工程师来说,有很多选择,其中很多几乎是相同的。 很难在此,那个或另一个之间做出决定。 费力地扭了扭我的噩梦之后,我终于完成了我的工具箱。 这是该列表,无特定顺序。 XCode 嗯是的 XCode。 有99%的iOS工程师选择IDE,这是有充分理由的。 是否希望看到您的应用程序外观的可视化表示形式? 您可以! 想实时运行和调试您的应用? 你做那件事! 是否要使用iPhone必须提供的所有UI元素和高级功能? XCode涵盖了您。 大量的iOS和MacOS文档可以直接在XCode中找到。 您的测试套件,性能和代码分析器,CPU和内存管理-全部都可以下载到7到8 GB。 美丽。 另外,它本身也得到了Apple的大力支持。 当然,它有其陷阱。 我与XCode有爱恨交织的关系。 当它起作用时,它使我高兴地哭泣。 如果不是这样,我的愤怒就符合圣经(例如旧约/希腊神话级别的愤怒)。 吉特·克拉肯 与我一起/见过的许多开发人员在版本控制方面都有不同的看法(管理多个人同时在同一个项目上工作)。 在与Git(较流行的版本控制形式)接口方面,有很多不同的方法可以采用。 我以前在git中使用命令行。 我感觉像是个坏蛋,黑色背景上所有的绿色文字。 是的,我就是那个家伙 。 没事,但是后来我被介绍给Git的GUI界面。 具体来说,我是SALIDO的一位同事向我介绍GitKraken的,而我再也没有回过头。 如果您曾经使用过git客户端,那么它具有您期望的所有功能。 您可以独占(或隔离)存储库中的特定分支。 查看提交历史记录,查看发布标签,启动拉取请求,使用git flow等。 在SALIDO,我们正在更改代码库并几乎不断推出新功能,GitKraken是必不可少的(而且非常漂亮)。 当办公室中的另一位iOS工程师创建合并冲突或清除您的代码时,它可以帮助您避免出现“我会勒死您”的感觉。 你知道你是谁。 Fastlane + CircleCI 现在,这是我所有工具中的圣杯。 如果必须在使用Fastlane + CircleCI进行部署还是在Google文档中编写和测试我的所有代码之间进行选择,那么我会每次都选择Fastlane + CircleCI。 还记得我说过SALIDO不断推出super […]

移动技术主管(iOS)-实施卫生心态

您是否觉得所有项目都应该使开发人员可以轻松地开始工作,而不是在“哦,在运行代码之前,请先执行此工作清单”和“我们应如何管理依赖项”上进行相同的讨论? 这是我较早的文章的第2部分,描述了为获得平稳的工作经验而必须培养的卫生意识。 这篇文章详细介绍了较早的文章,并提供了实际实施“卫生观念”各部分的示例。 此实现基于一个大型iOS应用程序项目,在该项目中我们还拥有一个Android App,因此选择了一些解决方案,以便也可以扩展到Android世界。 使用曲棍球而不是纯TestFlight。 它还假定要支持CI管道。 实作 首先成为一个富有同情心的文明成人-遵循以下简单方法可以 利益相关者确定优先级—敏捷原则或瀑布 敏捷价值观(4)和原则(12)通过在业务利益相关者和开发人员之间建立协作与信任,通过及早且频繁地交付工作软件来确保专注于客户满意度 我们发现Scrum简洁明了,易于解释。 练习它需要纪律。 瀑布可能在服务或维护项目中很有用,也许对位于不同位置和时区的团队而言 开发人员具有大屏幕-iMac屏幕或4K大屏幕 开发人员拥有IDE Xcode(Dev机器上AppStore的最新稳定版本) AppCode(需要许可证) 使用的版本控制系统 Git还因为Xcode附带 许可的GUI工具(如GitUp,Tower),因为我们喜欢成为可视化的人 Github Enterprise,它灌输了代码管理的良好实践 第三方经理的依赖管理器到位 Cocoapods或Carthage,因此对我们的依赖项已被锁定和神奇地管理🙂 Gemfile定义您对fastlane,Cocoapods和其他gem的依赖。 捆绑器使用。 确定要使用的包管理器 Homebrew-用于在macOS机器上安装软件包 Bundler —是一种Ruby宝石,允许您将所有项目的宝石及其版本打包在一个名为Gemfile的文件中。 `bundler`用于打包`gem`依赖,例如`fastlane`和`cocoapods`。 用于项目的Mac Environment设置应该是可发现的并且是自动化的 项目存储库具有引导脚本,用于安装常用的工具链(较小的引导程序) 在Mac上使用密钥进行git设置以进行版本管理 系统软件包管理器(自制软件) Ruby程序包管理器(Bundler) Ruby版本管理器(rbenv) Ruby安装程序(ruby构建) 最新稳定版本的Ruby或使用rbenv安装项目所需的Ruby版本 JavaScript软件包管理器(NPM) 在签出和引导过程之后,Devs&CI应该能够直接在Xcode中构建和运行代码 查看所有Pod来源 检入gitignore或gitmodules(对于子模块) 检入供应商/捆绑软件和供应商/缓存中是否有安装在特定版本的ruby上的gem,以便CI在干净签出后触发“ bundle install local”,并使用用于开发的gem,而不必检查 真相的单一来源-如果Android和iOS应用程序位于同一存储库中,则在存储库中包含配置和内容可确保 一个发行分支就足够了,而不必在每个共享存储库中都创建一个,这使得更容易通过一个发行分支来更新CI上的构建计划。 如果这些公共存储库包含在子模块中,则无需在项目中进行子模块管理 使构建更快 将功能分解为独立的模块,然后将其整合为框架。 Xcode不会一次重新编译框架构建并且不会更改,因此在大型项目中这会加快构建时间。 […]

大型iOS应用程序的最先进架构

介绍 我写了一篇有关将我们的iOS应用程序迁移到框架中以及该应用程序如何从此类工作中受益的文章。 本文将继续进行,并详细介绍迁移后在项目上完成的工作。 我描述了如何将内部开发的框架完美地链接在一起,以及应该遵循哪种模式才能为大型iOS应用程序实现真正的分离架构。 为我的PM记录……一切都在我的“产品空闲时间”中完成了🙂 动机 在我之前讨论的体系结构中,所有事物都属于一个适当的框架,主应用程序目标链接了所有框架,项目结构尽可能地分离,这提出了一个重要问题……将所有事物链接在一起的最佳方法是什么? 最先进的技术是使主应用程序目标(将所有框架链接在一起的应用程序)将责任委派给框架,然后通知框架需求,例如当前正在使用的框架想要呈现属于该框架的ViewController到另一个框架。 然后将通知主应用有关此更改,并显示所需的ViewController。 我希望您可以想象这种方法的所有优点。 首先,我想提一下可重用性,想象一下Facebook发生的情况。 他们的应用程序分为两部分(Facebook,Messenger),采用这种体系结构可以轻松实现这一目标,从而同时支持两个应用程序。 由于所有内容都在一个位置链接到应用程序,因此您也可以轻松地将整个框架/功能取出并链接到多个应用程序。 不用说,在团队中,每个开发人员都可以对某个特定的框架负责,但是在上一篇文章中有更多的责任。 三层架构 在上一篇文章中,我讨论了如何将应用模块化到框架中。 在本文中,我将把我们的项目分为遵循某些严格规则的3个逻辑层,以我们在该文章中所做的工作为基础。 第一层(胶水) 第一层包括我们的主要应用目标。 它具有AppDelegate对象,初始化我们的一些服务,响应通知等等。 除此之外,它还有我们的主要应用程序协调器。 协调员的职责是处理应用程序中的转换。 它从框架功能实例化协调器,并将责任作为其子协调器传递给他们。 儿童协调员将其不负责的行为通知父母(在我们的代码库中为主要应用程序协调员)。 我们之所以将责任从孩子协调员那里转移出去,有很多原因,主要是因为我们不希望一个孩子协调员依赖于另一个孩子协调员,如上图所示。 第二层(功能) 第二层具有我们的所有功能,例如发布项目,管理页面,聊天等。 这些框架中的每个框架都实现自己的协调器,该协调器将在第一层中实例化。 理想情况下,协调员应该是框架之外唯一公开可见的对象。 通过将框架协调器作为唯一可见的对象,我们确保这是与该功能进行交互的唯一方法。 第二层遵循严格的规则,不得链接第二层中的任何其他框架。 这样做的原因是要使功能与其他功能保持脱钩状态,因此可以很容易地将其带入或带出项目。 但是,第二层可以链接第三层的任何框架,并且被第一层链接。 话虽如此,第二层的框架可能需要具有一些共享的依赖关系,例如,功能框架很可能需要访问网络或持久性,这就是第三层的目的。 第三层(核心) 第三层是应用程序的核心,例如模型,网络,持久性,本地化等。第二层的框架由第二层链接,没有任何限制。 但是,与第二层不同,第三层的框架可以相互链接。 要避免在第三层建立这种联系将是极其困难的。 例如,您的网络框架(如持久性框架)将要使用模型框架……您可以想到许多类似的情况。 一种可能的解决方案是创建第四层。 只有第三层的共享框架才在第四层。 这可能是一个很好的解决方案,但是我们发现它有些过分设计。 这是一个工作区外观的示例。 实作 这是一个看起来很幼稚的例子。 在代码中,我使用术语流程代替协调器,因为根据我的观点,它是一个更准确的术语。 让我们从为Flow定义协议开始。 您可以在此处查看完整的演示。 流协议的实现 现在,让我们看一下主要的AppFlow(AppCoordinator)。 主AppFlow 最后,从其中一个框架实施子流程。 协调器模式已为人所知已有一段时间,有很多文档可以激发您的灵感。 我想在这里指出,我已经看到了一些实现,其中协调器接管了模型并正在获取数据或执行其他一些控制器/视图模型作业。 不用说,协调器是为应用程序流而设计的,这就是工作。 […]

为初级移动工程师寻求第一份工作的建议

新的移动工程师经常问我如何找到他们的第一份工作。 事实是:这真的很难。 如果您刚从训练营出来或是自学成才,就没有需求。 几乎没有公开招聘的初级职位。 每个人都想要一个高级工程师(或至少一个具有CS学位的人。) 但这不是不可能的! 这只需要时间,坚韧和精心计划。 不要放弃 我本人的职业生涯非常迷人,没有CS学历。 我实际上来自戏剧世界,这是一件更加残酷的事情。 演员们说:“每个工作都要进行100次试镜。”当您是一名初级工程师时,对您来说也是如此,面试很难。 但是经过1-2年的扎实经验,您需要的面试次数将减少到10次。然后,当您更高级时,您必须关闭LinkedIn通知,您将有很多次面试。提供。 那么,您有什么可以做的来最大化您获得工作的机会? 是! 很多。 多年来,无论是作为一名招聘经理还是一名导师,我都看到很多糟糕的招聘数据包和投资组合。 (而且总是相同的错误。)本文将重点介绍每个人都可以对其简历进行的修复,示例应用程序和代码示例。 将其视为初级移动工程师求职的优化清单。 免责声明:这些是我的意见。 这是我的文章。 它不代表我的雇主或除我以外的任何其他实体的意见。 您需要做所有这些事情吗? 不! 人们没有做我在此列表上所做的任何事情而被录用。 我将为示例应用程序推荐的很多东西实际上都是高级的或利基的,不一定每项工作都需要。 但是,您无法接受“足够”的位置。 您需要使所有其他申请人脱颖而出 。 这些优化将使您的应用程序对更多的招聘经理(最终决定将您加入团队的公司人员)印象更为深刻。 对中级学生也有好的建议吗? 当然。 有意见吗? 阅读免责声明。 适用于Android吗? 当然。 我的职业生涯大部分时间都在iOS和Flutter上,但是这个好东西应该对任何移动工程师都有帮助。 (尽管,我将在此处使用iOS示例。)这会带来工作吗? 没有保证。 我不能给你一份工作甚至领导。 您必须自己完成这项艰苦的工作。 但是,执行所有这些操作,您可能会更轻松。 如果要申请FAANG,这是应该做的吗? 没有。 关于向大型科技公司(以及模仿其正式流程的公司)进行申请的文章已经很多。 作为没有CS学位的人, 您最好的选择是在代理机构和初创公司 (通常比理论知识更重视应用技能的公司)。 如果您想在大公司工作,那是可能的! 我有,我曾经在你的位置。 在这些公司的职业网站上查找有关此信息。 只是知道,这是另外一回事。 好。 关于建议。

Swift中的设计模式:工厂模式

欢迎来到一系列致力于学习设计模式的文章。 尽管许多想法与代码无关,但我们的目标是向您展示如何在Swift中实现它们(在撰写本文时为Swift 3.0)。 每个帖子彼此独立,所有项目代码都可以 在Git上找到 。 传统上,工厂模式是面向对象语言中使用最多的模式之一。 Factory模式的作用是在运行时使用多态为对象分配一个类。 当客户端不知道所需的确切类时使用它。 所有可能的类都从相同的超类扩展(或实现相同的接口),从而为我们提供了许多可供选择的类。 神奇宝贝就是一个容易证明的例子。 入门级神奇宝贝(Bulbasaur,Squirtle和Charmander)都属于神奇宝贝。 他们有共同的特征。 例如,它们必须具有名称,并且必须具有类型。 但是,尽管它们需要名称和类型,但每个神奇宝贝的名称和类型都不同且有所不同。 这在代码中意味着什么,就是我们有一个神奇宝贝超类。 该超类将包含对名称和类型的引用。 然后使用继承,我们继承了共同的特征,并针对我们想要的神奇宝贝专门对其进行了操纵。 我们将构建一个程序,询问用户他们希望他们的入门神奇宝贝是什么,然后将正确的选定数据返回给用户。 以下是UML图中的外观: 码 首先,在Xcode中创建一个新项目。 我们不会在UIKit中碰任何东西,因此创建一个macOS Terminal项目。 首先,我们将创建所有神奇宝贝都将继承的神奇宝贝超类。 它看起来像这样: 接下来,我们将创建每个单独的神奇宝贝。 这些类非常简单。 它们只需要初始化,在初始化期间,我们将设置名称和类型。 这些看起来像这样: 现在我们需要创建实际的工厂类。 这是上演魔术的课。 它将包含一种方法。 我们将为其提供一个字符串,作为回报,它将基于该字符串为我们提供一个神奇宝贝对象。 它看起来像这样: 请注意,由于神奇宝贝可能为nil ,我们需要使用问号将其设置为可选。 将它们放到我们的主类中将如下所示: 我们要求用户选择一个神奇宝贝。 如果存在,则返回正确的神奇宝贝,如果不存在,则向用户显示一条消息。 运行程序。 这是一个示例,如果您为Bulbasaur选择“ B”,您将在终端中看到以下内容: 选择您的首发口袋妖怪​​(B =鼠尾草/ C = man火鸡/ S =松鼠) 乙 您选择了Bulbasaur。 这是草宝可梦 程序以退出代码结束:0 多数民众赞成在工厂模式完成! […]