網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
SOLID 是一套原則。它們主要是關(guān)心代碼質(zhì)量和可維護(hù)性的軟件專(zhuān)業(yè)人員的指導(dǎo)方針。
React 不是面向?qū)ο螅@些原則背后的主要思想可能是有幫助的。在本文中,我將嘗試演示如何應(yīng)用這些原則來(lái)編寫(xiě)更好的代碼。
在前一篇文章中,我們討論了單一責(zé)任原則。今天,我們將討論 SOLID 的第二個(gè)原則: 開(kāi)閉原則。
本系列其他文章
如何應(yīng)用 SOLID 原則在 React 中整理代碼之單一原則
什么是開(kāi)閉原則?
Robert c. Martin 認(rèn)為這個(gè)原則是面向?qū)ο笤O(shè)計(jì)最重要的原則。但他不是第一個(gè)定義這個(gè)概念的人。Bertrand Meyer 于 1988 年在他的《面向?qū)ο筌浖?gòu)造》一書(shū)中寫(xiě)到了這一點(diǎn)。他解釋了開(kāi)放/封閉原則:
軟件實(shí)體(類(lèi)、模塊、功能等)應(yīng)該對(duì)擴(kuò)展開(kāi)放,但對(duì)修改關(guān)閉。
這個(gè)原則告訴您以這樣一種方式來(lái)編寫(xiě)代碼,即您能夠在不更改現(xiàn)有代碼的情況下添加其他功能。
讓我們看看我們?cè)谀睦锟梢詰?yīng)用這個(gè)原則。
讓我們從一個(gè)例子開(kāi)始
假設(shè)我們有一個(gè) User
組件,其中我們傳遞用戶(hù)的詳細(xì)信息,這個(gè)類(lèi)的主要目的是顯示該特定用戶(hù)的詳細(xì)信息。
這是一個(gè)很簡(jiǎn)單的開(kāi)始。但是我們的生活并不是那么簡(jiǎn)單。幾天后,我們的經(jīng)理告訴我們系統(tǒng)中有三種類(lèi)型的用戶(hù): SuperAdmin
、 Admin
等等。
它們每個(gè)都有不同的信息和功能。
一個(gè)糟糕的解決方案
第一個(gè)也是顯而易見(jiàn)的解決方案:在組件中包含一個(gè)條件,并根據(jù)不同的用戶(hù)類(lèi)型呈現(xiàn)不同的信息。
import React from 'react'; export const User = ({user}) => { return <> <div> Name: {user.name}</div> <div> Email: {user.email}</div> { user.type === 'SUPER_ADMIN' && <div> Details about super admin</div> } { user.type === 'ADMIN' && <div> Details about admin</div> } </> }
你知道這里出了什么問(wèn)題嗎?
首先,我們的代碼現(xiàn)在是凌亂的。
其次,如果我們需要其他類(lèi)型的用戶(hù)怎么辦?
然后,我們需要進(jìn)入 User.js,為特定類(lèi)型的用戶(hù)添加另一個(gè)條件。
這明顯違反了開(kāi)閉原則,因?yàn)槲覀儾辉试S更改 User 組件內(nèi)部的代碼。
解決方案是什么?
在這個(gè)場(chǎng)景中我們可以應(yīng)用兩種主要的技術(shù):
- 高階組件(HOC)
- 組件組合(Component composition)
在可能的情況下,最好采用第二種方法,但是在某些情況下,有必要使用 HOC。
現(xiàn)在,我們將使用 Facebook 推薦的一種技術(shù),稱(chēng)為組件組合。
讓我們創(chuàng)建單獨(dú)的用戶(hù)組件
現(xiàn)在,我們需要以這樣一種方式設(shè)計(jì)代碼,即不需要在 User.js
組件中添加條件。讓我們?yōu)?SuperAdmin
創(chuàng)建一個(gè)單獨(dú)的組件:
import React from 'react'; import {User} from "./User"; export const SuperAdmin = ({user}) => { return <> <User user={user} /> <div> This is super admin user details</div> </> }
類(lèi)似地,另一個(gè)是針對(duì) Admin
用戶(hù)的:
import React from 'react'; import {User} from "./User"; export const Admin = ({user}) => { return <> <User user={user} /> <div> This is admin user details</div> </> }
現(xiàn)在我們的 App.js 文件變成了:
import React from 'react'; import Admin from './Admin' import SuperAdmin from './SuperAdmin' export default function App = () =>{ const user = {} const userByTypes = { 'admin' : <Admin /> , 'superadmin' : <SuperAdmin /> } return <div> {userByTypes[`${user.type}`]} <div/> }
現(xiàn)在我們可以根據(jù)需要?jiǎng)?chuàng)建盡可能多的用戶(hù)類(lèi)型。我們針對(duì)特定用戶(hù)的邏輯是封裝的,因此我們不需要為了任何額外的修改而重新檢查代碼。
有些人可能會(huì)說(shuō),我們正在不必要地增加文件數(shù)量。當(dāng)然,您可以暫時(shí)保持原樣,但是隨著應(yīng)用程序的復(fù)雜性增加,您肯定會(huì)感到痛苦。
注意
SOLID 是一套原則。它們并不是強(qiáng)制性的,您必須應(yīng)用于每個(gè)場(chǎng)景。作為一個(gè)經(jīng)驗(yàn)豐富的開(kāi)發(fā)人員,您應(yīng)該在代碼長(zhǎng)度和可讀性之間找到一個(gè)很好的平衡。
要過(guò)分執(zhí)著于這些原則。事實(shí)上,有一句名言可以解釋這些情況:
Too Much SOLID
所以知道這些原則是好的,但是你必須保持平衡。對(duì)于一個(gè)或兩個(gè)額外的字段,您可能不需要這些組合,但是將它們分開(kāi)肯定會(huì)有長(zhǎng)遠(yuǎn)的幫助。
總結(jié)
了解這些原則會(huì)讓你走很長(zhǎng)的路,因?yàn)樵谝惶旖Y(jié)束的時(shí)候,一段好的代碼才是最重要的,而且沒(méi)有單一的方法來(lái)做事情。
原文鏈接:https://blog.csdn.net/qq_22833925/article/details/117236126
相關(guān)推薦
- 2023-03-18 python中統(tǒng)計(jì)相同字符的個(gè)數(shù)方法實(shí)例_python
- 2022-01-16 對(duì)npm模塊進(jìn)行調(diào)試和測(cè)試——npm link
- 2022-06-15 C#實(shí)現(xiàn)冒泡排序和插入排序算法_C#教程
- 2022-07-04 Python中字典的緩存池_python
- 2022-06-26 Python實(shí)現(xiàn)將多張圖片合成視頻并加入背景音樂(lè)_python
- 2023-05-26 keras.layers.Conv2D()函數(shù)參數(shù)用法及說(shuō)明_python
- 2022-09-16 C++中的位運(yùn)算和位圖bitmap解析_C 語(yǔ)言
- 2022-04-18 python?commands模塊的適用方式_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支