《代码整洁之道》读书笔记----第六章对象和数据结构
一、数据抽象
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变量的类
五、总结
理解对象曝露行为,隐藏数据;----便于添加新类型
数据结构曝露数据,没有明显的行为;----便于修改函数操作
灵活的使用对象和数据结构,得墨忒耳虽然有好处也有坏处
总之一句话,过犹不及。
上一篇: php中的单引号、双引号和转义字符