Tag: oop

面向协议的编程:一种快速的OOP头痛解决方案

为什么OOP如此受欢迎? 面向对象编程(OOP)是数十年来编写模块化代码的经典策略,并且有充分的理由。 可重用性:编写良好的对象是可以插入其他程序的独立实体。 如果实现了优化的树,则可以在现有项目的任何部分或全新的树中使用它,而无需编写更多代码。 跳过细节 :另一个程序员不需要知道您对象的实现。 如果看到“排序”功能,则可以使用而不必担心代码是什么样。 防错 :我们可以隐藏对类中函数或变量的访问,以防止其他不熟悉我们代码的开发人员创建错误。 其他人只会看到他们需要看的东西。 使大型项目易于管理:大型 项目变得复杂。 OOP使我们可以将一个大问题分解为一些子问题-每个子问题都由不同的对象处理。 如果Nabil,Julia和Alex正在制作太空侵略者游戏。 纳比尔(Nabil)可以建立一个代表外星人的对象,朱莉娅(Julia)可以建立一个GameBoard对象,该对象可以跟踪我的得分,生命数以及游戏开始/结束的时间,而亚历克斯(Alex)可以创建代表我的坦克及其导弹的对象。 最后,我们将这些对象组合在一起,以构建功能强大的游戏。 更新代码:使用模块化代码,随着时间的推移,我们可以轻松编写添加,更新或删除特定组件的代码。 例如,在用砖建造的建筑物中,您可以用新砖替换掉破裂的砖,而不必替换建筑物的整个部分。 与旧同在 虽然非常方便,但是OOP附带了很多问题: Massive View Controller,“ GOD”对象 :为了保持模块化,程序员使用一种类别,一种目的的主体。 但是,view肿的viewController和模型是流行的快速设计模式(MVC,MVVM)的常见副产品。 传递大块的对象会减慢您的代码的速度,并在构建时使模块化变得困难。 如果一个对象拥有您所需的太多功能,那么您编写的新代码也将最终取决于该对象。 多重所有权:假设您和一位工程师(Nick)正在使用引用同一BankAccount对象的单独ViewController。 如果您在firstViewController中添加功劳,而Nick在secondViewController中删除功劳,则两个人最终都会得到意外的结果。 类是通过引用传递的,因此,在项目的一个区域中更改值将导致该对象的值在所有其他位置均发生更改。 这使得很难测试功能对给定对象的隔离效果。 子类问题:如此之大的问题应有其自己的部分

鸡问题(面向协议的编程)

大家好 在本文上,我们来讨论协议扩展和面向协议的编程(POP)。 关于这个主题有很多讨论,Swift协议扩展和多重继承之间有很多比较。 因此,让我们讨论两者之间的区别以及POP听起来为什么更可靠的原因。 鸡问题 我喜欢用这个例子来说明一个小问题如何变成大规模开发和实际应用。 首先让我们看一下问题,然后再讨论。 想象一下我们需要构造鸟类的“对象/实体”的应用程序。 乍一看,我们将拥有Perrots,Sparrows和Falcons。 现在,让我们为此创建一个漂亮而智能的代码。 OOP和多重继承 所有这些鸟类共享许多东西,例如“喙”,“羽毛”,并且它们都可以“飞行”。 因此,让我们考虑以下Birds App的体系结构。 看起来很棒! 在这一点上,我们作为开发人员对我们的创作感到非常自豪。 它干净,可靠,我们只编写了一次代码,只是“ fly”方法的一种实现,这是一种非常复杂的算法。 现在,我们制作了该产品的版本1 。 此时,客户(Bird应用程序的所有者)说:“嘿,您知道吗,我注意到我的客户也希望拥有Chicken,所以请向此应用程序中添加Chickens,一旦您将它变得非常简单告诉我您有一个非常灵活的体系结构与OOP一起使用” 好的,这很容易……鸡是鸟,所以它将成为鸟的一个子类……但是等等……鸡不能飞! 因此,在这一点上,我是否需要重写此“ fly()”方法,并从“ Bird”中取消我所有漂亮的算法? 等等,这样做不仅是在重写代码,但是如果我心爱的客户决定明天他将发明一种新型的能飞的超级鸡肉,我该怎么办? 将“鸡”否定为“ fly()”的新“鸡”子类? 如果我的客户决定将应用程序移至南极并创建企鹅? 企鹅没有羽毛! OMG…我刚刚意识到我的整个体系结构对我的客户来说不够灵活! 我应该改变它吗? 我应该重写我的整个应用程序吗? 提出V2? 我应该更换我的客户吗? 我是否应该换一个鸟类完美的星球,它们都具有相同的特征? 好吧好吧让我们冷静一下 让我们尝试考虑可能的解决方案,毕竟,OOP很棒,并且确实可以反映现实世界的复杂性。 好吧,不完全是。 我们可以尝试使用OOP解决方案来奋斗。 我不会深入探讨我们可以尝试的失败解决方案: 创建两个基类:“鸟”和“飞鸟”(失败:如果客户决定购买飞机怎么办?) 使用协议/接口定义飞行方法(失败:重写很多代码) 将“ fly()”定义为接收可以飞行的对象的静态方法(失败:如果我有数百万个飞行对象怎么办?并发,多线程) 我与数百名不同的开发人员进行了此练习,让他们尝试许多解决方案。 简而言之,在OOP中解决此问题的唯一可能解决方案是使用多重继承,但是众所周知,这很危险。 只有很少的编程语言允许这种功能,并且在其自身的实现中有许多警告。 Pearl和Python使用一个有序列表进行多重继承,Java 8尝试使用编译器来避免错误,C ++实际上是真正在其完整扩展中真正实现多重继承的唯一语言之一。 因此,如果您不想仅在应用程序中创建C ++模块来解决该问题,就让我们现在尝试使用Swift功能来解决Chicken Chicken问题。 Swift […]

