- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Swift 是否支持 uniform access principle ?据我所知,以下code表明它不是:
@objc protocol CounterDataSource {
optional func incrementForCount(count: Int) -> Int
optional var fixedIncrement: Int { get }
}
class Counter {
var count = 0
var dataSource: CounterDataSource?
func increment() {
if let amount = dataSource?.incrementForCount?(count) {
count += amount
} else if let amount = dataSource?.fixedIncrement {
count += amount
}
}
}
incrementForCount
是一个函数,必须以不同的方式访问(作为“可选”实现的方法),对吗?
最佳答案
我认为这个问题误解了有关统一访问原则的文章,我什至不确定协议(protocol)如何适合这里的讨论。
文章不一定说得特别清楚,但有两个关键:
这句话:
Whatever the language does, it's important that programmers don't violate the principle. Often you'll see conventions that subvert uniform access. An example of this might be saying that data accessors are named getAge while computed accessors are named calcAge. I make a point of naming my accessors the same way in either case.
对于这个例子,我有一些类,Person
,它有我们关心的两个属性——年龄和出生日期。
此类有两种可能的实现:
class Person {
let birthDate: NSDate
var age: Int {
NSCalendar.currentCalendar().components(NSCalendarUnit.CalendarUnitYear, fromDate: birthDate, toDate: NSDate(), options: nil).year
}
init(birthDate: NSDate) {
self.birthDate = birthDate
}
}
或者...
class Person {
let birthDate: NSDate
let age: Int
init(birthDate: NSDate, age: Int) {
self.birthDate = birthDate
self.age = age
}
}
在一种情况下,我们有计算出的年龄,在另一种情况下,我们有存储的年龄。
但在这两种情况下,我们都以相同的方式访问它们。
如果将第一种情况中的计算属性替换为函数:calculateAge() -> Int
调用者不应该关心年龄是根据出生日期计算的还是存储的属性。 Swift 拥有的工具允许开发人员在不违反统一访问原则的情况下编写代码。
此外,我们在开发 iOS 和 OS X 应用程序时使用的框架在遵守统一访问原则方面做得很好。方法和属性访问器永远不会使用 get
或 calculate
前缀命名。属性可以实现为计算属性(或者显然是存储属性)。方法可以进行计算或只是返回存储的变量。没有什么可以阻止这一切。
为了完整起见,采用上面的两个 Person
实现,违反统一访问原则的行为将如下所示:
class Person {
let birthDate: NSDate
var calculateAge: Int {
NSCalendar.currentCalendar().components(NSCalendarUnit.CalendarUnitYear, fromDate: birthDate, toDate: NSDate(), options: nil).year
}
init(birthDate: NSDate) {
self.birthDate = birthDate
}
}
或者...
class Person {
let birthDate: NSDate
let getAge: Int
init(birthDate: NSDate, age: Int) {
self.birthDate = birthDate
getAge = age
}
}
关于Swift统一访问原则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35760427/
GitOps描述了一种使用植根于 Git 版本控制系统的方法来操作和管理软件的方法。使用基于 GitOps 的工作流,通过要求将系统的特征定义为 Git 存储库中的文件,可以更轻松地开发、部署、维护和
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 6 年前。
命令行货币转换器应用程序,提示用户输入源货币、源货币代码和目标货币代码,例如 C:\workspace> java CurrencyConverter 100.50 EUR GBP 应用程序返回源金额
得到这个实体: /** * @ORM\Table(name="shop_payment_details") * @ORM\Entity(repositoryClass="Acme\ShopBund
我有一个原则实体,无需调用 persist 或 flush 即可持久保存到数据库中。 我在下面很简单地重现了这个问题。正如您将看到的,此脚本从名为 MyEntity 的数据库表中加载一行,并获取一个以
在我的编程实践中,我经常遇到客户端和服务器端脚本之间数据重复的问题。 在这种情况下,我们可以讨论客户端的 JavaScript 和服务器端的 PHP 或 C# (ASP.NET)。 比方说,我有一段
简介 我在写关于继承问题的硕士论文并解决了一些问题 表明存在继承问题的指标。 像下面的例子: 示例 public static String getAnimalNoise(Animal animal)
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
当我注意到this answer时,我一直在阅读里氏替换原理。 。它有一个 Circle 和一个 ColoredCircle 类型,其中 ColoredCircle 的构造函数需要一个额外的参数; 颜
这段代码是否违反了DRY原则? if (notAuthorized) { return sendErrorCode(new ForbiddenException()) } else if (n
我在查询中使用 Doctrine 2 的结果缓存来检索用户(消息传递应用程序)的新消息数量: $query->useResultCache(true, 500, 'messaging.nb_new_m
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
如何设置包含类名的变量,例如 android.util.Log 中的 TAG,同时尊重 Dont-Repeat-Yourself? 以下是一些可能性: 在 Google 代码中,它的常用用法如下 pu
我有以下查询: $roles = array(); $roles[] = 'ROLE_SUPER_ADMIN'; $roles[] = 'ROLE_ADMIN';
下面的代码违反了哪一条 SOLID 原则? public class A { void hello(){ //some code here } } public class B ext
我目前有一个 Message_Repository 类,它有如下方法: getLocationDetailsByID($messageId), getCustomerDetailsById($mess
我不知道它到底叫什么,但现在我将它称为“非空测试”。在 C# 8 中有一个新的行为允许测试一个对象是否不为空,例如: Foo foo = new Foo(); if(foo is { }) {
我正在学习 Doctrine。我在多对多关系中有两个实体 Article 和 Category,我正在尝试获取所有不是特定文章的类别。 文章实体: class Article extends Base
在阅读了一本书和一篇在线文章中有关 SOLID 代码的内容后,我想重构一个现有的类,使其与“SOLID”兼容。 但我想我迷路了,尤其是依赖注入(inject):当我想实例化类的一个对象时,我需要“注入
我的项目中有类似的东西,这个项目已经完成了(它正在运行)我只想知道 SOLID 原则是否可以接受 static public class Tools { static public GetPr
我是一名优秀的程序员,十分优秀!