我们一起来读书吧 关注:138贴子:2,097
  • 0回复贴,共1

代码里的世界观第1-3章

只看楼主收藏回复

一、数据和代码的关系
关系一:数据是根本目的,代码是手段,代码永远是为数据服务的 。
数据分为输入数据和输出数据 ,代码是将输入数据转化为输出数据的工具。 用户最关心的永远是最终数据是不是他想要的,并能否在规定的时间内得到 ;
关系二 :有什么样的数据,决定了 会有什么样的代码 。
二、面向对象的方式本质上是借用人类理解世界的方式去构架这些数据和方法之间的关系
方法存在的意义就是操作它对应的数据
1. 我认为每一个public方法就不要轻易修改。 因为很可能被外部引用, 一旦修改就会引发一系列麻烦。
2. 但初学者要注意一个常见的陷阱,仿照上面介绍的, 去掉Set方法,只保留Get方法,如此简单的实现是无效的:
用户拿到你的 self.person 引用之后,依然可以任意修改 perso口里面的值:
需要自己实现值传递,在 Get方法里,先实现数据的备份,再把备份数据返回给用户:
3. 大家在什么场景下才会定义一个 private 方法呢? 我总结有以下三种。
场景一。 抽象出来的一些边边角角的小功能方法。 本应该抽象出公共的 utility方法的, 但用处太少,还达不到通用的标准 。 例如: private string GetCardString(); 返回的是一个特定格式的字符串,别的类也不会用 。
场景二 。 纯粹就是好几处相同或相似的代码,为了缩减行数,硬把这几处代码替换为一个 private 函数。 这种函数的特点是逻辑上并不足够完整,不能很好地对应一个完整的业务语义,是个半成品,还不具备完整的灵魂 。
场景三 。 可能一些 public 方法过于强大,业务上不想让外面知道这么多细节 。 于是把它隐藏成为 private 方法,而新增一些 public 方法来调用该 private 方法来提供它的子功能 。
三、继承
在面向对象的技术中,是承上启下的一个环节 。我们必须在封装的基础上才能实现继承;
而只有实现了继承,才能进一步产生多态 。
多态给程序员带来的最大价值是:让大家实现了梦寐以求的“面向抽象编程 , 面向接口编程” 。
它像一只看不见的手直接把基类和所有子类们动态、联系起来。
四、“面向抽象编程”本质上是对数据的抽象化 , “面向接口编程”本质 上是对行为的抽象化 。
左边是抽象,右边是具体的 new
Animal animal =new Tiger() ;
为什么这么写
void show() {
... // 出场前的准备活动
Animal animal = new Tiger () ;
ShowAnimal(animal) ;
}
ShowAnimal(animal) ;之前的那段“出场前的准备活动” 代码,将来很有可能是别人来维护的 。 在架构设计上,一定要考虑“时间”这个变量带来的不确定性 。 如果你定义成 :
Tiger tiger =new Tiger() ; 这看起来更灵活,但你没法阻止这只老虎被别人将来使用 Hunt 函数滥杀无辜。
如何解决这个问题
1). 控制反转
void setAnimal(Animal animal) {
this.animal = animal;
然后让客户去调用注入:
Tiger tiger= new Tiger() ; obj . setAnimal (tiger) ;
2). 工厂模式一一抽象的基础设施
Void Show(string name ) {
Animal animal = ProvideAnimal (name );//等号两边都是同级别的抽象.


IP属地:北京1楼2024-05-20 18:34回复