1. 结语
1.1. 想想哪些类是真正需要的
大多数程序员编写应用程序而不开发框架.即便是开发框架的那些人,多数时候(或大多数时候)也是在编写应用程序.
编写应用程序时,我们通常不用设计类的层次结构。我们至多会编写子类、继承抽象基类或框架提供的其他类. 作为应用程序开发者, 我们极少需要编写作为其他类的超类的类.我们自己编写的类几乎都是末端类(即继承树的叶子).
如果作为应用程序开发者,你发现自己在构建多层类层次结构,可能是发生了下述事件中的一个或多个.
- 你在重新发明轮子。去找框架或库,它们提供的组件可以在应用程序中重用.
- 你使用的框架设计不良。去寻找替代品.
- 你在过度设计.记住要遵守 KISS 原则.
- 你厌烦了编写应用程序,决定新造一个框架.恭喜,祝你好运!
这些事情你可能都会遇到:
你厌倦了,决定重新发明轮子,自己构建设计过度和不良的框架,因此不得不编写一个又一个类去解决鸡毛蒜皮的小事. 希望你能乐在其中, 至少得到应有的回报.
1.2. python的封装--私有属性的安全性和保障性
Perl 不会强制你保护隐私。你应该待在客厅外,因为你没收到邀请,而不是因为 里面有把枪。 ——Larry Wall Perl 之父
Python 和 Perl 在很多方面的做法是截然相反的,但是Larry
和Guido
似乎都同意要保护对象的隐私.
我发现很多人都对Java提供的隐私保障推崇备至.可事实是,Java 的 private
和 protected
修饰符 往往只是为了防止意外(即一种安全措施).只有使用安全管理器部署应用时才能保障绝对安全,防止恶意访问; 但是,实际上很少有人这么做,即便在企业中也少见.
1.3. 把协议当作非正式的接口
协议不是 Python 发明的。Smalltalk 团队,也就是"面向对象"的发明者,使用"协议"这个词表示现在我们称 之为接口的特性.某些 Smalltalk 编程环境允许程序员把一组方法标记为协议,但这只不过是一种文档, 用于辅助导航,语言不对其施加特定措施.因此,向熟悉正式(而且编译器会施加措施)接口的人解释"协议"时, 我会简单地说它是"非正式的接口".
动态类型语言中的既定协议会自然进化.所谓动态类型是指在运行时检查类型,因为方法签名和变量没有静态类型信息. Ruby是一门重要的面向对象动态类型语言,它也使用协议.
在 Python 文档中,如果看到"文件类对象"这样的表述,通常说的就是协议.这是一种简短的说法,意思是:
"行为基本与文件一致,实现了部分文件接口,满足上下文相关需求的东西."
你可能觉得只实现协议的一部分不够严谨,但是这样做的优点是简单.
不要为了满足过度设计的接口契约和让编译器开心,而去实现不需要的方法,我们要遵守KISS原则.
1.4. 类型提示
2014年,Python世界最大的新闻应该是 Guido van Rossum 同意实现可选的静态类型检查,这与检查程序 Mypy(http://www.mypy-lang.org)的做法类似,即使用函数注解实现。这一消息出自 8 月 15 日发表在 Python-ideas邮件列表中的一个话题,题为 Optional static typing —the crossroads.
一个月后,“PEP 484—Type Hints”草案发布了,发起人是 Guido.
这个功能的目的是让程序员在函数定义中使用注解声明参数和返回值的类型,但这是可选的.
关键在于“可选”二字.仅当你想得到注解的好处和限制时才需要添加注解,而且可以在一些函数中添加,在另一些函数中不添加.
从表面上看,这与 Microsoft 对 TypeScript
采取的方式类似,不过 TypeScript 做得更进一步:
TypeScript 添加了新的语言结构(如模块、类、显式接口, 等等),允许声明变量类型,而且最终编译成常规的JavaScript
目前来看,Python的可选静态类型没这么大的雄心.但似乎cython团队打算好好利用这一语言特性.
为了理解这个提案的动机,不能忽略 Guido 在 2014 年 8 月 15 日发送的那封重要邮件中的这段话:
我还得做个假设:这个功能主要供 lint 程序、IDE 和文档生成工具使用.这些工具有个共同点:即使类型检查失败了,程序仍能运行。此外,程序中添加的类 型不能降低性能(也不能提升性能 :-)).
因此,这一举动并不像乍一看那么激进.PEP 484—Type Hints提到了PEP 482—Literature Overview for Type Hints,后者概述了第三方 Python 工具和其他语言实现类型提示的方式.
不管激进不激进,类型提示都已经到来: 最后,PEP 484明确指出:
还要强调一点,Python 依旧是一门动态类型语言,作者从未打算强制要求使用类型提示,甚至不会把它变成约定.
1.5. 接口中的隐喻和习惯用法
隐喻能打破壁垒,让人更易于理解.使用"栈"和"队列"描述基本的数据类型就有这样的功效:
这两个词清楚地道出了添加或删除元素的方式.
另一方面,Alan Cooper 在《交互设计精髓(第 4 版)》中写道:
严格奉行隐喻设计毫无必要,却把界面死死地与物理世界的运行机制捆绑在一起.
他说的是用户界面,但对 API 同样适用。不过 Cooper 同意,当"真正合适的"隐喻"正中下怀"时,可以使用隐喻(他用的词是"正中下怀",因为合适的隐喻可遇不可求).
Python 语言的基本协议就是 Cooper 所说的"习惯用法"。知道"序列"是什么之后,可以把这些知识应用到不同的场合. Python这门语言的学习最关键的就是学习基本惯用法,让你的代码简洁、高效且可读。
还没有评论,来说两句吧...