我正在读一本名为“干净代码”的书。当作者试图告诉我们如何编写一个有效的函数时,它会陷入困境。他说,"为了确保我们的功能正在做“一件事”,我们需要确保 我们函数中的语句都处于相同的抽象层次"。 那么作者究竟想通过抽象层次来传达什么呢?
答案 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
)知之甚少。
因此,在设计程序或应用程序时,要特别注意识别其不同的层次。然后,在编写函数时,请确保其代码只属于您的一个抽象中。