函数中的抽象层次
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
).
知之甚少
因此,在设计程序或应用程序时,要特别注意识别其不同层次。然后,在编写函数时,确保其代码仅属于您的一个抽象。
我正在读一本名为 '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
).
因此,在设计程序或应用程序时,要特别注意识别其不同层次。然后,在编写函数时,确保其代码仅属于您的一个抽象。