一. 封装,继承,多态
封装
尽可能隐藏一个模块的实现细节。原因:
- 增加调用者负担,使用者在使用你的类时还要知道实现细节。
- 耦合性。比如类内部有个成员是vector,那么外部应该用push_back等方法来操作,有一天需要换城map,那么所有调用方的代码都得改。
应该对外界提供访问数据的方法(getter、setter);而不是直接将数据等实现细节暴露出去。
继承
不能仅仅因为is-a和is-kind-of就定义为继承关系,必须是派生类能够适用基类所有继承方法,而不会逻辑不通而无法使用,使用可能会造成安全隐患,否则不能成为继承关系。
- 逻辑不通而无法使用:duck->bird,bird {fly(); run();} 而duck只能使用run,fly方法没法使用,所以不鞥作为继承关系。
- 使用可能会造成安全隐患:stack->list,list有clear方法,但是应用在stack上会
清楚所有元素,这是我们不想要的。如果定义成继承关系,使用者无意间调用了clear会引发严重的安全问题。
优先使用组合而非继承。继承是 behaves-like-a, is-substitutable-for 的关系,不是 is-a 或 is-a-kind-of 的关系
多态
相同的代码应用到不同场景就能表现出不同的行为。
二. 设计原则
单一职责
一个函数只干一件事。这里的一件事是指做具体的操作,只是调用了定义操作的函数,不算具体的操作。
#干了两件事,获取数据;数据格式化
def get_format_info():
#get data from mysql
#get data from redis
return data.format()
#将数据访问封装成函数,这样get_format_info中自定义了流程,只干了一件事
def get_data():
#get data from mysql
#get data from redis
def get_format_info():
data = get_data()
return data.format()
参考:
https://www.zhihu.com/question/28492982