【问题标题】:Abstraction levels in a function函数中的抽象级别
【发布时间】:2018-05-29 23:35:05
【问题描述】:

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

【问题讨论】:

  • 请不要滥用这样的语言问题标签,因为它被视为垃圾邮件的一种版本。要么选择一种语言,要么让你的问题语言不可知(我现在已经这样做了)。
  • 谢谢你,先生,对不起我的无知

标签: language-agnostic object-oriented-analysis


【解决方案1】:

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

例如,如果您正在为一个可以打开或关闭的灯建模,您可以在两个函数中捕捉这些功能,switchON()switchOFF()。或者您可能更喜欢使用单个函数 switch(b) 和形式参数 b 等来实现相同的功能。在考虑这些考虑因素时,您的 lamp 概念已大大简化,因为您将只对真实灯的某些方面感兴趣:状态(开/关)、颜色等。根据灯与其他对象的关系,您将包括一些特征而忽略许多其他特征(例如,价格、重量等)。

定义您的模型的范围,即您将密切关注的特征,构成了您对灯的抽象。您可以将抽象视为漫画,是实际事物(或概念)的一个版本,与原始事物的相似之处尽可能少,而不是尽可能多地完全复制。

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

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

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

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

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

【讨论】:

    【解决方案2】:

    相同的抽象级别:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-02
      • 2018-04-17
      • 2022-01-20
      相关资源
      最近更新 更多