教程设计模式— OOP的功能(第2部分)

先决条件—本博客系列需要具有面向对象编程的中级专业知识。 您应该具有有关类,对象,构造函数,继承,值和引用类型的基本知识。 通过从头到尾阅读本系列文章,中级者将获得知识,专家将增强其知识。 单身人士班 在面向对象的编程中,单例类是在应用程序或项目的整个生命周期中只能有一个对象的类。 Singleton设计模式是iOS应用程序生命周期代码的一部分。 例如,在iOS项目中, UIApplication类是单例类的最佳示例,该类由iOS系统在应用启动时创建,并作为application(_:didFinishLaunchingWithOptions:)方法中的参数传递给AppDelegate。 有两种类型的Singleton设计模式。 纯单设计模式 半单设计模式 纯单设计模式: 在这种模式下,不允许使用纯单身类功能的程序员创建该类的实例。 程序员只能使用该类的预定义实例来调用单例类可用的方法和访问属性。 在应用程序启动期间,将使用创建该类的开发人员提到的预定义参数自动创建纯单类的对象。 纯单类必须标记为final,以避免继承混乱。 迅速地,您也可以使用结构来实现相同的概念。 程序员不能继承纯单类。 当您尝试快速继承任何类时,必须调用超类的构造函数。 在pure-singleton类中不可能调用超类的构造函数,因为pure-singleton类的所有构造函数始终被标记为private 。 让我们通过以下示例以一种简单的方式来理解这种设计模式。 问:什么时候应该使用第一个,而另一个应该使用“纯-单一设计模式”或“半-单一设计模式”呢? 这完全取决于您的班级职责。 如果您在项目中创建了singleton类,并且需要在某个时候更改某些属性,或者您想通过将来添加新方法来给类增加更多责任,并且还需要为其测试用例提供新的模拟数据添加方法后,应该使用半单例设计模式。 如果创建了类,则单元测试已经完成,并且想要通过框架或库进行发布,则可以采用纯单设计模式。 因为您创建了该类,并且其他开发人员将使用它,所以对单例类的单元测试是发布前的责任,而不是使用它的开发人员的责任。

SWIFT中的OOP

