”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 抽象:一种程序化的思维方式

抽象:一种程序化的思维方式

发布于2024-11-08
浏览:261

Abstractions: A Way of Thinking Programmatically

“为什么程序员拒绝起床?他们陷入了太多的抽象层!”

在编程中,就像在生活中一样,我们经常需要简化复杂的事情以使它们更易于管理。想象一下,试图向从未见过计算机的人解释互联网,您不会从谈论服务器和协议开始。相反,你可以使用类比、故事或简化版本来传达这个想法。这就是编程中抽象的意义所在:简化复杂的事情。

抽象:简单的秘诀
把编程想象成烹饪。当您遵循食谱时,您不会考虑烤箱中发生的化学反应;您会考虑烤箱中发生的化学反应。只要按照步骤做就可以做出一道美味的菜肴。编程中的抽象是类似的 - 它允许您专注于您想要实现的目标,而不必担心幕后的复杂细节。

什么是抽象?
抽象是管理编程复杂性的一种方法。它涉及创建复杂系统的简化模型,使您能够专注于高级操作而不是复杂的细节。通过抽象代码的某些部分,您可以更有效地工作、重用代码并减少出错的机会。

三明治隐喻:构建抽象层
让我们深入研究一个使用三明治比喻的实际例子。
1.成分(低级细节) 在最基本的层面上,你有成分:面包、生菜、番茄、奶酪和火鸡。这些就像编程中的原始数据或低级操作。它们很重要,但直接处理它们可能很麻烦。

例子:

let bread = "whole grain";
let lettuce = "romaine";
let tomato = "sliced";
let cheese = "cheddar";
let turkey = "smoked";

2.三明治(更高层次的抽象) 您无需单独处理每种成分,而是创建一个三明治。这是一个抽象概念,将各种成分捆绑在一起形成一个更易于管理的实体。

例子:

function makeSandwich(bread, lettuce, tomato, cheese, turkey) {
    return `${bread} sandwich with ${lettuce}, ${tomato}, ${cheese}, and ${turkey}`;
}
let myLunch = makeSandwich("whole grain", "romaine", "sliced", "cheddar", "smoked");

通过将细节抽象到 makeSandwich 函数中,您不必每次想要做午餐时都担心各个成分 - 您只需调用该函数即可。

3.午餐订单(甚至更高的抽象) 现在,如果您想在熟食店订购午餐怎么办?你甚至不需要考虑三明治的制作过程;您只需下订单即可。这是更高层次的抽象,您可以与更简化的界面进行交互。

例子:

function orderLunch(type) {
    if (type === "sandwich") {
        return makeSandwich("whole grain", "romaine", "sliced", "cheddar", "smoked");
    }
    // Other lunch options could go here
}
let myOrder = orderLunch("sandwich");

实际用例场景:构建用户界面
在构建复杂系统(例如用户界面(UI))时,抽象至关重要。假设您正在为社交媒体应用程序构建 UI。您无需为每个按钮、文本框和图像单独编写代码,而是创建代表它们的抽象组件。

function createButton(label) {
    return ``;
}
function createUserProfile(name, bio) {
    return `
        

${name}

${bio}

${createButton("Follow")}
`; } let profile = createUserProfile("Koobimdi", "Passionate about coding and storytelling.");

这里,createButton函数抽象了按钮的创建,createUserProfile函数抽象了用户配置文件。您并不是每次都处理原始 HTML 标签 - 只是更高级别的抽象。

需要注意的要点
抽象简化了复杂性:它允许您在更高的细节级别上工作,而无需担心底层的复杂性。
抽象层:您创建的抽象层越多,您就越能专注于每个级别的重要内容。
可重用性: 抽象允许您创建可在多个上下文中使用的通用函数或组件,从而鼓励可重用性。
效率:通过抽象重复性任务,您可以编写更高效且可维护的代码。

结论
抽象就像一个食谱,可以简化烹饪过程,让您可以制作复杂的菜肴,而不必陷入细节。在编程中,它是一个强大的工具,可以帮助您管理复杂性、更高效地工作并编写更简洁的代码。

“记住,当事情变得太复杂时,是时候抽象出解决办法了——就像厨房太乱时你点外卖一样!”

