欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

《代码整洁之道》读书笔记----第六章对象和数据结构

程序员文章站 2024-02-09 20:41:58
...

一、数据抽象
1.类是如何把自己的数据展示给外界
(1)直接暴露数据,类似与数据结构的形式
(2)用户通过函数直接操作数据本体,而不用知道数据本身,以抽象的方式展示数据

2.不暴露数据细节,以抽象的形式展示数据的时候,不只是添加接口,或者使用复制器、访问器就可以,要以最好的方式呈现某个对象包含的数据,需要严加的思考。

二、数据、对象的反对称性
数据结构:曝露其中数据,没有提供有意义的函数

class Student{
	string name;
	int id;
}

class Teacher{
	string name;
	string power;
}
class Person{
 	public void SayIdentity(object people){
		if(people instanceof Student){
		Console.WriteLine($"{people.id},Name:{people.name}");
		}
		else if(people instanceof Teacher){
		Console.WriteLine($"Name:{people.name}",Power:{people.power});
		}
	}
}

当添加新的class Headmaster{}时候,添加完之后,要去修改Person类添加新的函数。
不过在Person添加新函数的时候,不需要去修改class Teacher,class Student的东西。
理解是:数据结构类,+函数操作类,偏向于过程式的编程,可以付出很小的代价添加新函数,可是添加新的数据结构的时候,要付出的代价却很大

对象:隐藏数据,通过抽象之后,曝露数据的操作函数

Interface IPerson{
	void SayIdentity();
}
class Student:IPerson{
	string name;
	int id;
	public void SayIdentity(){
	Console.WriteLine($"{id},Name:{name}");
	}
}

class Teacher{
	string name;
	string power;
	public void SayIdentity(){
	Console.WriteLine($"Name:{name}",Power:{power});
	}
}

当添加新的class的时候只需要实现接口IPerson即可。
但是在IPerson接口添加新的函数的时候,却要修改所有的实现类。
理解是:面向对象的编程,可以付出很小的代价添加新的对象,添加新函数的时候,要付出的代价却很大

两种方式都各有用处,不存在纯面对对象。

根据需求进行选择,大部分都是采用面向对象的方式,当然,如果是那种数据结构基本不变,操作函数却经常变换的,可以使用过程化编程。

三、得墨忒耳率—最少知识原则
通俗来讲,调用的过程中只允许有一个“.”操作符的存在。
简单的使用拆分把一长串的 demo.funcA().funcB().funcC()拆分成
var temp1=demo.funcA();
var temp2=temp1.funcB();
var temp3=temp2.funcC();
是一个比较简单的解决变法。更好的做法是
var temp3=demo.CreateTemp3();
隐藏掉temp3的实现细节

四、数据传输对象
类似与数据结构,只有公共变量,没有函数的类----DTO(Data Transfer Objects),常用于与数据库交互,套接字传递信息之类的场景中。
Active Record,是只含有prop变量的类

五、总结
理解对象曝露行为,隐藏数据;----便于添加新类型
数据结构曝露数据,没有明显的行为;----便于修改函数操作
灵活的使用对象和数据结构,得墨忒耳虽然有好处也有坏处
总之一句话,过犹不及。