【js设计模式】SOLID五大设计原则


Posted in Javascript onMarch 24, 2022

【js设计模式】SOLID五大设计原则

【js设计模式】SOLID五大设计原则

一、用Promise来说明单一职责原则、开放封闭原则。
function loadImg(src){
var promise = new Promise(function(resolve,reject){
var img = document.createElement('img')
img.onload = function(){
resolve(img)
}
img.onerror = function(){
reject('图片加载失败')
}
img.src = src
})
return promise
}
var src = "https://avatar.csdn.net/5/A/C/3_ttian6.jpg";
var result = loadImg(src)
result.then(function(img){
console.log(img.width)
return img
}).then(function(img){
console.log(img.height)
}).catch(function(ex){
// 统一捕获异常
console.log(ex)
})
  1. // 1、单一原则:每个then只做一件事.
    // 2、开放封闭原则:如果有新的需求继续写then即可。
    二、Unix哲学
    以下内容摘自《Linux/Unix设计思想》第一章Unix哲学:集思广益的智慧。

    Unix哲学的几条准则看似简单。事实上,它们简单到会容易使人们忽略其重要性。这就是它们颇具欺骗性的地方。其实,简单的外表下掩盖着一个事实:如果人们能够始终如一的贯彻它们,这些准则可是非常行之有效的。

    以下这份清单会让你对Unix哲学的准则有初步的认识。

    (1)小即是美。相对于同类庞然大物,小巧的事物有着其无可比拟的巨大优势。其中一点就是它们能够以独特有效的方式结合其他小事务,而且这种方式往往是最初的设计者没能预见的。

    (2)让每一个程序只做好一件事情。通过集中精力应对单一任务,程序可以减少冗余代码,从而避免过高的开销、不必要的复杂性和缺乏灵活性。

    (3)尽快建立原型。大多数人认同“建立原型是任何项目的一个重要组成部分。在其他方法论中,建立原型只是设计中一个不太重要的组成部分,然而,在Unix环境下它却是达成完美设计的主要工具。

    (4)舍高效率而取可移植性。当Unix作为第一个可移植系统而开创先河时,它曾经掀起过轩然大波。今天,可移植性早被视作现代软件设计中一个理所当然的特性,这更加充分说明这条Unix准则早就在Unix之外的系统中获得了广泛认可。

    (5)使用纯文本文件来存储数据。舍高效率而取可移植性强调了可移植代码的重要性。其实可移植性数据的重要性绝不亚于可移植代码。在关于可移植性的准则中,人们往往容易忽视可移植性数据。

    (6)充分利用软件的杠杆效应。很多程序员对可重用代码模块的重要性只有一些肤浅认识。代码重用能帮助人们充分利用软件的杠杆效应。一些Unix的开发人员正是遵循这个强大的理念,在相对较短的时间内编写出了大量应用程序。

    (7)使用shell脚本来提高杠杆效应和可移植性。shell脚本在软件设计中可谓是一把双刃剑,它可以加强软件的可重用性和可移植性。无论什么时候,只要有可能,编写shell脚本来替代C语言程序都不失为一个良好的选择。

    (8)避免强制性的用户界面。Unix开发人员非常了解,有一些命令用户界面为什么会被称为是“强制性的"用户界面。这些命令在运行的时候会阻止用户去运行其他命令,这样用户就会成为这些系统的囚徒。在图形用户界面中,这样的界面被称为”模态“。

    (9)让每一个程序都成为过滤器。所有软件程序共有的最基本特性就是,它们只是修改而从不创造数据。因此,基于软件的过滤器本质,人们就应该把它们编写成执行过滤器任务的程序。

    以上列出Unix开发人员所奉行的信条。这些都是大家公认的Unix基本理念。如果你也采用这些标准,那么人们就会认为你是一个”Unix人er“。

    下面还列出了10条次要准则,这些准则正在渐渐发展成Unix世界信奉体系的一个组成部分。并非每个与Unix打交道的人都会将它们奉为信条,而且在严格意义上其中一些不能算作是Unix的特性。不过,它们看起来依然是Unix文化(当然地也包括Linux文化)不可或缺的一部分。

    (1)允许用户定制环境。Unix用户喜欢掌控系统环境,并且是整个环境。很多Unix应用程序绝对不会一刀切地使用交互风格,而是将选择的权利交给用户。它的基本思想就是,程序应该只是提供解决问题的机制,而不是为解决问题的方法限定标准。让用户探索属于自己的通往计算机的家境之路吧。

    (2)尽量使操作系统内核小而轻巧。尽管对新功能的追求永无止境,Unix开发人员还是喜欢让操作系统最核心部分保持最小的规模。当然,他们并不总是能做到这一点,但这是他们的目标。

    (3)使用小写字母,并尽量保持简短。使用小写字母是Unix环境中的传统,尽管这么做的理由已不复存在,但人们还是保留了这个传统。今天,许多Unix用户之所以要使用小写的命令和神秘的名字,不再是因为有其限制条件,而是他们就喜欢这么做。

    (4)保护树木。Unix用户普遍不太赞成使用纸质文档。而是在线存储所有文字档案。此外,使用功能强大的在线工具来处理文件是非常环保的做法。

    (5)沉默是金。在需要提供出错信息的时候,Unix命令是出了名的喜欢保持沉默。虽然很多经验丰富的Unix用户认为这是可取得做法,可其他操作系统的用户却并不赞同这种观点。

    (6)并行思考。大多数任务都能分解成更小的子任务。这些子任务可以并行运行,因而,在完成一项大任务的时间内,可以完成更多子任务。今天已涌现出大量对称处理(symmetric multiprocessing,SMP)设计,这说明计算机行业正朝着并行处理的方向发展。

    (7)各部分之和大于整体。小程序集合而成的大型应用程序比单个的大程序更灵活,也更为实用,本条准则正式源于此想法。两种解决方案可能具备同样的功能,可集合小程序的做法更具有前瞻性。

    (8)寻找90%的解决方案。百分百的完成任何事情都是很困难的。完成90%的目标会更有效率,并且更节省成本。Unix开发人员总是在寻找能够满足目标用户90%要求的解决方案,剩下的10%则任其自生自灭。

    (9)更坏就是更好。Unix爱好者认为具有”最小公分母“的系统是最容易存活的系统。比起高品质而昂贵的系统,那些便宜但有效的系统更容易得到普及。于是,PC兼容机的世界从Unix世界借鉴了此想法,并取得了巨大成功。这其中的关键字就是包容。如果某一事物的包容性强到足以涵盖几乎所有事物,那它就比那些”独家”系统要好得多。

    (10)层次化思考。Unix用户和开发人员都喜欢层次来组织事物。例如,Unix目录结构是最早将树结构应用于文件系统的架构之一。Unix的层次化思考已扩展到其他领域,如网络服务命名器、窗口管理、面向对象开发。

    作者Mike Gancarz是美国佐治亚州亚特兰大市的一名编程及应用顾问。他的团队使用Linux、Unix和Java工具,为金融服务行业开发出多个获奖的解决方案。作为Unix应用程序设计专家,他不遗余力的推广Unix已达二十多年。作为开发出X Window System的团队成员,Mike Gancarz还始创了一些至今仍应用在Linux的最新窗口管理器中的可用性观念。

    作为刚刚从windows转移到linux系统学习的人来说,linux显得那么的不近人情。就像书中所描述的那样,甚至于在Windows中只需要点一下鼠标就可以完成的任务在Linux中却要通过键入命令来实现,感觉它是那么的不方便!但是时间久了就会慢慢感觉到linux所蕴涵的智慧和解决问题的效率。正如我们所知道的那样,在Linux中你是自由的,你不必一味的去迎合系统,因为你就是掌舵者,系统中的一切都听从你的安排,只要你愿意。我喜欢Linux的个性,无论世界多么的飞扬浮躁,它始终如一的坚持着自己的信念。“小即是美”、“只做好一件事情”、“各部分之和大于整体”……等等的这些“Unix人”所奉行的理念有着更深层次的含义,其不仅可以指导我们如何在Linux中生存,更可以用来当作我们人生的指导思想,指引我们寻找属于我们自己的人生意义。

