」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 康威定律和 Web 開發中的關注點分離

康威定律和 Web 開發中的關注點分離

發佈於2024-11-26
瀏覽:371

Conway

康威定律指出,软件系统往往会反映构建它们的组织的通信结构,它在现代 Web 开发的结构方式中发挥着至关重要的作用。从早期实践到当今更复杂的系统(例如微前端和基于组件的架构)的演变在很大程度上是由这一原则决定的。通过研究历史上 Web 开发中的关注点是如何分离的,我们可以更好地理解当前实践是如何出现的以及为什么它们看起来像今天的样子。

在网络开发的早期,不同的团队通常负责特定的技术。一个团队负责 HTML,另一个团队负责 CSS,还有另一个团队负责 JavaScript 和服务器端逻辑,例如 PHP。这种明确的职责分离或“关注点分离”是由每个团队拥有的独特技能驱动的。设计师将像素完美的 Photoshop 文件交给一个团队,然后该团队将这些文件转换为 HTML 和 CSS 模板。模板完成后,下一个团队会将它们集成到应用程序中,当事情不完美时经常会遇到摩擦。

设计师可能会提供一个 .psd 文件,其中表格的所有九个角都经过精心设计,HTML/CSS 团队会将其分割成工作布局。但它们在很大程度上与应用程序的实际逻辑或用户交互脱节。他们的工作只是确保视觉效果有效。然后,处理 PHP 和 JavaScript 的后端团队会将这些静态模板集成到正在运行的应用程序中,但通常会发现早期团队提出的解决方案并不适合应用程序的需求。这反映了组织的结构方式,每个团队都拥有流程的不同部分,没有太多的交叉沟通。

向基于组件的架构的转变

今天,我们分离关注点的方式发生了巨大的变化。现代团队更有可能负责应用程序特定部分的整个堆栈,而不是按技术划分职责(例如一个团队负责 HTML 和 CSS,另一个团队负责 JavaScript 和 PHP)。每个团队通常拥有应用程序的一个垂直部分,包括从前端组件到后端逻辑的所有内容。这种转变是由基于组件的架构的兴起推动的,其中可重用的、独立的组件是系统的构建块。

例如,您现在拥有的团队负责不同的功能或组件,例如 、。每个团队从上到下管理其应用程序的组件或部分,包括前端和后端逻辑。这使得团队能够更加自主地工作,减少旧分离模型中经常出现的瓶颈和沟通不畅。

这种新的关注点分离,按功能或组件而不是按技术,使团队能够更快地迭代。例如,负责聊天小部件的团队可以对 UI 和后端 API 进行更改,而无需等待另一团队处理系统的某一部分。现在的关键区别在于,您不再拥有只专注于 HTML 或 JavaScript 的专业团队,而是拥有拥有其组件或全部功能的跨职能团队。

微前端和独立团队所有权

这种转变最重要的结果之一是微前端的兴起,不同的团队拥有前端的不同部分,就像他们拥有后端的部分一样。这实现了早期不可能实现的独立程度。微前端架构反映了团队现在在管理组件方面的独立性。

例如,负责 的团队可能拥有从 UI 结构到它如何与从 API 获取的数据交互的所有内容。另一个负责

的团队将完全控制文章的获取、呈现和交互方式,从前端逻辑到数据库查询。这种程度的自治意味着可以独立部署变更,而无需像过去那样与其他团队协调。

相比之下,在旧的 HTML CSS 与 JS PHP 分离模型中,系统任何部分的更改都需要多个团队之间的协调。如果前端需要新功能,HTML/CSS 团队必须与 JavaScript 团队合作,以确保新布局或功能按预期工作。如今,随着团队从上到下拥有特定的组件或功能,团队间协调的需求大大减少,从而实现更快速的开发和部署周期。

康威定律的应用

康威定律仍然一如既往地重要。我们今天构建软件的方式仍然反映了我们团队的组织方式,但不同之处在于现代团队结构更注重功能,更少技术孤岛。按技术划分职责的旧方法(HTML CSS 与 JS PHP)已经让位于每个团队负责完整功能或组件的模型。

