【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 相关文章推荐
JS效率个人经验谈(8-15更新),加入range技巧
Jan 09 Javascript
Expandable "Detail" Table Rows
Aug 29 Javascript
关于html+ashx开发中几个问题的解决方法
Jul 18 Javascript
JavaScript设置首页和收藏页面的小例子
Nov 11 Javascript
用JS在浏览器中创建下载文件
Mar 05 Javascript
鼠标悬停小图标显示大图标
Jan 22 Javascript
vue.js的安装方法
May 12 Javascript
JavaScript去掉数组重复项的方法分析【测试可用】
Jul 19 Javascript
微信小程序网络请求封装示例
Jul 24 Javascript
vue.js实现的幻灯片功能示例
Jan 18 Javascript
element-ui多文件上传的实现示例
Apr 10 Javascript
微信小程序实现watch监听
Jun 04 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
Memcached常用命令以及使用说明详解
2013/06/27 PHP
Yii2主题(Theme)用法详解
2016/07/23 PHP
PHP将数据导出Excel表中的实例(投机型)
2017/07/31 PHP
Yii2.0框架模型添加/修改/删除数据操作示例
2019/07/18 PHP
JS 时间显示效果代码
2009/08/23 Javascript
网页中的图片的处理方法与代码
2009/11/26 Javascript
Array.prototype.slice 使用扩展
2010/06/09 Javascript
Jquery下attr和removeAttr的使用方法
2010/12/28 Javascript
基于javascipt-dom编程 table对象的使用
2013/04/22 Javascript
jQuery实现瀑布流的取巧做法分享
2015/01/12 Javascript
JS截取与分割字符串常用技巧总结
2015/11/10 Javascript
jQuery操作基本控件方法实例分析
2015/12/31 Javascript
详解Bootstrap的aria-label和aria-labelledby应用
2016/01/04 Javascript
jQuery实现的左右移动焦点图效果
2016/01/14 Javascript
详解AngularJS过滤器的使用
2016/03/11 Javascript
利用JS实现点击按钮后图片自动切换的简单方法
2016/10/24 Javascript
iview实现select tree树形下拉框的示例代码
2018/12/21 Javascript
JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析
2019/03/06 Javascript
说说如何利用 Node.js 代理解决跨域问题
2019/04/22 Javascript
在 Vue 应用中使用 Netlify 表单功能的方法详解
2019/06/03 Javascript
微信小程序基于高德地图查找位置并显示文字
2019/10/30 Javascript
Jquery+AJAX实现无刷新上传并重命名文件操作示例【PHP后台接收】
2020/05/29 jQuery
vue组件开发之slider组件使用详解
2020/08/21 Javascript
TypeScript魔法堂之枚举的超实用手册
2020/10/29 Javascript
vue实现标签云效果的示例
2020/11/09 Javascript
js用正则表达式筛选年月日的实例方法
2021/01/04 Javascript
python字符串中匹配数字的正则表达式
2019/07/03 Python
django之从html页面表单获取输入的数据实例
2020/03/16 Python
html5开发三八女王节表白神器
2018/03/07 HTML / CSS
美津浓巴西官方网站:Mizuno巴西
2019/07/24 全球购物
新驾驶员个人自我评价
2014/01/03 职场文书
毕业生求职自荐信怎么写
2014/01/08 职场文书
财务部副经理岗位职责范本
2014/06/17 职场文书
民政局副局长民主生活会个人整改措施
2014/10/04 职场文书
个人四风问题整改措施
2014/10/24 职场文书
python 镜像环境搭建总结
2022/09/23 Python