表驱动法(Table-Driven Approach)

1_l7Hjzbw8oHpa39gF8GkW9Q.png

表示原则:把知识叠入数据以求逻辑质朴而健壮。 ——《UNIX编程艺术》

表驱动法是一种编程模式——从表里查找信息而不是使用逻辑语句。
随着逻辑复杂性的增加,if/else 或switch中的代码将变得越来越肿,所以我们常说数据比程序逻辑更易驾驭。表驱动法就是将这些逻辑中的数据与逻辑分开,从而减少逻辑的复杂度。查表方式通常有如下几种:

直接访问

以一个月的天数为例,我们要写一串if/else 或者switch/case 来表达逻辑。

  if(1 == iMonth) {iDays = 31;}
  else if(2 == iMonth) {iDays = 28;}
  else if(3 == iMonth) {iDays = 31;}
  else if(4 == iMonth) {iDays = 30;}
  else if(5 == iMonth) {iDays = 31;}
  else if(6 == iMonth) {iDays = 30;}
  else if(7 == iMonth) {iDays = 31;}
  else if(8 == iMonth) {iDays = 31;}
  else if(9 == iMonth) {iDays = 30;}
  else if(10 == iMonth) {iDays = 31;}
  else if(11 == iMonth) {iDays = 30;}
  else if(12 == iMonth) {iDays = 31;}

但是我们把数据存到一张表里,就不需要冗余的逻辑了。

const month = {
  monthTable: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
  get days(month, year) {
    // (year % 4 === 0) && (year % 100 !== 0 || year % 400 === 0) 闰年逻辑 
    return [month - 1];
  }
}

索引访问

有时通过一次键值转换(对象或者数组),依然无法找到键值。此时可将转换的对应关系写到一个索引表里,即索引访问。而且可以多重索引,或者使用正则匹配。

我们可以利用Map结构的key可以为基本类型这一特点:

const actions = new Map([
  [{identity:'guest',status:1},()=>{/*do sth*/}],
  [{identity:'guest',status:2},()=>{/*do sth*/}],
  //...
])

const onButtonClick = (identity,status)=>{
  let action = [...actions].filter(([key,value])=>(key.identity == identity && key.status == status))
  action.forEach(([key,value])=>value.call(this))
}

进一步的我们也可以利用正则:

const actions = ()=>{
  const functionA = ()=>{/*do sth*/}
  const functionB = ()=>{/*do sth*/}
  const functionC = ()=>{/*send log*/}
  return new Map([
    [/^guest_[1-4]$/,functionA],
    [/^guest_5$/,functionB],
    [/^guest_.*$/,functionC],
    //...
  ])
}

const onButtonClick = (identity,status)=>{
  let action = [...actions()].filter(([key,value])=>(key.test(`${identity}_${status}`)))
  action.forEach(([key,value])=>value.call(this))
}

特别的,对于布尔类型我们还可以使用二维数组或多维数组。

const actions = [
    //!a a
    [1, 2],  // !b
    [3, 4]   //  b 
]

阶梯访问

对于一些无规则的数据,例如等级划分。我们没法使用简单的转换将数据转换为索引,但是我们可以使用一个循环,依次检查区间的上下限。

需要注意的细节

  • 谨慎处理区间端点
  • 可以采用二分/索引加速
const grade = [59,79,84,89,94,100]; 
const level = ["F","E","D","C","B","A"];


const getLevel = g =>{
    for(let i = 0 ; i < grade.length ; i++){
        if(g <= grade[i]) return level[i];
    }
}

表驱动的优势

  • 可读性更强,逻辑一目了然
  • 数据与逻辑解耦,修改数据即可
  • 逻辑可重用

参考文章:

https://www.cnblogs.com/clover-toeic/p/3730362.html
https://juejin.im/post/5dbff51bf265da4d4e3001b2#heading-2
https://medium.com/javascript-in-plain-english/clean-up-your-code-by-removing-if-else-statements-31102fe3b083

冲突型社会模式

达伦多夫冲突理论

达伦多夫理论最为重要的基本假设和出发点是“冲突型社会模式”。
现实中不存在一个持续的稳定,各要素都很好整合的结构。
就像一碗水,你可以把它端的相对平,但你永远无法让它绝对水平。而且你越努力把它端平你的手就越容易酸,持续的时间就越短。