这种现代的关注点分离允许团队内部更好的沟通和更集中的所有权。微前端、基于组件的架构和以功能为中心的团队都反映了康威的洞察力:你的软件将不可避免地反映你的团队的结构。随着我们团队结构的发展,我们构建的系统也在不断发展,变得更加灵活、模块化和独立。

结论

从基于技术的关注点分离到基于功能的分离的转变彻底改变了我们构建 Web 应用程序的方式。康威定律解释了为什么会发生这种演变:随着团队变得更加自主和以功能为中心,我们系统的架构也随之而来。微前端、内部组件库和基于组件的开发都反映了现代对独立、跨职能团队的需求,这些团队拥有其特定功能或组件的前端和后端。

虽然工具和框架不断发展,但基本原则保持不变:团队的构建方式直接影响他们构建的软件。通过了解康威定律和关注点分离的历史,我们可以更好地理解我们今天使用的系统并预测它们将如何继续发展。

版本聲明 本文轉載於:https://dev.to/jlarky/conways-law-and-separation-of-concerns-in-web-development-4cfk?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 在程序退出之前,我需要在C ++中明確刪除堆的堆分配嗎?
    在程序退出之前,我需要在C ++中明確刪除堆的堆分配嗎?
    在C中的顯式刪除 在C中的動態內存分配時,開發人員通常會想知道是否有必要在heap-procal extrable exit exit上進行手動調用“ delete”操作員,但開發人員通常會想知道是否需要手動調用“ delete”操作員。本文深入研究了這個主題。 在C主函數中,使用了動態分配變量(...
    程式設計 發佈於2025-05-29
  • 如何使用不同數量列的聯合數據庫表?
    如何使用不同數量列的聯合數據庫表?
    合併列數不同的表 當嘗試合併列數不同的數據庫表時,可能會遇到挑戰。一種直接的方法是在列數較少的表中,為缺失的列追加空值。 例如,考慮兩個表,表 A 和表 B,其中表 A 的列數多於表 B。為了合併這些表,同時處理表 B 中缺失的列,請按照以下步驟操作: 確定表 B 中缺失的列,並將它們添加到表的...
    程式設計 發佈於2025-05-29
  • 查找當前執行JavaScript的腳本元素方法
    查找當前執行JavaScript的腳本元素方法
    如何引用當前執行腳本的腳本元素在某些方案中理解問題在某些方案中,開發人員可能需要將其他腳本動態加載其他腳本。但是,如果Head Element尚未完全渲染,則使用document.getElementsbytagname('head')[0] .appendChild(v)的常規方...
    程式設計 發佈於2025-05-29
  • FastAPI自定義404頁面創建指南
    FastAPI自定義404頁面創建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    程式設計 發佈於2025-05-29
  • 反射動態實現Go接口用於RPC方法探索
    反射動態實現Go接口用於RPC方法探索
    在GO 使用反射來實現定義RPC式方法的界面。例如,考慮一個接口,例如:鍵入myService接口{ 登錄(用戶名,密碼字符串)(sessionId int,錯誤錯誤) helloworld(sessionid int)(hi String,錯誤錯誤) } 替代方案而不是依靠反射...
    程式設計 發佈於2025-05-29
  • 為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
    為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
    使用php dateTime修改月份:發現預期的行為在使用PHP的DateTime類時,添加或減去幾個月可能並不總是會產生預期的結果。正如文檔所警告的那樣,“當心”這些操作的“不像看起來那樣直觀。 考慮文檔中給出的示例:這是內部發生的事情: 現在在3月3日添加另一個月,因為2月在2001年只有2...
    程式設計 發佈於2025-05-29
  • 如何使用Regex在PHP中有效地提取括號內的文本
    如何使用Regex在PHP中有效地提取括號內的文本
    php:在括號內提取文本在處理括號內的文本時,找到最有效的解決方案是必不可少的。一種方法是利用PHP的字符串操作函數,如下所示: 作為替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式來搜索特...
    程式設計 發佈於2025-05-29
  • 如何限制動態大小的父元素中元素的滾動範圍?
    如何限制動態大小的父元素中元素的滾動範圍?
    在交互式接口中實現垂直滾動元素的CSS高度限制,控制元素的滾動行為對於確保用戶體驗和可訪問性是必不可少的。一種這樣的方案涉及限制動態大小的父元素中元素的滾動範圍。 問題:考慮一個佈局,其中我們具有與用戶垂直滾動一起移動的可滾動地圖div,同時與固定的固定sidebar保持一致。但是,地圖的滾動無限...
    程式設計 發佈於2025-05-29
  • 在Python中如何創建動態變量?
    在Python中如何創建動態變量?
    在Python 中,動態創建變量的功能可以是一種強大的工具,尤其是在使用複雜的數據結構或算法時,Dynamic Variable Creation的動態變量創建。 Python提供了幾種創造性的方法來實現這一目標。 利用dictionaries 一種有效的方法是利用字典。字典允許您動態創建密鑰並...
    程式設計 發佈於2025-05-29
  • 表單刷新後如何防止重複提交?
    表單刷新後如何防止重複提交?
    在Web開發中預防重複提交 在表格提交後刷新頁面時,遇到重複提交的問題是常見的。要解決這個問題,請考慮以下方法: 想像一下具有這樣的代碼段,看起來像這樣的代碼段:)){ //數據庫操作... 迴聲“操作完成”; 死(); } ? > ...
    程式設計 發佈於2025-05-29
  • 左連接為何在右表WHERE子句過濾時像內連接?
    左連接為何在右表WHERE子句過濾時像內連接?
    左JOIN CONUNDRUM:WITCHING小時在數據庫Wizard的領域中變成內在的加入很有趣,當將c.foobar條件放置在上面的Where子句中時,據說左聯接似乎會轉換為內部連接。僅當滿足A.Foo和C.Foobar標準時,才會返回結果。 為什麼要變形?關鍵在於其中的子句。當左聯接的右側...
    程式設計 發佈於2025-05-29
  • 如何使用組在MySQL中旋轉數據?
    如何使用組在MySQL中旋轉數據?
    在關係數據庫中使用mySQL組使用mySQL組進行查詢結果,在關係數據庫中使用MySQL組,轉移數據的數據是指重新排列的行和列的重排以增強數據可視化。在這裡,我們面對一個共同的挑戰:使用組的組將數據從基於行的基於列的轉換為基於列。 Let's consider the following ...
    程式設計 發佈於2025-05-29
  • 如何從PHP中的Unicode字符串中有效地產生對URL友好的sl。
    如何從PHP中的Unicode字符串中有效地產生對URL友好的sl。
    為有效的slug生成首先,該函數用指定的分隔符替換所有非字母或數字字符。此步驟可確保slug遵守URL慣例。隨後,它採用ICONV函數將文本簡化為us-ascii兼容格式,從而允許更廣泛的字符集合兼容性。 接下來,該函數使用正則表達式刪除了不需要的字符,例如特殊字符和空格。此步驟可確保slug僅包...
    程式設計 發佈於2025-05-29
  • 為什麼PYTZ最初顯示出意外的時區偏移?
    為什麼PYTZ最初顯示出意外的時區偏移?
    與pytz 最初從pytz獲得特定的偏移。例如,亞洲/hong_kong最初顯示一個七個小時37分鐘的偏移: 差異源利用本地化將時區分配給日期,使用了適當的時區名稱和偏移量。但是,直接使用DateTime構造器分配時區不允許進行正確的調整。 example pytz.timezone(&#...
    程式設計 發佈於2025-05-29
  • 人臉檢測失敗原因及解決方案:Error -215
    人臉檢測失敗原因及解決方案:Error -215
    錯誤處理:解決“ error:((-215)!empty()in Function Multultiscale中的“ openCV 要解決此問題,必須確保提供給HAAR CASCADE XML文件的路徑有效。在提供的代碼片段中,級聯分類器裝有硬編碼路徑,這可能對您的系統不准確。相反,OPENCV提...
    程式設計 發佈於2025-05-29

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3