代码之家  ›  专栏  ›  技术社区  ›  GurdeepS

“获得正确的抽象级别”是什么意思?

oop
  •  3
  • GurdeepS  · 技术社区  · 14 年前

    我已经读过编程中的一项困难工作是如何“以正确的抽象级别”编写代码的。虽然抽象通常隐藏在一个层后面的细节,但是在正确的抽象层次上写一些东西基本上能使实现决策的方法正确吗?例如,如果我要写一个类来表示一辆车,我将为轮子等提供属性,但是如果我被要求为一辆没有轮子的车写一个类,我将不提供轮子,因此没有方法来“驾驶”这辆车。这就是正确抽象的含义吗?

    谢谢

    3 回复  |  直到 14 年前
        1
  •  10
  •   Reese Moore    14 年前

    不完全是,

    提供正确的抽象级别就是知道从较低级别传递给您的信息有多少。

    假设您正在编写一个高级HTTP库。也许你会提供一个get()方法,一个head()方法,一个post()方法etcetera,但是你不需要提供对底层套接字的访问,因为你是在从用户那里抽象这些细节。

    在您使用的套接字下面,有一些您不需要处理的抽象层。(您只访问下面一个层的抽象,除此之外,处理下面的层是该层的工作,以此类推)。

    例如,您不关心滑动窗口流控制协议,因为TCP正在抽象这些细节。

    ——
    如果您在一个抽象层中为您试图实现的目的而进行的编码太高,那么您将遇到多个实现细节。当你和图书馆争夺控制权时,这表明你的工作水平可能太高了。

    相反,如果您的编码水平太低,那么您将在实现细节中丢失。回到我的HTTP示例,如果您只想对服务器运行一个GET请求,并且在代码中实现一个TCP握手,那么您可能想要尝试使用一个库,或者将您的TCP代码抽象到一个库中,并通过它与之接口。

    ——
    在我上这门课的时候,老师有一种解释抽象的有趣方法。他让我们把它们简单地看作是一个对象或场景的“观点”或“视角”。

    从一个角度来看,那些重要的细节在另一个角度上根本不重要。

    他把一本书放在桌子上,给学生们分配角色,比如“读者”、“书商”、“作者”、“图书管理员”或“图书托运人”,并问我们在这个角色中,我们认为这本书的哪些细节对我们很重要。根据分配给一个人的名单,他们的答案差异很大。

    这表示一个抽象。只需要那些对你来说很重要的细节,并且让所有其他的细节都在别处处理(或者只是顺其自然)。

        2
  •  3
  •   duffymo    14 年前

    我不这么认为。

    对我来说,抽象是泛化的同义词。越是抽象的东西,作者越是试图以一种更容易扩展和应用到新问题的方式来思考问题。

    一般来说,更大的抽象需要更多的开发和理解工作。如果你是一个开发人员,并且你被赋予了一个高度抽象的框架,那么你将不得不从框架的角度来思考,而不是使用你的常识可能建议的概念。

    所以,就像在您的示例中一样,汽车是一个非常低的抽象级别。滚动车辆可能是更高的车辆,而运输可能是最抽象的。

    正确的选择取决于您希望应用类的范围有多广,以及您希望它们有多容易理解。

        3
  •  1
  •   jdecuyper    14 年前

    我认为抽象的一个危险方面是它擦除或隐藏现实或它所代表的设计的能力。你应该始终保持一个合理的距离,你所代表的和代表。“合理”是指外部开发人员很容易理解为什么没有在这个特定的项目上编码。

    乔尔·斯波斯基说,谈论 "architecture astronauts" :

    当伟大的思想家思考问题时,他们开始看到模式。他们研究了人们互相发送文字处理文件的问题,然后研究了人们互相发送电子表格的问题,他们意识到有一个一般的模式:发送文件。这已经是抽象的一个层次了。然后他们又上升了一个层次:人们发送文件,但是Web浏览器也“发送”网页请求。当你想到它的时候,对一个对象调用一个方法就像给一个对象发送一条消息!又是一回事!这些都是发送操作, 因此,我们聪明的思想家发明了一种新的、更高的、更广泛的抽象概念,称为消息传递,但现在它变得非常模糊,没有人真正知道他们在说什么了。瞎说 .