【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 相关文章推荐
javascript 对象比较实现代码
Apr 27 Javascript
jquery 问答知识整理
Feb 11 Javascript
JavaScript的instanceof运算符学习教程
Jun 08 Javascript
jQuery实现select模糊查询(反射机制)
Jan 14 Javascript
Spring Boot+AngularJS+BootStrap实现进度条示例代码
Mar 02 Javascript
JS使用cookie实现只出现一次的广告代码效果
Apr 22 Javascript
基于jQuery和CSS3实现APPLE TV海报视差效果
Jun 16 jQuery
vue中Element-ui 输入银行账号每四位加一个空格的实现代码
Sep 14 Javascript
新年快乐! javascript实现超级炫酷的3D烟花特效
Jan 30 Javascript
利用Promise自定义一个GET请求的函数示例代码
Mar 20 Javascript
小程序异步问题之多个网络请求依次执行并依次收集请求结果
May 05 Javascript
es6函数之严格模式用法实例分析
Mar 17 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
destoon调用企业会员公司形象图片的实现方法
2014/08/21 PHP
PHP序列化/对象注入漏洞分析
2016/04/18 PHP
php实现评论回复删除功能
2017/05/23 PHP
总结一些js自定义的函数
2006/08/05 Javascript
js下写一个事件队列操作函数
2010/07/19 Javascript
dotopAlert 提示用户需安装播放器的代码
2012/09/17 Javascript
JQuery中使用.each()遍历元素学习笔记
2014/11/08 Javascript
原生javascript实现Tab选项卡切换功能
2015/01/12 Javascript
javascript中Array数组的迭代方法实例分析
2015/02/04 Javascript
工作中比较实用的JavaScript验证和数据处理的干货(经典)
2016/08/03 Javascript
基于jQuery实现简单人工智能聊天室
2017/02/10 Javascript
基于VUE选择上传图片并页面显示(图片可删除)
2017/05/25 Javascript
Angular2关于@angular/cli默认端口号配置的问题
2017/07/15 Javascript
angular+ionic返回上一页并刷新页面
2017/08/08 Javascript
移动端效果之Swiper详解
2017/10/09 Javascript
React Native使用Modal自定义分享界面的示例代码
2017/10/31 Javascript
js HTML DOM EventListener功能与用法实例分析
2020/04/27 Javascript
[02:12]探秘2016国际邀请赛中国区预选赛选手房间
2016/06/25 DOTA
python元组操作实例解析
2014/09/23 Python
Python使用OpenCV进行标定
2018/05/08 Python
Python之inspect模块实现获取加载模块路径的方法
2018/10/16 Python
对Python之gzip文件读写的方法详解
2019/02/08 Python
Django集成搜索引擎Elasticserach的方法示例
2019/06/04 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
2020/01/04 Python
python scatter函数用法实例详解
2020/02/11 Python
PyCharm 无法 import pandas 程序卡住的解决方式
2020/03/09 Python
详解python模块pychartdir安装及导入问题
2020/10/22 Python
阿玛尼美妆俄罗斯官网:Giorgio Armani Beauty RU
2020/07/19 全球购物
什么是数据库锁?Oracle中都有哪些类型的锁?
2015/08/21 面试题
幼儿园运动会加油词
2014/02/14 职场文书
学雷锋演讲稿
2014/03/04 职场文书
学习雷锋倡议书
2014/04/15 职场文书
学习党的群众路线剖析材料
2014/10/09 职场文书
借条如何写
2015/05/26 职场文书
创业计划书之牛肉汤快餐店
2019/10/08 职场文书
springboot + mongodb 通过经纬度坐标匹配平面区域的方法
2021/11/01 MongoDB