方法一:设计模式是为了消除继承

大部分设计模式,是让你在在面向对象的基础上尽量消除继承的手段。所以,如果你用了一些设计模式,减少了继承,那你八成用对了。如果你用了一大堆设计模式,然而继承却越来越频繁,那你100%用错了。

之所以说大部分,是因为个别设计模式(比如享元模式)是为了解决特殊场景特殊问题而生的。

方法二:良好的设计应该利于测试

一个设计合理的系统,因为解耦充分,各个模块独立性强,所以单元测试应该是比较容易写的。如果你用了一大堆设计模式,却发现给你写的类编写单元测试用例非常困难,那你一定是用错了。

方法三:多态是更好的if

多态的本质是运行期动态决定程序的分支走向,也就是“更好的if”,而设计模式,至少是《设计模式》那本书中提到的那些模式,基本上是基于多态的。所以如果你合理的利用设计模式,你设计出的代码应该有较少的if,如果你的代码越使用设计模式if越多,或者更直观地说,缩进越多,你一定犯了错误。

方法四:看不懂的模式先不要用

有些模式是很容易用错的,比如visitor模式,其实是为了解决java不支持double dispatch而存在的,然而其逻辑很晦涩。所以当你还在怀疑自己是否用对了设计模式的时候,你不应该使用这样的模式。

方法五:大部分类继承都是错误

类继承总的来说只有1.5种正确的打开方式:

  • 第一种叫做模板方法(template method),是设计模式之一。这种模式说的是基类在一个抽象的层面实现了公有方法a,a依赖私有方法b,而b的实现是子类的工作。这种模式下,子类实现的虚方法b是不应该被外界调用的。当然有一种极端情况,b即使a本身(比如react中的render),此时模板方法蜕化为普通的多态。
  • 第二种叫做mixin,类a通过继承一个基类b,获得某种相对独立的能力。然而这其实是一种不太好的设计,尤其是在需要mixin多种能力的时候,更合理的方式其实是在a内部创建b的实例。只是在比较简单的场景中,我们可以用继承糊弄一下,所以只能算0.5种。

除此之外,使用类继承基本上可以认为是错误的设计。

由此我们可以推论,在es6流行导致运行时mixin写法在前端不流行之后,前端代码中出现了一些新的设计错误。

方法六:不要模仿java的写法

设计模式是一回事,设计模式的实现是另一回事,这一点很重要。比如著名的观察者模式(observer),在java中有大量应用。然而我们常见的观察者模式样板代码之所以长那个样,是因为java中缺乏事件订阅系统。在c++/c#以及js中实现观察者模式,就没必要那样写。因为c++有std:function,c#有委托,而js函数干脆就是对象。

C# 子类实例化基类 基类使用不了子类的方法_老话题:6个方法,检验你有没有正确使用设计模式...相关推荐

  1. kotlin调用类中的方法_一种轻松的方法来测试Kotlin中令人沮丧的静态方法调用

    kotlin调用类中的方法 by Oleksii Fedorov 通过Oleksii Fedorov 一种轻松的方法来测试Kotlin中令人沮丧的静态方法调用 (A stress-free way t ...

  2. C# 子类实例化基类 基类使用不了子类的方法_C#高级编程面试考题

    一.简答题 1.简述C#中的所有访问修饰符及访问权限 private(私有的) 给类,及所有类成员使用 所有类成员的默认访问修饰符 可访问范围 当前类自身 public(公开的) 给类,及所有类成员使 ...

  3. C# 子类实例化基类 基类使用不了子类的方法_C#学习笔记09--构造方法/析构方法/继承/多态/封装...

    一.构造方法 当创建一个类时, 系统会自动创建一个默认的无参构造方法, 这个方法和类同名, 在创建对象的时候自动调用. 默认的构造方法里面什么也没有, 重写之后就可以在创建对象的时候同时搞点事情了. ...

  4. C# 子类实例化基类 基类使用不了子类的方法_C#中的类、方法和属性

    这节讲C#中的类,方法,属性.这是面向对象编程中,我们最直接打交道的三个结构.    类: 类(class)是面向对象中最基本的单元,它是一种抽象,对现实世界中事物的抽象,在C#中使用class关键字 ...

  5. 类型转换,类与类之间的转换,继承关系,继承与静态变量,子类父类重名,多继承,虚基类

     常量的基本类型转换,例如:int num(10.8),这种方式是隐式转换. 通过函数的构造函数实现转换. 类类转换函数,当构造函数不能将类型转换成基本类型时.所以就有了类类转换函数,通过这种方式 ...

  6. [C++] - 纯虚函数 抽象基类 接口类

    翻译自:https://www.learncpp.com/cpp-tutorial/126-pure-virtual-functions-abstract-base-classes-and-inter ...

  7. python 基类 派生类_在Python中具有两个子(派生)类的继承示例

    python 基类 派生类 In this program, we have a parent class named Details and two child classes named Empl ...

  8. c++继承 基类 派生类 虚函数

    继承   类和类的关系有组合.继承和代理.继承的本质就是代码复用.子类继承父类中的一些东西,父类也称为基类,子类也称为派生类.派生类继承了基类除构造函数以外的所有成员. 继承的方式   继承方式有pu ...

  9. 提供羟基、羧基、醚基、酯基、氨基、磺酸基、烯基、苄基、腈基、胍类等功能性离子液体定制合成服务

    提供羟基.羧基.醚基.酯基.氨基.磺酸基.烯基.苄基.腈基.胍类等功能性离子液体定制合成服务 根据阳离子分类,常规离子液体包含六大类:咪唑类.吡啶类.季铵类.季鏻类.吡咯烷类和哌啶类.功能化离子液体包 ...

最新文章

  1. 计算机组成原理文华学院,华中科技大学文华学院计算机组成原理课设.doc
  2. pytorch 索引
  3. jQuery .attr() vs .prop()
  4. [Noi2014]随机数生成器
  5. cobbler koan自动重装系统
  6. 怎样有效地推广APP
  7. [转载] python strptime函数转时间数组_python—时间与时间戳之间的转换
  8. 清理电脑文件夹中的Thumbs.db文件
  9. Jmeter创建大批量测试用户数据技巧
  10. 编写一个程序求解字谜游戏问题
  11. Virustotal使用
  12. 这个被上帝抛弃的国家,创立了全球一半的科技公司
  13. 宽带连接720错误代码解决办法
  14. 用html制作验证码英文数字,基于javascript实现数字英文验证码
  15. 计算机网络收集职业生涯规划的原则和步骤,职业生涯规划的步骤及原则介绍
  16. 快餐行业进入“黄金时代”,左手天堂右手地狱
  17. 基于单片机的贪吃蛇设计
  18. Java NIO(一)BIO vs NIO
  19. matlab 窄带高斯过程仿真,噪声干扰信号的Matlab仿真.doc
  20. Linux安装MATLAB 2017a

热门文章

  1. 最优传输理论和生成模型的几何观点
  2. 无监督构建词库:更快更好的新词发现算法
  3. 为节约而生:从标准Attention到稀疏Attention
  4. 图像语义分割:U-Net网络和PSP网络
  5. 电脑声音推送到手机话筒_一台电脑是不是就能做在线教育直播了?
  6. rust go java 性能_Java,Go和Rust之间的比较 - Dexter
  7. Spring-JdbcTemplate(注入到spring容器)-01
  8. LeetCode 6 Z 字形变换
  9. C#——《C#语言程序设计》实验报告——泛型与集合——运算符重载
  10. BugKuCTF 杂项 隐写2