控制系統(tǒng)低層設(shè)計(jì)(LLD)詳解:從需求到 C++ 源碼實(shí)現(xiàn))
示例工程【免費(fèi)下載鏈接】awesome-low-level-designLearn Low Level Design (LLD) and prepare for interviews using free resources.項(xiàng)目地址https://gitcode.com/GitHub_Trending/aw/awesome-low-level-design點(diǎn)擊查看免費(fèi)下載本文以倉(cāng)庫(kù) solutions/cpp/trafficsignalsystem/README.md 為核心骨架結(jié)合倉(cāng)庫(kù)內(nèi)完整的 C 源碼實(shí)現(xiàn)系統(tǒng)講解如何為一個(gè)多道路交叉口的交通信號(hào)控制系統(tǒng)做面向?qū)ο笤O(shè)計(jì)LLD與編碼落地。讀完本文你將掌握信號(hào)燈狀態(tài)機(jī)建模、可配置時(shí)長(zhǎng)設(shè)計(jì)、路口級(jí)聚合與系統(tǒng)級(jí)單例控制、故障恢復(fù)機(jī)制以及如何用 C 將一套 LLD 設(shè)計(jì)轉(zhuǎn)化為可編譯運(yùn)行的演示程序。一、問題背景為什么用 LLD 來(lái)做交通信號(hào)系統(tǒng)交通信號(hào)控制系統(tǒng)是面試中非常經(jīng)典的低層設(shè)計(jì)Low Level Design, LLD題目。它的業(yè)務(wù)足夠熟悉、邊界足夠清晰又天然包含狀態(tài)流轉(zhuǎn)、配置化參數(shù)、故障處理、擴(kuò)展性等設(shè)計(jì)要點(diǎn)非常適合考察候選人從需求分析到類圖設(shè)計(jì)再到代碼落地的完整能力。在 awesome-low-level-design 倉(cāng)庫(kù)中交通信號(hào)系統(tǒng)同時(shí)提供了 Java、Python、C、C#、Go、TypeScript 等多語(yǔ)言實(shí)現(xiàn)其中 C 實(shí)現(xiàn)位于 solutions/cpp/trafficsignalsystem/由 4 個(gè)頭文件 / 源文件 1 個(gè)演示入口組成代碼量精簡(jiǎn)但完整覆蓋了核心設(shè)計(jì)點(diǎn)。倉(cāng)庫(kù)給出的參考類圖如下來(lái)自 problems/traffic-signal.md 所引用的規(guī)范設(shè)計(jì)說明該參考類圖體現(xiàn)了完整的 LLD 形態(tài)——單例的總控制器、路口級(jí)控制器、信號(hào)燈狀態(tài)機(jī)State 模式與狀態(tài)通知Observer 模式。C 實(shí)現(xiàn)在此基礎(chǔ)上做了工程簡(jiǎn)化用Signal信號(hào)燈、Intersection路口、TrafficSystem系統(tǒng)三個(gè)聚合層級(jí)承載同等職責(zé)下文會(huì)逐一對(duì)照講解。二、需求分析6 條核心需求逐條拆解原 README 定義了 6 條需求它們是整個(gè)設(shè)計(jì)的出發(fā)點(diǎn)逐條拆解如下控制多道路交叉口的交通流系統(tǒng)要以“路口Intersection”為基本管理單元一個(gè)路口聚合多條道路上的信號(hào)燈而不是只管理孤立的單個(gè)燈。支持紅、黃、綠三種信號(hào)信號(hào)燈顏色是有限狀態(tài)集合天然適合用枚舉enum建模如 C 實(shí)現(xiàn)中的SignalColor { RED, YELLOW, GREEN }。每種信號(hào)的持續(xù)時(shí)間可配置、可根據(jù)交通狀況調(diào)整綠燈/黃燈/紅燈時(shí)長(zhǎng)不能寫死必須在創(chuàng)建時(shí)傳入、并支持運(yùn)行期調(diào)整。信號(hào)之間平滑過渡保證安全高效的交通流顏色切換必須遵循固定順序——RED → GREEN → YELLOW → RED不允許紅燈直接跳綠燈等危險(xiǎn)行為過渡邏輯要封裝在單一職責(zé)的切換函數(shù)中。能夠檢測(cè)并處理緊急情況如救護(hù)車、消防車接近路口。C 演示中通過“路口故障/恢復(fù)”模擬了突發(fā)狀態(tài)的處理setOperational(false)讓所有燈停擺恢復(fù)后重新同步。可擴(kuò)展、可擴(kuò)展新功能設(shè)計(jì)要留出擴(kuò)展點(diǎn)例如后續(xù)接入傳感器實(shí)時(shí)調(diào)整綠燈時(shí)長(zhǎng)、增加緊急車輛優(yōu)先通道等核心代碼結(jié)構(gòu)不應(yīng)因此推倒重來(lái)。三、類設(shè)計(jì)README 描述的參考結(jié)構(gòu)原 README 的“Classes, Interfaces and Enumerations”一節(jié)定義了參考設(shè)計(jì)的 5 個(gè)核心單元這是回答“請(qǐng)畫出類圖”時(shí)的標(biāo)準(zhǔn)答案Signal枚舉表示交通燈的三種狀態(tài)——red、yellow、green。Road類代表道路屬性包括 ID、名稱以及與其關(guān)聯(lián)的信號(hào)燈traffic light。TrafficLight類代表信號(hào)燈屬性包括 ID、當(dāng)前信號(hào)、每種信號(hào)狀態(tài)的時(shí)長(zhǎng)提供改變信號(hào)的方法并能在信號(hào)變化時(shí)通知觀察者如道路。TrafficController類系統(tǒng)的中央控制器采用Singleton 單例模式確保系統(tǒng)只有唯一實(shí)例負(fù)責(zé)管理道路及其信號(hào)燈、啟動(dòng)交通控制流程、處理緊急情況。TrafficSignalSystemDemo類應(yīng)用入口演示如何創(chuàng)建道路、創(chuàng)建信號(hào)燈、把信號(hào)燈分配給道路、啟動(dòng)控制流程。四、C 源碼實(shí)現(xiàn)剖析從類圖到可運(yùn)行代碼參考設(shè)計(jì)落到 C 時(shí)倉(cāng)庫(kù)采用了職責(zé)等價(jià)但更工程化的命名與層級(jí)。下面是 README 概念類與 C 實(shí)際類的對(duì)照關(guān)系README 參考類C 實(shí)際類文件對(duì)應(yīng)職責(zé)Signal枚舉SignalColor枚舉Signal.hpp紅/黃/綠三種狀態(tài)RoadTrafficLightSignal類Signal.hpp攜帶 ID、當(dāng)前顏色、三色時(shí)長(zhǎng)、剩余時(shí)間、工作狀態(tài)路口聚合Intersection類Intersection.hpp管理一個(gè)路口下的多個(gè)信號(hào)燈負(fù)責(zé)同步與整體啟停TrafficControllerTrafficSystem類TrafficSystem.hpp系統(tǒng)級(jí)中央控制統(tǒng)一 ID 生成、路口增刪、信號(hào)燈增刪、全局更新TrafficSignalSystemDemoTrafficSystemDemoTrafficSystemDemo.cpp入口演示程序4.1 信號(hào)燈實(shí)體Signal與SignalColorSignal.hpp 定義了三色枚舉與信號(hào)燈實(shí)體enum class SignalColor { RED, YELLOW, GREEN };Signal類持有以下狀態(tài)字段signalId信號(hào)燈唯一標(biāo)識(shí)currentColor當(dāng)前顏色初始為紅燈greenDuration / yellowDuration / redDuration三種顏色的持續(xù)時(shí)間秒構(gòu)造時(shí)可配置默認(rèn)值為green30, yellow5, red30見 Signal.hpp 的默認(rèn)參數(shù)timeRemaining當(dāng)前顏色剩余時(shí)間isWorking工作狀態(tài)false 表示故障/停用。關(guān)鍵方法setDurations(green, yellow, red)運(yùn)行期重設(shè)三色時(shí)長(zhǎng)并重置狀態(tài)對(duì)應(yīng)需求 3“可根據(jù)交通狀況調(diào)整”updateSignal(timeElapsed)按流逝時(shí)間遞減剩余時(shí)間倒計(jì)時(shí)歸零即觸發(fā)switchColor()switchColor()嚴(yán)格按RED → GREEN → YELLOW → RED順序流轉(zhuǎn)Signal.cpp保證過渡安全對(duì)應(yīng)需求 4setWorking(bool)/reset()故障開關(guān)與復(fù)位回到紅燈、剩余時(shí)間置為 redDuration。switchColor的實(shí)現(xiàn)很好地體現(xiàn)了狀態(tài)機(jī)“無(wú)非法跳轉(zhuǎn)”的核心思想void Signal::switchColor() { switch (currentColor) { case SignalColor::RED: currentColor SignalColor::GREEN; timeRemaining greenDuration; break; case SignalColor::GREEN: currentColor SignalColor::YELLOW; timeRemaining yellowDuration; break; case SignalColor::YELLOW: currentColor SignalColor::RED; timeRemaining redDuration; break; } }4.2 路口聚合IntersectionIntersection.hpp 對(duì)應(yīng) README 中“控制交叉口多條道路交通流”的需求 1以std::vectorSignal*聚合一個(gè)路口下的所有信號(hào)燈并提供addSignal / removeSignal增刪信號(hào)燈按signalId查找并釋放內(nèi)存updateSignals(timeElapsed)批量推進(jìn)路口下所有信號(hào)燈的時(shí)間步synchronizeSignals()把所有信號(hào)燈重置到初始紅燈狀態(tài)用于故障恢復(fù)后的重新同步對(duì)應(yīng)需求 5setOperational(bool)整體啟?!房谑?lián)時(shí)所有燈同時(shí)停用恢復(fù)時(shí)再統(tǒng)一重啟。注意構(gòu)造函數(shù)與析構(gòu)函數(shù)的管理方式Intersection擁有其signals的所有權(quán)析構(gòu)時(shí)逐一delete避免內(nèi)存泄漏Intersection.cpp。這是 C LLD 實(shí)現(xiàn)中必須交代的資源管理細(xì)節(jié)。4.3 系統(tǒng)級(jí)中央控制TrafficSystemTrafficSystem.hpp 承擔(dān) README 中TrafficController的中央控制職責(zé)createIntersection()創(chuàng)建路口并自動(dòng)生成 IDI1、I2……addSignal(intersectionId, green, yellow, red)向指定路口添加信號(hào)燈自動(dòng)生成S1、S2……三色時(shí)長(zhǎng)參數(shù)在此透?jìng)魇切枨?3“時(shí)長(zhǎng)可配置”的對(duì)外入口removeIntersection / removeSignal按 ID 刪除updateSystem(timeElapsed)驅(qū)動(dòng)系統(tǒng)內(nèi)所有路口同步推進(jìn)一個(gè)時(shí)間步setIntersectionStatus(id, operational)模擬緊急/故障事件需求 5synchronizeIntersection(id)故障恢復(fù)后的全路口信號(hào)同步。4.4 演示入口TrafficSystemDemoTrafficSystemDemo.cpp 完整演示了“建系統(tǒng) → 建路口 → 加信號(hào)燈 → 時(shí)間步模擬 → 故障/恢復(fù)”的端到端流程TrafficSystem system; Intersection* intersection1 system.createIntersection(); Signal* signal1 system.addSignal(intersection1-getIntersectionId(), 20, 5, 25); Signal* signal2 system.addSignal(intersection1-getIntersectionId(), 20, 5, 25); system.displaySystemStatus(); for (int i 0; i 10; i) { system.updateSystem(5); // 每 5 秒推進(jìn)一個(gè)時(shí)間步 system.displaySystemStatus(); std::this_thread::sleep_for(std::chrono::seconds(1)); } // 模擬路口故障 system.setIntersectionStatus(intersection1-getIntersectionId(), false); // 恢復(fù)并重新同步 system.setIntersectionStatus(intersection1-getIntersectionId(), true); system.synchronizeIntersection(intersection1-getIntersectionId());這里給出了一個(gè)非常有價(jià)值的實(shí)踐要點(diǎn)時(shí)間步進(jìn)time-stepping模擬。演示程序以u(píng)pdateSystem(5)的方式每步推進(jìn) 5 秒Signal::updateSignal將timeRemaining減去 5歸零即切換顏色。真實(shí)系統(tǒng)中這個(gè)timeElapsed來(lái)自定時(shí)器或硬件時(shí)鐘LLD 階段用循環(huán) sleep_for模擬即可驗(yàn)證狀態(tài)機(jī)正確性。五、可配置性設(shè)計(jì)默認(rèn)值、參數(shù)傳遞與運(yùn)行期調(diào)整原 README 需求 3 明確要求“duration of each signal should be configurable and adjustable”C 實(shí)現(xiàn)通過三處設(shè)計(jì)滿足構(gòu)造器默認(rèn)參數(shù)Signal(signalId, green30, yellow5, red30)不傳時(shí)長(zhǎng)也能用安全默認(rèn)值初始化Signal.hpp創(chuàng)建期傳參TrafficSystem::addSignal(intersectionId, greenDuration, yellowDuration, redDuration)允許為不同方向配置差異化時(shí)長(zhǎng)——例如主干道綠燈 40s、次干道綠燈 15sTrafficSystem.cpp運(yùn)行期調(diào)整Signal::setDurations(green, yellow, red)支持動(dòng)態(tài)修改并自動(dòng)復(fù)位正是“根據(jù)實(shí)時(shí)交通狀況調(diào)整”的擴(kuò)展點(diǎn)Signal.cpp。六、故障處理與恢復(fù)緊急情況的工程化落地需求 5 要求系統(tǒng)“檢測(cè)并處理緊急情況”。C 實(shí)現(xiàn)用“整體停擺 同步復(fù)位”兩階段模擬了這一場(chǎng)景setOperational(false)時(shí)Intersection將isOperational置 false 并級(jí)聯(lián)調(diào)用所有Signal::setWorking(false)updateSignal中if (!isWorking) return;直接短路所有信號(hào)燈凍結(jié)在安全狀態(tài)Intersection.cpp恢復(fù)時(shí)setOperational(true)后調(diào)用synchronizeSignals()所有燈統(tǒng)一復(fù)位到紅燈并重新開始計(jì)時(shí)避免恢復(fù)后各方向相位錯(cuò)亂。這套“凍結(jié) → 復(fù)位 → 重啟”的流程可以無(wú)縫擴(kuò)展為真正的緊急車輛優(yōu)先邏輯檢測(cè)到救護(hù)車接近時(shí)可將沖突方向置紅、讓出方向持續(xù)綠燈若干秒邏輯與setOperational完全同構(gòu)。七、編譯與運(yùn)行倉(cāng)庫(kù)為只讀資源請(qǐng)?jiān)诒镜貜?fù)制 solutions/cpp/trafficsignalsystem/ 目錄后編譯運(yùn)行。由于演示程序使用了std::thread與std::chrono需要 C11 及以上標(biāo)準(zhǔn)并鏈接 pthreadg -stdc11 TrafficSystemDemo.cpp Signal.cpp Intersection.cpp TrafficSystem.cpp -o traffic_demo -lpthread ./traffic_demo預(yù)期輸出包括初始系統(tǒng)狀態(tài)Number of Intersections: 1、路口I1下S1/S2兩個(gè)信號(hào)燈、10 個(gè)時(shí)間步內(nèi)每 5 秒推進(jìn)的狀態(tài)變化、故障模擬后全部燈Not Working、恢復(fù)同步后回到RED的完整生命周期。八、擴(kuò)展性討論向完整方案演進(jìn)的方向原 README 需求 6 要求“可擴(kuò)展”。結(jié)合倉(cāng)庫(kù)參考類圖Observer/State 模式與 C 實(shí)現(xiàn)可以給出以下演進(jìn)路徑供面試作答與后續(xù)學(xué)習(xí)使用觀察者模式Observer參考類圖中TrafficLight維護(hù)ListTrafficObserverCentralMonitor實(shí)現(xiàn)update(intersectionId, direction, color)接收全系統(tǒng)信號(hào)變更。C 實(shí)現(xiàn)可用std::vectorstd::functionvoid(...)或自定義觀察者接口為Signal增加通知能力實(shí)現(xiàn)集中監(jiān)控與日志狀態(tài)模式State參考類圖中SignalState/IntersectionState接口將每個(gè)顏色的行為封裝為獨(dú)立類GreenState/RedState/YellowState可在此之上為綠燈疊加“動(dòng)態(tài)延長(zhǎng)”策略方向與多路口聯(lián)網(wǎng)參考設(shè)計(jì)用Direction { NORTH, EAST, WEST, SOUTH }建模四向路口并讓TrafficControlSystemSingleton持有多個(gè)IntersectionController實(shí)現(xiàn)綠波帶協(xié)調(diào)——C 的TrafficSystem已經(jīng)具備多路口容器只需補(bǔ)上方向枚舉與相位協(xié)調(diào)算法即可??偨Y(jié)交通信號(hào)控制系統(tǒng)是一道“小而全”的 LLD 經(jīng)典題。通過 solutions/cpp/trafficsignalsystem/README.md 的需求與類設(shè)計(jì)以及 Signal.cpp、Intersection.cpp、TrafficSystem.cpp 的源碼可以看到一條清晰的設(shè)計(jì)主線枚舉建模狀態(tài) → 實(shí)體封裝配置 → 路口聚合管理 → 系統(tǒng)級(jí)中央控制對(duì)應(yīng) Singleton→ 時(shí)間步進(jìn)模擬驗(yàn)證 → 故障凍結(jié)與恢復(fù)同步。掌握這套從需求到類圖再到 C 落地的完整鏈路你可以將其遷移到信號(hào)燈之外的任何“有限狀態(tài) 可配置時(shí)長(zhǎng) 中央調(diào)度”類系統(tǒng)設(shè)計(jì)中。贊分享示例工程【免費(fèi)下載鏈接】awesome-low-level-designLearn Low Level Design (LLD) and prepare for interviews using free resources.項(xiàng)目地址https://gitcode.com/GitHub_Trending/aw/awesome-low-level-design點(diǎn)擊查看免費(fèi)下載相關(guān)推薦基于 C 的數(shù)字錢包系統(tǒng)低層設(shè)計(jì)LLD從需求建模到源碼實(shí)現(xiàn)基于 C 的數(shù)字錢包系統(tǒng)低層設(shè)計(jì)LLD從需求建模到源碼實(shí)現(xiàn) 本文以 awesome low level design 倉(cāng)庫(kù)中 solutions/cp示例工程react-use 的 useVibrate一行 Hook 調(diào)用設(shè)備振動(dòng) API為 Web 應(yīng)用注入觸覺反饋react use 的 useVibrate一行 Hook 調(diào)用設(shè)備振動(dòng) API為 Web 應(yīng)用注入觸覺反饋 useVibrate 是 react use示例工程交通信號(hào)控制系統(tǒng)設(shè)計(jì)從需求分析到狀態(tài)機(jī)、觀察者與單例模式的多語(yǔ)言 LLD 實(shí)戰(zhàn)交通信號(hào)控制系統(tǒng)設(shè)計(jì)從需求分析到狀態(tài)機(jī)、觀察者與單例模式的多語(yǔ)言 LLD 實(shí)戰(zhàn) 本篇技術(shù)指南以 awesome low level design 倉(cāng)庫(kù)中的 交示例工程上一篇如何高效使用CH55xduino3步打造低成本USB微控制器項(xiàng)目下一篇PostgreSQL-Async: 異步訪問 PostgreSQL 數(shù)據(jù)庫(kù)的 Scala 庫(kù)創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考