正确的方法是我们将形状从基本的 Shape 类扩展出来,允许轻松添加新的形状而不修改 AreaCalculator 。
(4) 接口隔离原则(ISP): 类不应该被迫实现它们不使用的接口 。相反,接口应该对其目的具体而清晰 。
这意味着接口不应该有太多方法,尽量我们将小接口抽取出来,以便类可以只实现它们需要的接口,就像下面的例子:
// 错误的方法interface Worker {work();eat();sleep();swim();}// 正确的方法interface Worker {work();}interface Eater {eat();}interface Swimmer {swim();}(5) 依赖反转原则(DIP): 高层模块不应与低层模块纠缠在一起;它们都应依赖于抽象 。例如在开关和设备的设计中可以找到:
// 错误的方法class LightBulb {turnOn() {}turnOff() {}}class Switch {constructor(bulb) {this.bulb = bulb;}operate() {// 直接控制灯泡}}我们可以重构这样,以便 Switch 可以对任何实现 SwitchableDevice 的设备进行操作,而不仅仅是 LightBulb 。
// 正确的方法class SwitchableDevice {turnOn() {}turnOff() {}}class Bulb extends SwitchableDevice {// 实现 turnOn 和 turnOff 方法}class SwitchDIP {constructor(device) {this.device = device;}operate() {// 控制设备}}4. YAGNI 原则YAGNI,“你不会需要它”,警告不要在必要之前添加功能 。
例如,如果你正在构建一个博客网站 , 并考虑添加一个基于用户写作的功能来预测用户的心情,但这对于网站正常运行并不是必需的,那么最好将其留在一边,至少现在是这样 。
有不必要功能的应用:
class Blog {constructor(posts) {this.posts = posts;}addPost(post) {this.posts.push(post);}displayPosts() {// 显示所有帖子}predictUserMoodBasedOnWritings(post) {// 预测情绪的复杂算法// ...return "HAppy"; // 只是一个示例情绪}notifyUserAboutMood(mood) {// 通知逻辑console.log(`Based on your writing, you seem to be ${mood}`);}}删除不必要功能后:
class Blog {constructor(posts) {this.posts = posts;}addPost(post) {this.posts.push(post);}displayPosts() {// 显示所有帖子}}5. SoC 原则SoC,或“关注点分离”,建议不同的功能区域应由不同且最小重叠的模块管理 。
例如,在一个天气应用程序中,一个模块可以处理数据获取 , 另一个可以管理数据存储,另一个则可以控制用户界面 。每个都有自己的关注点 , 与其他模块分开 。
// 1. 数据获取模块function fetchWeatherData(city) {const apiKey = 'YOUR_API_KEY';const response = fetch(`https://api.weather.com/v1/${city}?apiKey=${apiKey}`);return response.json();}// 2. 数据存储模块function storeWeatherData(data) {localStorage.setItem('weatherData', JSON.stringify(data));}// 3. 用户界面模块function displayWeatherData(data) {const weatherBox = document.querySelector('#weather-box');weatherBox.innerhtml = `<h1>${data.city}</h1><p>${data.temperature}°C</p>`;}// 在主应用程序函数中组合它们function weatherApp(city) {const data = https://www.isolves.com/it/cxkf/bk/2023-11-17/fetchWeatherData(city);storeWeatherData(data);displayWeatherData(data);}6. LoD 原则LoD(迪米特法则)是开发软件的一个指导原则,特别是面向对象的程序 。在其一般形式中 , LoD是松散耦合的一个具体案例 。
想象一下餐厅的场景:顾客将订单(方法)交给服务员,然后服务员将订单交给厨师 。顾客不直接与厨师互动 。
class Customer {constructor(wAIter) {this.waiter = waiter;}giveOrder(order) {console.log("Customer: I'd like to order " + order);this.waiter.takeOrder(order);}}class Waiter {constructor(chef) {this.chef = chef;}takeOrder(order) {console.log('Waiter: Order received - ' + order);this.chef.prepareOrder(order);}}class Chef {prepareOrder(order) {console.log('Chef: Preparing ' + order);// Logic to prepare the food...}}7. COI 原则组合优于继承原则(COI)建议使用组合(将简单对象组合以创建更复杂的对象)而不是类继承 。
想象一下你有一个类 Bird 和一个类 Airplane 。它们都能飞,但有继承关系并不合理 。相反,你可以有一个 CanFly 类,并将你的 Bird 和 Airplane 类与它组合 。
// 错误的方法:继承class CanFly {fly() {console.log(this.constructor.name + ' is flying!');}}class BirdInherit extends CanFly {}class AirplaneInherit extends CanFly {}通过以下组合方法,你可以轻松地向 BirdCompose 或 AirplaneCompose 添加或删除功能,而无需进行结构更改或添加不必要的冗余,强调灵活性 。
推荐阅读
- 为什么RPC框架数十年还在造轮子?EJB骨灰都快找不到了!
- 赵丽颖张杰合影被群嘲,露脐装穿搭土气,美颜都遮不住疲惫
- “国内第一名模”瞿颖:半生悲欢,终究还是都放下了
- 于世猷的情况都知道,郝爱民为啥也被清理门户?侯耀华看他别扭
- 硬盘珍藏的十二部美剧,都是未删减版本
- 让人荷尔蒙飙升的5部爱情片,部部都是经典好评,你看过哪几部?
- 蚕一年四季都可以养吗 蚕一年四季都可以养吗
- 聂远老婆晒全家福庆结婚10周年,一家四口共用一张脸,颜值都好高
- 抖音每张图片都附文字怎么做,抖音中图片里插文字是怎么弄的
- 江苏省养蚂蝗,浙江余姚收蚂蝗的贩子都卖到哪里
