随心而作 2020-01-28
何为设计原则?
五大设计原则
从设计到模式
23中设计模式
何为设计?
1) 小即是美
2) 让每个程序只做好好一件事
3) 快速建立原型
4) 舍弃高效率而取可移植性
5) 采用纯文本来存储数据
6) 充分利用软件的杠杆效应(软件复用)
7) 使用shell脚本来提高效应和可移植性
8) 避免强制性的用户界面
9) 让每个程序都称为过滤器(shell的管道操作)
10) 允许用户定制环境
11) 尽量使用操作系统内核小而轻量化
12) 使用小写字母并尽量简短
13) 沉默是金(在命令行的输出有体现)
14) 各部分之和大于整体
15) 寻求90%的解决方案
S - 单一职责原则
O - 开放封闭原则(important)
L - 李氏置换原则
I - 接口独立原则
D - 依赖导致原则
在js中:
例如:在promise中运用了S O:
function loadImg(src) { var promise = new Promise(function (reslove, reject) { var img = document.creatElement('img') img.onload = function() { reslove(img) } img.src = src }) return promise } var src = '.....' var result = loadImg(src) result.then(function (img) { console.log('img.width',img.width) return img }).then(function (img) { console.log('img.height',img.height) }).catch(function (ex) { console.log(ex) })
从设计到模式
有继承有引用
class Car { constructor(number, name) { this.number = number this.name = name } } class Kuaiche extends Car { constructor(number, name) { super(number, name) this.price = 1 } } class Zhuanche extends Car { constructor(number, name) { super(number, name) this.price = 2 } } class Trip { constructor(car) { this.car = car } start() { console.log(`行程开始,名称: ${this.car.name}, 车牌号: ${this.car.price}`) } end() { console.log('行程结束,价格: ' + (this.car.price * 5)) } } let car = new Kuaiche(100, '桑塔纳') let trip = new Trip(car) trip.start() trip.end()
都为引用
// 车 class Car { constructor(num) { this.num = num } } // 入口摄像头 class Camera { shot(car) { return { num: car.num, inTime: Date.now() } } } // 出口显示器 class Screen { show(car, inTime) { console.log('车牌号', car.num) console.log('停车时间', Date.now() - inTime) } } // 停车场 class Park { constructor(floors) { this.floors = floors || [] this.camera = new Camera() this.screen = new Screen() this.carList = {} } in(car) { // 获取摄像头的信息:号码 时间 const info = this.camera.shot(car) // 停到某个车位 const i = parseInt(Math.random() * 100 % 100) const place = this.floors[0].places[i] place.in() info.place = place // 记录信息 this.carList[car.num] = info } out(car) { // 获取信息 const info = this.carList[car.num] const place = info.place place.out() // 显示时间 this.screen.show(car, info.inTime) // 删除信息存储 delete this.carList[car.num] } emptyNum() { return this.floors.map(floor => { return `${floor.index} 层还有 ${floor.emptyPlaceNum()} 个车位` }).join('\n') } } // 层 class Floor { constructor(index, places) { this.index = index this.places = places || [] } emptyPlaceNum() { let num = 0 this.places.forEach(p => { if (p.empty) { num = num + 1 } }) return num } } // 车位 class Place { constructor() { this.empty = true } in() { this.empty = false } out() { this.empty = true } } // 测试代码------------------------------ // 初始化停车场 const floors = [] for (let i = 0; i < 3; i++) { const places = [] for (let j = 0; j < 100; j++) { places[j] = new Place() } floors[i] = new Floor(i + 1, places) } const park = new Park(floors) // 初始化车辆 const car1 = new Car('A1') const car2 = new Car('A2') const car3 = new Car('A3') console.log('第一辆车进入') console.log(park.emptyNum()) park.in(car1) console.log('第二辆车进入') console.log(park.emptyNum()) park.in(car2) console.log('第一辆车离开') park.out(car1) console.log('第二辆车离开') park.out(car2) console.log('第三辆车进入') console.log(park.emptyNum()) park.in(car3) console.log('第三辆车离开') park.out(car3)