达伦多夫提出了四个西方工业社会的变化:

  • 所有权与控制权分离
  • 技术工人增加
  • 中产阶级变化
  • 阶级冲突的制度化

    • 资本与劳动之间的紧张关系已经被制度化缓解了,制度使得两者之间的关系合法化,从而阶级斗争的方法、武器和技术就被置于制度的有效控制之下。这样,阶级斗争就走出了误区,它变为相互平衡的权力之间的合法斗争,资本与劳动的冲突就变成关于工资水平、劳动时间、劳动条件的谈判或协商。

马克思认为资本主义的冲突会越来越激烈,而在西方社会的现实中,这种冲突找到了制度化的调节方式。
工业社会能够处理内在结构造成的冲突,这里的冲突已经变成一种市场关系。

### 冲突的后果
冲突不是坏的,而是社会结构中一个必不可少的,基本的组成。

  • 冲突有助于社会体系的整合。
  • 冲突有助于创造变迁(改良而不是革命,比如在野党通过选举变成执政党,或者体现在立法与政策上)

冲突的调节

有效的调节需要具备一下三个条件:

  • 冲突双方认识到冲突这一客观事实,一味对立否认,强调共同利益,抹杀冲突界限,反而不利于冲突调节,只能酝酿更大的冲突。
  • 冲突的利益群体必须有组织
  • 双方必须遵循正式的游戏规则(所以最为关键的是将冲突规则制度化,保障双方的利益)

引用:

李强 著. 社会分层十讲 (清华社会学讲义) (Chinese Edition) (Kindle 位置 1099-1100). 社会科学文献出版社. Kindle 版本.

虚骄之气与狭隘的国家主义

摘取《美国十讲》中第十讲 美国与中国的几句话,很适合当下:

把自己所有的缺点,就是我们发生的坏事情和国内的问题,都怪在外国人身上,这是一种很没出息的表现。所谓“境外敌对势力”也被滥用。把自己国内的问题,由于社会不公而出现的不平之鸣,都说成是“境外敌对势力”策动的。

我们的主流媒体很喜欢夸耀国力,或有选择地、断章取义地转载外国人吹捧中国的话,这会误导公众。中国过去的仁人志士都是有很深的忧患意识,而现在改革开放以后起来的一代人,忧患意识比较少,对实际国情缺乏了解,这是很危险的,但是这不能怪年轻人。

力歌颂“盛世”,给人虚幻的印象,无助于我们自己埋头苦干努力解决自己的问题。

累不累?看看税

月收入1万,要交14%个人所得税,12%公积金,8%养老保险,4%医疗失业险=3800元,剩6200元;
如果你拿出2200全部消费,需要为你消费的商品埋单17%增值税,剩4000元;
如果全部存钱来买房,假设90平米,每平米2万,180万,还要收1%契税,18000元。

每月合计税款:4214元,占收入的42%,最终需要37.5年能买房。

医疗

中国按照17%满额征收药品增值税,部分进口药品征收关税。

买车

  • 国产车:1.8及其以上排量的车辆购置税税率为10%,1.6排量及以下车辆购置税税率为5%。
  • 进口车:进口车还要交17%的增值税,25%的关税
  • 汽油:17%增值税、汽油每升消费税1.52元、7%城建税、3%教育附加费

减免

自己搜索减免税政策代码表。

高税收不可怕

人的一生有两件事是不可避免的,一是死亡,一是纳税。——本杰明·富兰克林

高税收不可怕,关键是要有对应的福利,和透明的税款用途。
我觉得这一点大家心里都有数。

参考阅读:
中国人一生要缴多少税
「中国税负远超欧美」的说法是否属实?
全球直观税负指标:中国征敛远超欧美

好的社会

好的社会应该是一个自治的,社会中的人是自主自发的主体而不是被动的对象。就像网络中各个路由一样,他们遵循一定的路由协议,相互形成一个自治系统。如果通过人工指定路由转发策略,将会给网络管理员带来巨大的工作量,并且在管理、维护路由表上也变得十分困难。社会也是如此,而且更复杂。

而自治的前提是先学会如何做一个公民,一个懂法律、有理性、明白自己的权利、义务且能够合法合理保护自己权利的有组织的个人。某种程度上说,能做到这一点的并不是多数,在这个过程中还有很多阻力。好社会不会自己从天而降,注定是要所有的社会力量的参与进去,才能前进。

中国突破这个过程可以简单的概括为:行动锻造公民;抗争生产社会;维权改变中国。

 “公正最终是与人们的生活方式相关,而并非仅仅与周遭的制度有关。我们认为,过于关注制度方面(假定行为处于从属地位),而忽略人们的实际生活,是有严重缺陷的。研究公正问题时,关注实际的生活对理解公正理念的本质和影响范围具有深远的意义。” ——阿玛蒂亚·森