如何應(yīng)用?SOLID?原則在?React?中整理代碼之開(kāi)閉原則
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)做事情。
到此這篇關(guān)于如何應(yīng)用 SOLID 原則在 React 中整理代碼之開(kāi)閉原則的文章就介紹到這了,更多相關(guān)React SOLID 原則 開(kāi)閉原則內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
30分鐘精通React今年最勁爆的新特性——React Hooks
這篇文章主要介紹了30分鐘精通React今年最勁爆的新特性——React Hooks,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03React如何使用refresh_token實(shí)現(xiàn)無(wú)感刷新頁(yè)面
本文主要介紹了React如何使用refresh_token實(shí)現(xiàn)無(wú)感刷新頁(yè)面,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04React tabIndex使非表單元素支持focus和blur事件
這篇文章主要為大家介紹了React使用tabIndex使非表單元素支持focus和blur事件實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11ReactNative踩坑之配置調(diào)試端口的解決方法
本篇文章主要介紹了ReactNative踩坑之配置調(diào)試端口的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07React Native項(xiàng)目中使用Lottie動(dòng)畫(huà)的方法
這篇文章主要介紹了React Native 實(shí)現(xiàn)Lottie動(dòng)畫(huà)的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10解決React報(bào)錯(cuò)Cannot assign to 'current'
這篇文章主要為大家介紹了React報(bào)錯(cuò)Cannot assign to 'current' because it is a read-only property的解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12基于React-Dropzone開(kāi)發(fā)上傳組件功能(實(shí)例演示)
這篇文章主要介紹了基于React-Dropzone開(kāi)發(fā)上傳組件,主要講述的是在React-Flask框架上開(kāi)發(fā)上傳組件的技巧,需要的朋友可以參考下2021-08-08React Fiber樹(shù)的構(gòu)建和替換過(guò)程講解
React Fiber樹(shù)的創(chuàng)建和替換過(guò)程運(yùn)用了雙緩存技術(shù),直接將舊的 fiber 樹(shù)替換成新的 fiber 樹(shù),這樣做的好處是省去了直接在頁(yè)面上渲染時(shí)的計(jì)算時(shí)間,避免計(jì)算量大導(dǎo)致的白屏、卡頓,現(xiàn)在你一定還不太理解,下面進(jìn)行詳細(xì)講解,需要的朋友可以參考下2022-12-12