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 混入对象

vue 混入对象_特性和混入不是面向对象的相关推荐

  1. vue filter对象_学习vue源码(3) 手写Vue.directive、Vue.filter、Vue.component方法

    一.Vue.directive Vue.directive(id,[definition]); 1)参数 { string } id{ Function | Object } [ definition ...

  2. c++全局类对象_史上最全 Python 面向对象编程

    面向对象编程和函数式编程(面向过程编程)都是程序设计的方法,不过稍有区别. 面向过程编程: 1. 导入各种外部库 2. 设计各种全局变量 3. 写一个函数完成某个功能 4. 写一个函数完成某个功能 5 ...

  3. jsonarray转化list对象_第8篇:Cython的面向对象--Python类 vs Cython扩展类

    在Python中,一切都是对象. 具体来说是什么意思? 在最基本的层面上,一个对象具有三样东西 标识(id):对象的标识将其与其他对象区分开来,并由id内置函数提供 属性值(value):对象的值就是 ...

  4. vue 往对象中添加键值对_【Vue】Vue学习之混入

    今天学习了Vue中的"混入"知识点,写篇文章用自己的语言来向自己解释它,如有不足还望指点. 混入(mixins): 混入提供了一种非常灵活的方式,来分发Vue组件中的可复用功能 - ...

  5. Vue 一秒搞懂mixins混入

    在项目开发过程中,你是否会遇到此类问题:在多个组件中用到相同的方法.如果遇到此类问题,那么在多个组件中重复写同样的方法会显得非常繁琐,代码也会不好维护.就此,Vue提供了一个mixins混入的一个概念 ...

  6. vue 修改对象的值视图没有发生改变_在vue中处理对象属性改变视图不更新问题? - echart...

    ...图等等,但是这些代码比较难写,因此我们通常会用借助echarts,那你知道如何使用echarts吗?这篇文章就和大家讲讲echarts的使用方法,有一定的参考价值,感兴趣的朋友可以看看.以饼状图 ...

  7. vue js 对象下的原型_如何使用Vue.js和Pusher创建实时原型反馈应用程序

    vue js 对象下的原型 by Neo Ighodaro 由新Ighodaro 如何使用Vue.js和Pusher创建实时原型反馈应用程序 (How to create a realtime pro ...

  8. Vue之MVVM、Vue实例对象、生命周期

    1.初识Vue Vue是一套用于构建用户界面的渐进式框架,Vue 被设计为可以自底向上逐层应用,Vue的核心是只关注视图层(如何理解),不仅易于上手,还便于与第三方库或既有项目整合. 渐进式框架:渐进 ...

  9. Vue优化策略_项目发布_01

    文章目录 一.移除console 策略 1. 命令 1.1. 插件官网: 1.2. 安装babel-plugin-transform-remove-console 1.3. 在babel.config ...

最新文章

  1. iscsi-server端配置,以及clients连接。
  2. redis的学习使用,第二章
  3. EXCLE图形插入实例
  4. gradle exclude_Gradle学习记录020 java工程的测试 part1
  5. 领域驱动设计(DDD)的实践经验分享之持久化透明
  6. JS 设计模式 一(接口)
  7. Git submodule 知识总结
  8. 升级php5.4 mysql5.5_在CentOS上把PHP从5.4升级到5.5
  9. QNX多线程同步之Barrier(屏障)
  10. 个人知识体系思维导图_“知识体系”打得好,学霸孩子跑不了,巧用“思维导图”来帮忙...
  11. Oracle基础 TO_CHAR函数参考(转)
  12. python Flask 使用https 安全协议
  13. NSData的同步下载与NSConnection的同步下载
  14. 跨境电子商务营销策略分析以速卖通为例
  15. 物联网终端安全系列(之三) -- 物联网终端安全解决方案概述
  16. excel 将日期转换为8位数字
  17. WordPress采集插件推荐都是免费采集插件
  18. Notepad++ 插件 JsonViewer V1.40 64位32位
  19. QT下获取汉字拼音首字母
  20. Archlinux 安装Yaourt的方式

热门文章

  1. NOI.AC#2139-选择【斜率优化dp,树状数组】
  2. P3960-列队【权值线段树】
  3. 51nod-猴猴吃苹果【线段树】
  4. P2053-修车【网络流,费用流】
  5. 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(昆明) Cities(区间dp)
  6. 【最小生成树】水箱(P5952)
  7. 初级Java开发与架构之间的差距不仅仅是开发时间
  8. 面试进阶之字符串常量池
  9. Oracle入门(十四F)之PL/SQL定义变量
  10. 乐观锁的一种实现方式——CAS