特性和混入不是面向对象的

让我立刻说,我们将在这里讨论的功能是那些迫切需要进行放线手术的人带给面向对象编程的纯粹的毒药 ,就像David West在他的《 Objecting Thought》一书中所建议的那样。 这些功能具有不同的名称,但最常见的是traits和mixins 。 我很不明白,当具有这些功能时,如何仍然可以调用面向对象的编程。

Terry Gilliam的《拉斯维加斯的恐惧与厌恶》(1998年)

首先,简而言之就是它们的工作方式。 让我们使用Ruby模块作为示例实现。 假设我们有一堂课Book

class Bookdef initialize(title)@title = titleend
end

现在,我们希望Book类使用一个静态方法(一个过程)来做一些有用的事情。 我们可以在实用程序类中定义它,然后让Book调用它:

class TextUtilsdef self.caps(text)text.split.map(&:capitalize).join(' ')end
end
class Bookdef printputs "My title is #{TextUtils.caps(@title)}"end
end

或者,我们可以使其变得更加“方便”,并extend我们的模块以便直接访问其方法:

module TextModuledef caps(text)text.split.map(&:capitalize).join(' ')end
end
class Bookextend TextModuledef printputs "My title is #{caps(@title)}"end
end

如果您不了解面向对象的编程和静态方法之间的区别 ,那似乎很好。 而且,如果我们暂时忘记了OOP的纯度 ,即使我的字符较少,这种方法实际上对我来说也不太可读。 很难理解caps()方法从何而来,就像#{caps(@title)}而不是#{TextUtils.caps(@title)} 。 你不觉得吗

当我们include它们include进来时,Mixins开始发挥更好的作用。 我们可以将它们结合起来以构造我们要寻找的类的行为。 让我们创建两个mixin。 第一个称为PlainMixin ,它将按PlainMixin打印书的标题,第二个称为CapsMixin ,并大写已打印的内容:

module CapsMixindef to_ssuper.to_s.split.map(&:capitalize).join(' ')end
end
module PlainMixindef to_s@titleend
end
class Bookdef initialize(title)@title = titleendinclude CapsMixin, PlainMixindef printputs "My title is #{self}"end
end

没有附带的mixin的Call Book将按原样打印其标题。 添加include语句后, to_s的行为将被覆盖,方法print产生不同的结果。 我们可以组合mixin来产生所需的功能。 例如,我们可以再添加一个,将标题缩写为16个字符:

module AbbrMixindef to_ssuper.to_s.gsub(/^(.{16,}?).*$/m,'\1...')end
end
class Bookdef initialize(title)@title = titleendinclude AbbrMixin, CapsMixin, PlainMixindef printputs "My title is #{self}"end
end

我确定您已经了解它们都可以访问Book类的私有属性@title 。 他们实际上可以完全使用课堂上的所有内容 。 从字面上看,它们是“代码片段”,我们将其注入到类中以使其更加强大和复杂。 这种方法有什么问题?

这与注解 , DTO , getter和实用程序类相同 —它们将对象拆开并将功能块放置在对象看不到它们的地方。

对于mixin,该功能位于Ruby modules ,该modulesBook的内部结构进行了假设,并进一步假设程序员在内部结构更改后仍将了解Book的内容。 这样的假设完全违反了封装的思想。

mixins和对象私有结构之间的这种紧密耦合不会导致无法维护和难以理解的代码。

mixin的非常明显的替代品是可组合装饰器 。 看一下文章中给出的示例:

Text text = new AllCapsText(new TrimmedText(new PrintableText(new TextInFile(new File("/tmp/a.txt"))))
);

它看起来与我们上面使用Ruby mixins所做的非常相似吗?

但是,与mixin不同,装饰器使对象较小且具有凝聚力,从而在它们之上分层附加功能。 Mixins的作用恰恰相反—它们使对象变得更复杂,并且因此使对象的可读性和可维护性降低。

老实说,我相信他们只是毒药。 发明它们的人距离理解面向对象设计的哲学还有很长的路要走。

您可能还会发现这些相关的帖子很有趣: 责任的纵向与横向分解 ; 复合名称是代码气味 ; 不变性的梯度 ; OOP中的反模式 ; 不可变对象如何具有状态和行为? ;

翻译自: https://www.javacodegeeks.com/2017/03/traits-mixins-not-oop.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模板匹配matchTemplate

C: void matchTemplate(InputArray image, InputArray templ, OutputArray result, int method); image:输入图像。必须为8位或者32位的浮点型。 templ:用于搜索的模板图像。必须小于输入图像并且是一样的数据类型。 result:匹配…

pandas处理csv