Javascript 相关文章推荐
jQuery UI Datepicker length为空或不是对象错误的解决方法
Dec 19 Javascript
js+css实现有立体感的按钮式文字竖排菜单效果
Sep 01 Javascript
jQuery实现网页顶部固定导航效果代码
Dec 24 Javascript
jquery实用技巧之输入框提示语句
Jul 28 Javascript
jQuery实现将div中滚动条滚动到指定位置的方法
Aug 10 Javascript
JavaScript实现页面定时刷新(定时器,meta)
Oct 12 Javascript
如何用js判断dom是否有存在某class的值
Feb 13 Javascript
原生JS实现图片翻书效果
Feb 16 Javascript
angular.js 路由及页面传参示例
Feb 24 Javascript
JavaScript实现学生在线做题计时器功能
Dec 05 Javascript
NProgress显示顶部进度条效果及使用详解
Sep 21 Javascript
js判断鼠标移入移出方向的方法
Jun 24 Javascript
什么是SOLID
Vue3中toRef与toRefs的区别
Mar 24 #Vue.js
Javascript的promise,async和await的区别详解
Mar 24 #Javascript
一起来看看Vue的核心原理剖析
Mar 24 #Vue.js
手写Spirit防抖函数underscore和节流函数lodash
Mar 22 #Javascript
深入讲解Vue中父子组件通信与事件触发
Mar 22 #Vue.js
关于Vue中的options选项
Mar 22 #Vue.js
You might like
PHPlet在Windows下的安装
2006/10/09 PHP
用PHP制作静态网站的模板框架(三)
2006/10/09 PHP
实现php加速的eAccelerator dll支持文件打包下载
2007/09/30 PHP
PHP漏洞全解(详细介绍)
2012/11/13 PHP
php strnatcmp()函数的用法总结
2013/11/27 PHP
php json相关函数用法示例
2017/03/28 PHP
Laravel 框架返回状态拦截代码
2019/10/18 PHP
解决FLASH需要点击激活的代码
2006/12/20 Javascript
window.onload 加载完毕的问题及解决方案(上)
2009/07/09 Javascript
防止动态加载JavaScript引起的内存泄漏问题
2009/10/08 Javascript
JSON取值前判断
2014/12/23 Javascript
jQuery中DOM树操作之使用反向插入方法实例分析
2015/01/23 Javascript
JavaScript通过事件代理高亮显示表格行的方法
2015/05/27 Javascript
详解JavaScript基于面向对象之继承实例
2015/12/16 Javascript
JavaScript String(字符串)对象的简单实例(推荐)
2016/08/31 Javascript
简单模拟node.js中require的加载机制
2016/10/27 Javascript
基于Bootstrap框架实现图片切换
2017/03/10 Javascript
JavaScript中七种流行的开源机器学习框架
2018/10/11 Javascript
一篇文章介绍redux、react-redux、redux-saga总结
2019/05/23 Javascript
vue.js实现图书管理功能
2019/09/24 Javascript
[39:19]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第二场 11.26
2020/11/30 DOTA
Python threading多线程编程实例
2014/09/18 Python
使用IPython来操作Docker容器的入门指引
2015/04/08 Python
Django与JS交互的示例代码
2017/08/23 Python
Django自定义manage命令实例代码
2018/02/11 Python
Python使用progressbar模块实现的显示进度条功能
2018/05/31 Python
pymysql 插入数据 转义处理方式
2020/03/02 Python
解决Django中checkbox复选框的传值问题
2020/03/31 Python
virtualenv介绍及简明教程
2020/06/23 Python
HTML5实现分享到微信好友朋友圈QQ好友QQ空间微博二维码功能
2018/01/03 HTML / CSS
德国二手设计师时装和复古时装跳蚤市场:Mädchenflohmarkt
2020/11/09 全球购物
校园安全广播稿范文
2014/09/25 职场文书
教师党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
家长给老师的感谢信
2015/01/20 职场文书
学习经验交流会策划书
2015/11/02 职场文书
Python MNIST手写体识别详解与试练
2021/11/07 Python