函数中的抽象级别

时间:2018-05-29 23:35:06

标签: language-agnostic object-oriented-analysis

我正在读一本名为“干净代码”的书。当作者试图告诉我们如何编写一个有效的函数时,它会陷入困境。他说,"为了确保我们的功能正在做“一件事”,我们需要确保 我们函数中的语句都处于相同的抽象层次"。 那么作者究竟想通过抽象层次来传达什么呢?

2 个答案:

答案 0 :(得分:1)

相同的抽象级别:

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)
  }
  ...
}

在函数内部,你应该始终保持相同的泛化水平(抽象)

答案 1 :(得分:1)

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

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

定义模型的范围,即您将密切关注的功能,构成了灯的抽象。您可以将抽象视为漫画,将实际事物(或概念)的一个版本与原始资源共享为与其类似的属性,而不是尽可能多地完全再现它。

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

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

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

作者试图传达的想法是,如circumvent(accident)这样的控制器功能包含一行代码来处理switch(b)的实现是不好的,因为这样的代码行属于不同的细节级别,即,在不同的抽象层中,适合于灯的实现。类似地,circumvent(accident)的主体在存储信息的数据库的某个SELECT子句中进行引用会很糟糕,因为这样的代码行只适合数据存储库级别(它对accident)知之甚少。

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