又爱又恨的callback

现在在很多编码中,callback 已经成为一种日常编码的方式,虽然我们追求 simple 的编码方式,但是熟练掌握 callback 很有必要

callback 是一种功能抽象

在不少集合算法,会使用 callback 作为抽象接口

def for_each(collection, callback):
    for i in collection:
        callback(i)

if __name__ == '__main__':        
    import pprint
    for_each([1, 2, 3], lambda i: pprint.pprint(i))

并发编程。callback 是唯一的抽象方式。

import time

def task_calback():
    print('process is running')
    time.sleep(3)
    print('process is done')
 
if __name__ == '__main__':
    p = Process(target=task_calback)
    p.start()

例外: 协程。通过协程来解耦 callback

function resolveAnyThing(x) { 
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(x);
    }, 2000);
  });
}

# callback
resolveAnyThing()
    .then((x) => {
        console.log(`resolveAnyThing is done, ${x}`);
    })
    
# await
async function fn() {
  var x = await resolveAnyThing(10);
  console.log(x); // 10
}
fn();

callback 要遵守可读性原则,不为了抽象而抽象

避免 A -> B -> A ,复杂的非线性调用链。
如果语言支持更简单的使用方式,可以不用 callback。

# 略

if __name__ == '__main__':
    import pprint
    for_each([1, 2, 3], lambda i: pprint.pprint(i))
    # 更直观和简单的做法
    for i in [1, 2, 3]:
        pprint.pprint(i)
    # 或者
    [
        pprint.pprint(i)
        for i in [1, 2, 3]
    ]

如果线性代码的可读性维护性都不错,不需要callback。

callback 已经在很多语言和领域中被使用,将来也会越来越被重视,习惯它吧。

猜你喜欢

转载自www.cnblogs.com/xnightsky/p/12497181.html