language-agnostic - 函数中的抽象级别
问题描述
我正在读一本名为“干净的代码”的书,当作者试图告诉我们如何编写一个高效的函数时,我被卡住了。他说,“为了确保我们的函数做‘一件事’,我们需要确保我们函数中的语句都处于相同的抽象级别”。那么作者究竟想通过抽象层次来传达什么?
解决方案
您可以将函数视为某种能力或行为的计算实现。
例如,如果您正在建模一个可以打开或关闭的灯,您可以在两个函数中捕获这些功能,switchON()
并且switchOFF()
. switch(b)
或者您可能更喜欢使用具有形式参数的单个函数b
等来实现相同的能力。在考虑这些考虑因素时,您对灯的概念已大大简化,因为您只会对真实灯的某些方面感兴趣:状态(开/关)、颜色等。根据灯与其他物体的关系,您将包括一些特征而忽略许多其他特征(例如,价格、重量等)。
定义模型的范围,即您将密切关注的特征,构成了您对灯的抽象。您可以将抽象视为漫画,是实际事物(或概念)的一个版本,与原始事物共享尽可能少的属性以使其相似,而不是尽可能多地完全复制它。
那么,什么是抽象级别呢?它是代表模型拥有的特定特征的一组属性和行为:与实现某个目标相关的特征和行为。
例如,如果您的目标是为交通灯建模,那么您的灯只需要能够打开和关闭,并具有绿色、红色、黄色之间的颜色。
现在假设您要对动态交通系统进行建模以优化城市中的车辆流量。您的抽象必须包括街道、十字路口、大道等。在构建模型时,您将在不同的层次之间切换:灯、交通灯、绿浪、高峰时间、节假日、周末。
作者试图传达的想法是,对于控制器的功能,例如circumvent(accident)
包含处理 的实现的代码行是不好的switch(b)
,因为这样的代码行属于不同的详细级别,即在不同的抽象层中,适合灯的实现。circumvent(accident)
类似地,在存储信息的数据库的某些子句中引用的主体是不好的SELECT
,因为这样的代码行只适合数据存储库级别(对accident
.
因此,在设计程序或应用程序时,要特别注意识别其不同的层次。然后,在编写函数时,确保它的代码只属于你的一个抽象。
推荐阅读
- linux - 如何从没有 $ 符号的代码段复制 bash 命令?
- c# - 当 UWP ComboBox 中的“IsEditable”为真时,如何将输入的文本显示为 Combobox 选定项?
- marklogic - gradle v3.16.4 的 mlDeploy 任务抛出错误
- react-native - React-Native 构造函数
- total.js - Total js中如何使用AJAX功能?
- angular7 - 我想在 for 循环中显示特定记录的标签文本
- laravel - 如何从 laravel 中的 8/29/2011 1:00 PM 之类的字符串中拆分日期和时间
- .net - 如何手动设置为未经授权并重定向到自定义页面?
- php - nginx 不使用 VSCode 远程容器扩展(docker compose)打开 localhost
- flutter - 从另一个屏幕移回屏幕后颤动调用一个函数