其他
当程序员具备了抽象思维
若想捉大鱼,就得潜入深渊。深渊里的鱼更有力,也更纯净。硕大而抽象,且非常美丽。——大卫·林奇
什么是抽象
抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征的过程。具体地说,抽象就是人们在实践的基础上,对于丰富的感性材料通过去粗取精、去伪存真、由此及彼、由表及里的加工制作,形成概念、判断、推理等思维形式,以反映事物的本质和规律的方法。
实际上,抽象是与具体相对应的概念,具体是事物的多种属性的总和,因而抽象亦可理解为由具体事物的多种属性中舍弃了若干属性而固定了另一些属性的思维活动。[1]
抽象是指为了某种目的,对一个概念或一种现象包含的信息进行过滤,移除不相关的信息,只保留与某种最终目的相关的信息。例如,一个皮质的足球,我们可以过滤它的质料等信息,得到更一般性的概念,也就是球。从另外一个角度看,抽象就是简化事物,抓住事物本质的过程。[2]
抽象和语言是一体的
抽象思维,又称词(概念)的思维或者逻辑思维,是指用词(概念)进行判断、推理并得出结论的过程。抽象思维以词(概念)为中介来反映现实。这是思维的最本质特征,也是人的思维和动物心理的根本区别。[3]
抽象的层次性
一个出版品 一份报纸 《旧金山纪事报》 5 月 18 日的《旧金山纪事报》
软件中的分层抽象无处不在
重复代码是抽象的缺失
首先,我们要从缓存中把搜索条件列表取出来; 然后,遍历这些条件,将搜索的值填充进去;
//取默认搜索条件
List<String> defaultConditions = searchConditionCacheTunnel.getJsonQueryByLabelKey(labelKey);
for(String jsonQuery : defaultConditions){
jsonQuery = jsonQuery.replaceAll(SearchConstants.SEARCH_DEFAULT_PUBLICSEA_ENABLE_TIME, String.valueOf(System.currentTimeMillis() / 1000));
jsonQueryList.add(jsonQuery);
}
//取主搜索框的搜索条件
if(StringUtils.isNotEmpty(cmd.getContent())){
List<String> jsonValues = searchConditionCacheTunnel.getJsonQueryByLabelKey(SearchConstants.ICBU_SALES_MAIN_SEARCH);
for (String value : jsonValues) {
String content = StringUtil.transferQuotation(cmd.getContent());
value = StringUtil.replaceAll(value, SearchConstants.SEARCH_DEFAULT_MAIN, content);
jsonQueryList.add(value);
}
}
public class SearchConditionAssembler {
public static SearchCondition assemble(String labelKey){
String jsonSearchCondition = getJsonSearchConditionFromCache(labelKey);
SearchCondition sc = assembleSearchCondition(jsonSearchCondition);
return sc;
}
}
强制类型转换是抽象层次有问题
public class FruitPicker {
public List<Fruit> pickGood(List<Fruit> fruits){
return fruits.stream().filter(e -> check(e)).
collect(Collectors.toList());
}
private boolean check(Fruit e) {
if(e instanceof Apple){
if(((Apple) e).isSweet()){
return true;
}
}
if(e instanceof Watermelon){
if(((Watermelon) e).isJuicy()){
return true;
}
}
return false;
}
}
public class FruitPicker {
public List<Fruit> pickGood(List<Fruit> fruits){
return fruits.stream().filter(e -> check(e)).
collect(Collectors.toList());
}
//不再需要instanceof和强制类型转换
private boolean check(Fruit e) {
return e.isTasty();
}
}
如何提升抽象思维能力
多阅读
多总结沉淀
命名训练
领域建模训练
小结
抽象思维是程序员最重要的思维能力,抽象的过程就是寻找共性、归纳总结、综合分析,提炼出相关概念的过程。
语言和抽象是一体的,抽象思维也叫词思维,因为抽象的概念只能通过语言才能表达出来。
抽象是有层次性的,抽象层次越高,内涵越小,外延越大,扩展性越好;反之,抽象层次越低,内涵越大,外延越小,扩展性越差,但语义表达能力越强。
对抽象层次的拿捏,体现了我们的设计功力,视具体情况而定,抽象层次既不能太高,也不能太低。
重复代码意味着抽象缺失,强制类型转换意味着抽象层次有问题,我们可以利用这些信号来重构代码,让代码重新变的优雅。
我们可以通过刻意练习来提升抽象能力,这些练习包括阅读、总结、命名训练、建模训练等。
[1] https://baike.baidu.com/item/抽象/9021828
[2] https://zh.wikipedia.org/wiki/抽象化
[3] https://baike.baidu.com/item/抽象思维
[4] https://www.sohu.com/a/359915387_260616
﹀
﹀
﹀