函数中的抽象层次

Abstraction levels in a function

我正在读一本名为 'The clean code' 的书,当作者试图讲述我们如何编写一个高效的 function.He 时卡住了,他说,“为了确保我们的功能正在做“一件事”,我们需要确保 我们函数中的语句都处于同一抽象级别”。 那么作者究竟想通过抽象层次表达什么?

相同的抽象级别:

function start_a_war() {
  (targets_to_destroy, targets_to_occupy) = select_targets()
  launch_rockets_at(targets_to_destroy)
  send_occupation_forces(targets_to_occupy)
}

不同的抽象层次:

function get_diploma() {
  select_industry()
  select_university()
  study_and_pass_all_exams()
  go_to_administration()
  if (secretary_is_sexy()) {
     smile()
  }
  say('hi, i'm john doe, i've just passed all exams and i want my diploma')
  put_right_hand_into_the_pocket()
  grab_your_id()
  while(id_not_visible_to_the_secretary) {
    raise_right_hand_by(10 cm)
  }
  ...
}

在函数内部,您应该始终保持相同的泛化(抽象)级别

您可以将函数视为某种能力或行为的计算实现。

例如,如果您正在为可以打开或关闭的 lamp 建模,则可以在两个函数 switchON()switchOFF() 中捕获这些功能。或者您可能更愿意使用带有形式参数 b 的单个函数 switch(b) 来实现相同的功能,等等。在思考这些注意事项时,您的 lamp 被显着简化,因为您将只对真实 lamp 的某些方面感兴趣:状态 (ON/OFF)、颜色等。根据角色,lamp 将考虑与其他对象的关系,您将包含一些特征并忽略许多其他特征(例如,价格、重量等)。

定义模型的范围,即您将密切关注的特征,构成了 lamp 的 抽象 。你可以把抽象想象成一幅漫画,一个真实事物(或概念)的版本,与原作共享尽可能少的属性以使其相似,而不是尽可能多地完全复制它。

那么,级别 的抽象是什么?它是一组属性和行为,代表模型拥有的特定特征:与实现某个目标相关的特征。

例如,如果您的目标是为交通信号灯建模,那么您的 lamp 只需要能够打开和关闭并具有颜色在绿色、红色、黄色中。

现在假设您要对动态交通系统建模以优化城市中的车辆流量。您的抽象必须包括街道、十字路口、大道等。在构建模型时,您将在不同级别之间切换:lamp、红绿灯、绿波、高峰时间、假期、周末。

作者试图传达的想法是,控制器的功能如 circumvent(accident) 包含一行代码来处理 switch(b) 的实现是不好的,因为这样一行代码属于不同的详细级别,即属于不同的抽象层,适合 lamp 的实现。同样,circumvent(accident) 的正文在存储信息的数据库的某些 SELECT 子句中进行引用也是不利的,因为这样的代码行仅适用于数据存储库级别(对 accident).

知之甚少

因此,在设计程序或应用程序时,要特别注意识别其不同层次。然后,在编写函数时,确保其代码仅属于您的一个抽象。