写点什么

OOP:超脱动词 / 名词隐喻,完成更好的设计

  • 2007-11-07
  • 本文字数:894 字

    阅读完需:约 3 分钟

为了表达面向对象编程,对象常常被看作是“名词”,而确定其行为的动作则被看作是“动词”。这些“动词”一般被实现为方法,即系统地与“实施”动作的对象联系起来。在近期的一篇博客文章中, Reg Braithwaite 指出,“有两方面,一是主动方的实体应该拥有该动词的定义;二是被动方的实体不应该拥有该动词的定义,然而并非所有的‘动词’都能清楚地区分两者”。Braithwaite 举出的一些交互操作就属于这样的情况,例如将动词联系到对象身上可能导致“代码重复和信息外泄”。他认为可能有必要将一些动词与名词相脱离,并将之提升到与名词相同的抽象层次:

有些动词从属于名词,但也许有些动词独立自主会更好?比如 + 和 <=> 之类?真应该把它们从对象的奴役下解放出来,应该让它们有自己的定义。

Buko Obele 对动词 / 名词隐喻的正当性提出了质疑。他认为,与真正的动词和名词不同,对象和方法不能彼此独立:

“人”这个词放在句子中并不依赖于任何一个动词 [……]。在现实中我们并不会说一个不能“跑”的人不是一个人 [……]。在面向对象设计中,概念根本不能脱离它们的方法而存在——相反,对象严格地由它们的方法所构成,这正是面向对象的要旨。

而且,在现实的语言中使用隐喻会令“主语和动词以及其它句法关系”产生混淆,从而“产生出全新的概念”,“语言卓绝的创造力量”即源于此。但在编程中是没有隐喻的。因此,对象仅仅是一个非常狭窄的概念,它与其它概念结合在一起“以表达出对一个问题的解答”。

虽然 Buko Obele 认为应该超脱出动词 / 名词的想象,但他与 Braithwaite 的结论却殊途同归,两者都对传统的 OOP 方法提出疑问。一方面 Braithwaite 提出了分离动词与名词的一些想法,另一方面 Obele 则提倡注重他认为是不可避免的软件设计主题,“无论使用的是对象、函数还是 DSL,甚至伟大的 Lisp”:

动词“属于”谁这个问题本身就是错误的;真正的问题是一个新概念如何有意义地加入到我们现有的系统中。 [……]

名词、动词这类说法在一开始是有用的,但最终你还是要深入地思索,使出你在抽象化方面的本事,才能描述一个不那么粗浅的系统。

查看英文原文: OOP: Thinking beyond verb/noun metaphor to yield a better design

2007-11-07 09:07891
用户头像

发布了 225 篇内容, 共 63.6 次阅读, 收获喜欢 50 次。

关注

评论

发布
暂无评论
发现更多内容

快照隔离级别原理 | StoneDB 技术分享 #1

StoneDB

MySQL 数据库 HTAP StoneDB

2023-07-18:给你一个正整数数组 nums,请你移除 最短 子数组(可以为 空), 使得剩余元素的 和 能被 p 整除。 不允许 将整个数组都移除。 请你返回你需要移除的最短子数组的长度,如果

福大大架构师每日一题

福大大架构师每日一题

《Programming Abstractions In C》阅读笔记p69-p71

codists

【活动】30 秒上云体验,一键体验 RocketMQ 六大生产环境

阿里巴巴云原生

阿里云 云原生 Apache RocketMQ

B站&华为云 | 融合虚实宇宙,开启云上视听的黄金时代

白洞计划

AI B站

Ubuntu 20.04系统编译安装Nginx1.22教程。

百度搜索:蓝易云

nginx 云计算 Linux ubuntu 运维

演讲实录:以 AI 变革组织运营与管理

Kyligence

数据分析 数智化 企业级OLAP

Mediabox:年度最佳音视频开发工具

阿里云视频云

云计算 阿里云 音视频 视频云

代码随想录 Day21 - 二叉树(七)

jjn0703

一文读懂Hhybrid App开发模式

没有用户名丶

Linux搭建我的世界MC服务器 - MCSM面板教程。

百度搜索:蓝易云

云计算 Linux 运维 Minecraft MCSM

Linux之Cnetos7.6安装Vue.js教程。

百度搜索:蓝易云

vue.js 云计算 Linux centos 运维

LCD拼接屏、LED显示屏和OLED显示屏的主要区别

Dylan

LCD1602液晶显示屏 LED显示屏 led显示屏厂家 OLED

GreatSQL通过错误日志信息判断数据库实例是如何关闭的

GreatSQL

数据库 greatsql

解决直播间源码音视频不同步问题的有效方式——山东布谷科技创作

山东布谷科技

软件开发 实时音视频 源码搭建 直播源码 直播间

云拨测全面升级丨单次拨测低至 0.001 元

阿里巴巴云原生

阿里云 云原生 可观测

分布式系统中的数据复制

越长大越悲伤

分布式 数据复制

人工智能革命|是疯狂炒作还是大势所趋?

SEAL安全

B2C #人工智能 ChatGPT 企业号 7 月 PK 榜 趋势解读

实施Scrum敏捷开发必选的敏捷工具

顿顿顿

Scrum 敏捷开发 项目管理工具 Scrum Master 敏捷开发管理工具

shardingsphere配置读写分离集群(1主2从结构)

zhengzai7

读写分离 ShadingSphere

Java 踩坑 2|Feign Client 访问到 Consul 脏节点/故障节点

itschenxiang

Java Consul springboot

机器学习之PyTorch和Scikit-Learn第3章 使用Scikit-Learn的机器学习分类器之旅Part 2

Alan

人工智能 机器学习 PyTorch scikit-learn

时序数据库 TDengine 与金山云两大产品完成兼容互认证

爱倒腾的程序员

数据库

C语言如何实现DES加密与解密

梦笔生花

从零开始实现Go搜索引擎(一)

geange

搜索引擎 lucene #数据库 FST #go

Ubuntu 20.04系统编译安装Apache教程。

百度搜索:蓝易云

Apache 云计算 Linux ubuntu 运维

数字化转型与架构-规划篇|承上启下的能力热力图

数字随行

数字化转型

JavaScript 的优雅编程技巧:Singleton Pattern

Immerse

JavaScript 设计模式 单例模式

大模型基础学习

天天向上

如何处理需求池?管理需求池的内容

Bonaparte

产品 产品设计 产品思维 产品需求

Nautlius Chain主网正式上线,模块Layer3时代正式开启

大瞿科技

OOP:超脱动词/名词隐喻,完成更好的设计_架构_Sadek Drobi_InfoQ精选文章