OOP(面向对象编程) ,这是一个由三个字母组成的神奇词,几乎所有现代编程语言都可以使用该词。 SWIFT和APPLE的流行语言与此没有什么不同。 OOP概念是SWIFT的基础。 我已经指出的是,许多开发人员未能关联OOP的概念。 并不是我们不了解OOP,只是我们无法关联应用程序。 因此,伙计们有时间以SWIFTY的方式重新审视基本的OOP概念。 糟糕,我们将与SWIFT一同推出…..地狱……!!! 好的,我们将以SWIFTY方式介绍以下OOP的基本概念: 班级 对象 物产 方法 访问控制 封装形式 抽象化 遗产 方法重载 方法重载 多态性 我不相信技术定义,而是会通过实现相同示例的iOS示例以更现实的方式理解这些概念。 我建议您在操场上尝试一下。 :] 类: 可以将类与某个特定项目或物体或生物所属的真实世界组进行比较,并且每个组都具有与该组中存在的相似的属性。 例如-将“人”视为一个小组或班级。 无论男女,每个人都有共同的属性和属性。 码: 类人{ //您的个人属性和能力可以在此处定义。 //如果你是吸血鬼,不要写;] } 我们在这里做了什么: 我们宣布一堂课。 iOS示例: iOS的主要UI类UIView可以视为一个类。 对象: 对象是您看到的来自特定类的任何东西。 例如,狗,猫,钢笔,铅笔等,一切都是物体。 从我们的“人物”示例中,男人和女人是属于同一类(即“人物”)的对象的示例。 码: let man = Person() //我们创建了一个Person对象 我们在这里做了什么: 我们通过实例化创建了该类的对象。 iOS示例: 创建UITableView的出口时,我们将创建UITableView类的对象。 特性: 让我们再次回到前面的Person示例。 正如我之前所说的,每个人都具有一些共同的属性,特性和功能,而在所有群体中它们都是相同的,例如我们属于特定的性别,肤色,年龄等。因此,这些可以称为人的特性。类。 从技术上讲,类的属性是该类的公共属性,可以在派生自该对象的每个对象之间共享。 码: […]

当我在Swift中以普通类创build编程button时,如何调用Button类的方法addTarget中的方法

我有一个方法“addTarget”的问题。 在我的程序中,我读取了一个包含graphics界面信息的文件。 根据这个文件,我编程创buildgraphics元素。 我有一个类的任何可能types的元素。 例如,我有Button类和一个Text类。 当我读取和parsing文件时,我创build了适当类的对象。 例如,如果我读取标签“Button”,我创build一个Button对象,并设置其属性(宽度,高度,文本,颜色和重力),然后将该对象插入树中。 // ViewController.swift import UIKit class ViewController: UIViewController, UISearchBarDelegate { private let defaultPage : NSString = "http://xxx/index.xml" private var dataArray : NSArray = [] internal override func viewDidLoad() { super.viewDidLoad() var parser : XMLParser = XMLParser.alloc().initWithURL(NSURL.URLWithString(defaultPage)) as XMLParser parser.getViews().draw(self) } func buttonAction(sender: UIButton!) { NSLog("Method1") } } // XMLParser […]

如何将CoreLocation坐标转换为string?

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) { var user_lat = manager.location.coordinate.latitude var user_long = manager.location.coordinate.longitude self.locationManager.stopUpdatingLocation() } 我试过String(manager.location.coordinate.latitude)但似乎并没有工作。

目标c类的默认基类

这个问题的答案可能是显而易见的,但我需要确定的是: 当类定义中没有明确定义基类时,是否所有客观的c类都共享一个通用的默认基类?

我应该在自己的代码之后还是在之前调用?

[抱歉,我的英文不好] 这个问题很简单(但我在expression它,并在谷歌中find麻烦)… 我应该(在所有类似的情况下,当我重写超级方法,不仅这一个)使用: – (void)viewDidLoad { /* my code */ [super viewDidLoad]; } 要么 – (void)viewDidLoad { [super viewDidLoad]; /* my code */ } 还是取决于?

什么应该拥有MVC模式的模型?

自从我记得以来,我一直在制作iOS应用程序,但直到最近我还没有实现编程风格,直到最近我有一个实习编程。 我很早就学到了很多面向对象的概念,因为我意识到生活中对他们的了解是多余的,但是我从来没有学过的东西是MVC模式。 为了给出上下文,假设我在单个SolarSystemView ( UIView一个子类)内绘制了一个太阳系。 我的SolarSystemView应该有一个SolarSystemView类的实例variables(一个包含所有重要的行星和stelar属性的数据结构的类),还是应该由一个SolarSystemViewController的实例拥有? 或者是完全不同的东西? 我找不到任何示例代码给出了令人满意的答案。 我想如果说这个视图拥有这个模型,那么操作就会非常stream畅,但是这样做也不是很好的风格。 毕竟, SolarSystem实例必须以某种方式dynamic更改,并且具有与SolarSystemView更新相同或相似的速率。

数据源模式与设置对象时的属性

我经常对什么时候使用DataSource模式以及何时使用Properties来为对象提供configuration信息感到困惑。 我有两种方法来做到这一点, 通常我在Object类中保留了很多必须configuration的属性和一个重置对象并继续使用新属性的方法。 而对于configuration另一个对象的Object,我保留一个名为configureXYZ:WithValues:的方法,它重置属性并调用要configuration的对象的重置方法。 我已经看到用MPMoviePlayerController,我们必须设置属性。 其他方式是如何工作的,所有的configuration信息来自数据源方法。 任何人都可以抛出更多的灯光,在哪种情况下首选哪种方式。 因为我经常想使用devise模式并使代码看起来很时尚,但是我想知道我们什么时候需要这些。 我完全清楚委托模式,必须定期使用它。 DataSource是我从来不清楚的一件事情。