版本声明 本文转载于:https://dev.to/koobimdi/abstractions-a-way-of-thinking-programmatically-3cdc?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 反射动态实现Go接口用于RPC方法探索
    反射动态实现Go接口用于RPC方法探索
    在GO 使用反射来实现定义RPC式方法的界面。例如,考虑一个接口,例如:键入myService接口{ 登录(用户名,密码字符串)(sessionId int,错误错误) helloworld(sessionid int)(hi String,错误错误) } 替代方案而不是依靠反射...
    编程 发布于2025-05-11
  • 如何在GO编译器中自定义编译优化?
    如何在GO编译器中自定义编译优化?
    在GO编译器中自定义编译优化 GO中的默认编译过程遵循特定的优化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    编程 发布于2025-05-11
  • 如何使用Regex在PHP中有效地提取括号内的文本
    如何使用Regex在PHP中有效地提取括号内的文本
    php:在括号内提取文本在处理括号内的文本时,找到最有效的解决方案是必不可少的。一种方法是利用PHP的字符串操作函数,如下所示: 作为替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式来搜索特...
    编程 发布于2025-05-11
  • 如何使用FormData()处理多个文件上传?
    如何使用FormData()处理多个文件上传?
    )处理多个文件输入时,通常需要处理多个文件上传时,通常是必要的。 The fd.append("fileToUpload[]", files[x]); method can be used for this purpose, allowing you to send multi...
    编程 发布于2025-05-11
  • 切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    Unable to Connect to MySQL Database: Troubleshooting Error MessageWhen attempting to switch from the MySQL driver to the MySQLi driver in CodeIgniter,...
    编程 发布于2025-05-11
  • 图片在Chrome中为何仍有边框?`border: none;`无效解决方案
    图片在Chrome中为何仍有边框?`border: none;`无效解决方案
    在chrome 中删除一个频繁的问题时,在与Chrome and IE9中的图像一起工作时,遇到了一个频繁的问题。和“边境:无;”在CSS中。要解决此问题,请考虑以下方法: Chrome具有忽略“ border:none; none;”的已知错误,风格。要解决此问题,请使用以下CSS ID块创建带...
    编程 发布于2025-05-11
  • 在UTF8 MySQL表中正确将Latin1字符转换为UTF8的方法
    在UTF8 MySQL表中正确将Latin1字符转换为UTF8的方法
    在UTF8表中将latin1字符转换为utf8 ,您遇到了一个问题,其中含义的字符(例如,“jáuòiñe”)在utf8 table tabled tablesset中被extect(例如,“致电。为了解决此问题,您正在尝试使用“ mb_convert_encoding”和“ iconv”转换受...
    编程 发布于2025-05-11
  • 如何使用Python理解有效地创建字典?
    如何使用Python理解有效地创建字典?
    在python中,词典综合提供了一种生成新词典的简洁方法。尽管它们与列表综合相似,但存在一些显着差异。与问题所暗示的不同,您无法为钥匙创建字典理解。您必须明确指定键和值。 For example:d = {n: n**2 for n in range(5)}This creates a dicti...
    编程 发布于2025-05-11
  • `console.log`显示修改后对象值异常的原因
    `console.log`显示修改后对象值异常的原因
    foo = [{id:1},{id:2},{id:3},{id:4},{id:id:5},],]; console.log('foo1',foo,foo.length); foo.splice(2,1); console.log('foo2', foo, foo....
    编程 发布于2025-05-11
  • 为什么PYTZ最初显示出意外的时区偏移?
    为什么PYTZ最初显示出意外的时区偏移?
    与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
    编程 发布于2025-05-11
  • C++20 Consteval函数中模板参数能否依赖于函数参数?
    C++20 Consteval函数中模板参数能否依赖于函数参数?
    [ consteval函数和模板参数依赖于函数参数在C 17中,模板参数不能依赖一个函数参数,因为编译器仍然需要对非contexexpr futcoriations contim at contexpr function进行评估。 compile time。 C 20引入恒定函数,必须在编译时进行...
    编程 发布于2025-05-11
  • 如何使用Python的请求和假用户代理绕过网站块?
    如何使用Python的请求和假用户代理绕过网站块?
    如何使用Python的请求模拟浏览器行为,以及伪造的用户代理提供了一个用户 - 代理标头一个有效方法是提供有效的用户式header,以提供有效的用户 - 设置,该标题可以通过browser和Acterner Systems the equestersystermery和操作系统。通过模仿像Chro...
    编程 发布于2025-05-11
  • C++中如何将独占指针作为函数或构造函数参数传递?
    C++中如何将独占指针作为函数或构造函数参数传递?
    在构造函数和函数中将唯一的指数管理为参数 unique pointers( unique_ptr [2启示。通过值: base(std :: simelor_ptr n) :next(std :: move(n)){} 此方法将唯一指针的所有权转移到函数/对象。指针的内容被移至功能中,在操作...
    编程 发布于2025-05-11
  • 如何在鼠标单击时编程选择DIV中的所有文本?
    如何在鼠标单击时编程选择DIV中的所有文本?
    在鼠标上选择div文本单击带有文本内容,用户如何使用单个鼠标单击单击div中的整个文本?这允许用户轻松拖放所选的文本或直接复制它。 在单个鼠标上单击的div元素中选择文本,您可以使用以下Javascript函数: function selecttext(canduterid){ if(do...
    编程 发布于2025-05-11

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3