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

vue 混入对象

让我立刻说,我们将在这里讨论的功能是那些迫切需要进行放线手术的人带给面向对象编程的纯粹的毒药 ,就像David West在他的《 Object Thinking》一书中所建议的那样。 这些功能具有不同的名称,但是最常见的是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

vue 混入对象

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

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

相关文章

glup node 内存不够_Redis:内存被我用完了!该怎么办?

介绍Redis是一个内存数据库,当Redis使用的内存超过物理内存的限制后,内存数据会和磁盘产生频繁的交换,交换会导致Redis性能急剧下降。所以在生产环境中我们通过配置参数maxmemoey来限制使用的内存大小。当实际使用的内存超过maxmemoey后&…

pytest框架_Python最火的第三方开源测试框架——pytest

一、介绍本篇文章是介绍的是Python 世界中最火的第三方单元测试框架:pytest。它有如下主要特性:assert 断言失败时输出详细信息(再也不用去记忆 self.assert* 名称了)自动发现测试模块和函数模块化夹具用以管理各类测试资源对 unittest 完全兼容&#xf…

jvm jstat_使用jstat的JVM统计信息

jvm jstat过去,我已经写过关于Oracle和/或OpenJDK Java开发工具包(JDK)附带的几个命令行工具的信息,但是我从来没有专门写过jstat工具 。 Oracle JDK 9文档Early Access指出jstat用于“监视Java虚拟机(JVM)…

win10录屏工具_win10怎么录屏?这才是最长情陪伴你的录屏工具

win10怎么录屏?现在看视频的用户是越来越多了,一些经验类的视频教程越来越多,不仅能够教我们学习技能,也能给我们看一些会员才能看的视频内容,他们怎么怎么做的呢?当然是电脑录屏了,由于现在的电…

python多行注释符号_涨知识Python 为什么用 # 号作注释符?

- START -关于编程语言中的注释,其重要性基本上已为大家所共识。然而关于注释的规范,这个话题就像我们之前聊过的缩进、终止符和命名方式一样,众口难调。注释符通常可分为两种,即行注释与块注释(inline/block),它们在不…

Sublime Text如何安装和卸载插件

文章目录如何查找插件如何安装插件通过包控制器安装插件手动安装插件如何卸载插件如何查找插件 建议先通过插件库来搜索你想要的插件,找到你想要的插件之后,你再选择安装方式进行安装,搜索插件请点击以下链接: Package Control中…

@insert 对象_python中列表插入append(), extend(), insert()

1 append()append:只能接收一个参数,并且只能添加在列表的最后。添加数字 In [1]: a [1,2,3] In [2]: a.append(4) In [3]: a Out[3]: [1, 2, 3, 4] 添加字符串 In [6]: a [1,2,3] In [7]: a.append("daniel") In [8]: a Out[8]: [1, 2, 3, …

常用jdk的命令行工具:_jhsdb:JDK 9的新工具

常用jdk的命令行工具:我喜欢在分析性能和基于Java的应用程序的其他问题的早期步骤中使用JDK随附的命令行工具,并在诸如jcmd , jps , jstat , jinfo , jhat和jmap , jrunscript , jstack之类的 工…

佳能2900打印机与win10不兼容_佳能2900打印机和惠普1020哪种好 佳能2900打印机和惠普1020对比【详解】...

现在的人们早已经习惯遇到身边美丽的景色,就用手机进行拍摄下来了,若想长久的留住这一刻的美好,拥有一台 打印机 就是很不错的选择,如今打印机的需求量在不断的增加,市面上的打印机品牌也在不断的增多,我们…

mysql 多表查询 join on_mysql多表查询

在做连表查询的时候,可以在联合的字段上面,分别加上索引字段,这样有加快搜索的速度左右连表查询时条件放在on后面和where后面的执行时机是不一样的例如test1表test2表执行SELECT * FROM test1 t1 LEFT JOIN test2 t2ON t1.not2.no AND t2.nam…

redis key失效的事件_《分享几道高频 Redis 高频面试题,面试不用愁》

1、说说 Redis 都有哪些应用场景?缓存:这应该是 Redis 最主要的功能了,也是大型网站必备机制,合理地使用缓存不仅可以加 快数据的访问速度,而且能够有效地降低后端数据源的压力。共享Session:对于一些依赖 …

解决文件内容的中文乱码_字符集_字符编码_字符编码方案

从第三方下载的java源文件,打开查看里面的中文全部是乱码,无论你使用什么字符编码集都无法正常显示,该文件是用UTF-8编码存档的,使用UTF-8解码也同样是乱码,相信很多人遇到类似的问题,我这里解决过一个经典…

rust为什么显示不了国服_捋捋 Rust 中的 impl Trait 和 dyn Trait

缘起一切都要从年末换工作碰上特殊时期, 在家闲着无聊又读了几首诗, 突然想写一个可以浏览和背诵诗词的 TUI 程序说起. 我选择了 Cursive 这个 Rust TUI 库. 在实现时有这么一个函数, 它会根据参数的不同返回某个组件(如 Button, TextView 等). 在 Cursive 中, 每个组件都实现了…

mysql不支持子查询_MySQL不支持子查询优化一例

一创建表 create table tt1(id int primary key, c1 INT);create table tt2(id int primary key, c2 INT);insert into tt1 value一创建表create table tt1(id int primary key, c1 INT);create table tt2(id int primary key, c2 INT);insert into tt1 values(1,1),(2,2),(3,3…

Mysql索引使用情况_介绍mysql索引失效的情况

mysql视频教程栏目索引失效的情况。索引对于MySQL而言,是非常重要的篇章。索引知识点也巨多,要想掌握透彻,需要逐个知识点一一击破,今天来先来聊聊哪些情况下会导致索引失效。图片总结版相关免费学习推荐:mysql视频教程…

java 类 null_深入理解java中的null“类型”

本文研究的主要是java中的null“类型”的相关实例,具体介绍如下。先给出一道简单的null相关的题目,引发我们对null的探讨,后面会根据官方语言手册对null“类型”进行解读。题目:下面程序能正确运行吗?解析:输出应该为 …

如何彻底禁用Chrome浏览器的缓存功能

禁止Chrome浏览器的缓存功能有几种方式: 使用Shift F5强制刷新缓存。实际使用中我们发现,这种方法对于部分网页的更改并不能做到释放缓存的作用,尤其是无法释放DNS缓存。 使用隐身模式Shift Control N. 这种方法只能在打开的页面上消除之…

java int integer内存_java中一个integer对象的内存占用是多少?可以通过java方法输出吗?...

今天翻记录看到了自己15年3月份提的问题,现在已经18年6月份了;去年线上项目出现内存瓶颈,原因是缓存的玩家角色数据过多,在长时间不停服的情况下,导致数据越来越膨胀,之前没有清除无用缓存的机制&#xff0…

windows查看器无法打开图片_关于windows微软商城无法打开 错误代码0x80004003问题...

我本来是商城可以进 但是一打开里面的东西就无法打开 按下面的刷新就闪退 如下图操作桌面winr 运行 services.msc然后找到windows update打开就行 但是开启了系统会自动更新若是修改时显示拒绝访问桌面winr 输入regedit打开注册表 注册表找到HKEY_LOCAL_MACHINESYSTEMCurrentCo…

win10 java 反编译_win10下对.java源文件进行编译和反编译的步骤

1、先写好代码,如下找了个示例代码,文件名是Mutex.java:package com.huangshiyi.concurrent.cha04;import java.util.concurrent.TimeUnit;public class Mutex {private final static Object MUTEX new Object();public void accessResource…