import pandas as pd from pandas import Series,DataFrame 打开csv文件 deli pd.read_csv(../得力.csv) 转换为DataFrame数据类型 df DataFrame(datadeli) 更改列名 df.rename(columns{"title":"商品名称","price":"价格","pr…

php 随机在文章中添加锚文本_SEO站长布局锚文本时的7大注意事项

通过对什么是锚文本链接、锚文本作用的讲解,以及怎样布局网站站内锚文本的介绍。相信大家都有了比较清晰的认识,也会重视网站锚文本的建设。但是菜鸟菌还是不得不再啰嗦点,锚文本虽然好处大大的,在布局锚文本的时候还是注意以下几…

OpenCV rectangle

void rectangle(Mat& img, Point pt1,Point pt2,const Scalar& color, int thickness1, int lineType8, int shift0) img 图像. pt1 矩形的一个顶点。 pt2 矩形对角线上的另一个顶点 color 线条颜色 (RGB) 或亮度(灰度图像 )(grayscale image…

【Java】NIO中Selector的select方法源码分析

该篇博客的有些内容和在之前介绍过了,在这里再次涉及到的就不详细说了,如果有不理解请看【Java】NIO中Channel的注册源码分析, 【Java】NIO中Selector的创建源码分析 Selector的创建在Windows下默认生成WindowsSelectorImpl对象,那…

简单小程序代码_小程序该如何运营

小型程序升级有三种最重要的方法:1.借助微信附近小程序功能实现客户扩展大家可能都知道,微信平台具有附近小程序的功能。此功能使用户可以查看周围五公里范围内的所有小程序。正是由于这个原因,一旦商人完成了这个小程序并加入了附近的小程序…

在javafx中界面主题_最小的JavaFX演示文稿(在JavaFX中)

在javafx中界面主题如果您要进行有关JavaFX的演示,那么使用JavaFX本身进行演示非常方便。 这样,您无需离开演示文稿即可轻松显示示例。 这是一个非常简单的示例。 在NetBeans中,设置一个新的JavaFX项目“ New Project”->“ JavaFX”->…

OpenCV cvLine

cvLine 函数原型: void cvLine( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness1, int line_type8, int shift0 ); img 图像。pt1 线段的第一个端点。pt2 线段的第二个端点。color 线段的颜色。thickness 线段的粗细程度。line_type 线段…

lengthOfLongestSubstring

lengthOflongestSubstring 试例: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 /**** param {string} s* 无重复字符的最长子串*/ function lengthOfLongestSubstring(s) {if (typeof s ! s…

编译原理--词法分析C++

一、实验项目要求 1.实验目的 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有…

python list转map_Python 进阶之术 Map Filter Reduce

" 本文字数:763 字 || 阅读时间:3分钟"Map Map 会将⼀个函数映射到⼀个输⼊列表的所有元素上。这是它的规范:规范 map(function_to_apply, list_of_inputs) ⼤多数时候,我们要把列表中所有元素⼀个个地传递给⼀个函数&a…

JavaFX动画工具

好的,我想是时候让您讲一个小秘密了。 在过去的大约三个月中,我从事一个私有项目,目标是创建一个工具,使我可以轻松地为Java桌面应用程序创建动画。 JavaFX在API级别上提供了出色的动画制作支持,但对于初学者甚至中级程…

ImageWatch的使用

1.能够实时显示图像和矩阵Mat的内容,跟Matlab很像,方便程序调试,相当好用。 下载地址: https://marketplace.visualstudio.com/items?itemNameVisualCPPTeam.ImageWatch 2.下载好插件ImageWatch,双击ImageWatch.vs…

springboot与任务(邮件任务)

邮件发送需要引入spring-boot-starter-mailSpring Boot 自动配置MailSenderAutoConfiguration定义MailProperties内容&#xff0c;配置在application.yml中自动装配JavaMailSender 测试邮件发送 pom文件配置&#xff1a; <!--邮件发送--><dependency><groupId&g…

具有ESB,API管理和Now ..服务网格的应用程序网络功能。

我最近谈论了微服务模式的演变&#xff0c;以及来自Lyft的Envoy之类的服务代理如何帮助将弹性&#xff0c;服务发现&#xff0c;路由&#xff0c;指标收集等责任推到应用程序下一层。 否则&#xff0c;我们冒着希望并祈祷各种应用程序将正确实现这些关键功能或依赖于特定语言的…

宝塔定时任务执行php源码任务_Linux at命令详解:定时执行任务

要想使用 at 命令&#xff0c;读者需提前安装好 at 软件包&#xff0c;并开启 atd 服务。因此&#xff0c;首先来看看如何安装 at 软件包。在 Linux 系统中&#xff0c;查看 at 软件包是否已安装&#xff0c;可以使用 rpm -q 命令&#xff0c;如下所示&#xff1a;[rootlocalho…

Eigen(1)配置VS2015

1.在Eigen官网下载Eigen&#xff1a; Windows选压缩包zip下载&#xff0c;点击一下即可。下载后解压。 2.配置VS2015 打开vs2013&#xff0c;可以新建一个项目&#xff0c;也可以打开以前的项目&#xff0c;右键项目名&#xff0c;选择属性&#xff0c;在c/c附加目录里加入解压…

尺度不变性是指什么不变_不变性的来龙去脉

尺度不变性是指什么不变因此&#xff0c;在我的第一篇文章中&#xff0c;我谈到了一些构建器模式&#xff0c;并提到了一个非常强大但却被忽视的概念&#xff1a;不变性。 什么是不可变类&#xff1f; 这只是一个其实例无法修改的类。 类属性的每个值都在其声明或其构造函数中…

光模块

一、光模块&#xff1a; 1、光模块&#xff08;opTIcalmodule&#xff09;由光电子器件、功能电路和光接口等组成&#xff0c;光电子器件包括发射和接收两部分。 发射部分是&#xff1a;输入一定码率的电信号经内部的驱动芯片处理后驱动半导体激光器&#xff08;LD&#xff09;…

radmin提示授权码过期_IdentityServer4 客户端授权模式(Client Credentials)

(给DotNet加星标&#xff0c;提升.Net技能)转自&#xff1a;朝闲cnblogs.com/Zing/p/13361386.html前言1、源码(.NET Core 2.2)git地址&#xff1a;https://github.com/yizhaoxian/CoreIdentityServer4Demo.git2、相关章节2.1、《IdentityServer4 (1) 客户端授权模式(Client Cr…