什么是抽象?
抽象是一种简化世界的方式。这意味着您不必担心幕后或幕后实际发生的事情。这意味着某些东西是白痴证明。
抽象示例:将 737/747 飞行的复杂性“抽象”掉
飞机是非常复杂的机械部件。你有喷气发动机、氧气系统、电气系统、起落架系统等,但飞行员不必担心喷气发动机的复杂性……所有这些都是“抽象的”。这意味着飞行员只需要担心飞机的转向:左转左转,右转右转,向上拉以获得高度,向下推以下降。
很简单……其实我撒了谎:控制方向盘有点复杂。在理想世界中,这是飞行员应该唯一担心的事情。但现实生活中并非如此:如果你像猴子一样驾驶飞机,对飞机的运行方式或任何实施细节没有任何真正的了解,那么你很可能会坠毁并杀死机上所有人。
737 示例中的泄漏抽象
实际上,飞行员确实需要担心很多重要的事情——并非所有事情都被抽象出来:飞行员必须担心风速、推力、迎角、燃料、高度、天气问题、下降角度,以及飞行员是否朝着正确的方向前进。计算机可以帮助飞行员完成这些任务,但并非一切都是自动化/简化的。
例如如果飞行员在柱子上拉得太厉害 - 飞机会服从,但飞行员会冒着使飞机失速的风险,一旦失速,在飞机坠落到地面之前很难重新控制它。
也就是说,飞行员不知道其他任何事情,仅仅控制方向盘是不够的……不……不……飞行员必须知道潜在的风险和飞行员飞行前飞机的局限性……飞行员必须知道飞机是如何工作的,飞机是如何飞行的;飞行员必须知道实施细节.....飞行员必须知道拉得太厉害会导致失速,或者太陡峭的着陆会毁坏飞机。
那些东西没有被抽象掉。很多东西都被抽象掉了,但不是所有的东西。飞行员只需要担心转向柱,也许还有其他一两件事。抽象是“泄漏的”。
代码中的泄漏抽象
......在你的代码中也是一样的。如果您不了解底层的实现细节,那么您往往会陷入困境。
这是一个编码示例:
ORM 抽象了处理数据库查询的许多麻烦,但如果您曾经做过类似的事情:
User.all.each do |user|
puts user.name # let's print each user's name
end
然后您会意识到,如果您拥有超过几百万的用户,那么这是杀死您的应用程序的好方法。并不是所有的东西都被抽象掉了。您需要知道,使用 2500 万用户调用 User.all 会导致您的内存使用量激增,并且会导致问题。你需要知道一些潜在的细节。抽象是泄漏的。