漫淡面向對象——POJO對象

来源:http://www.cnblogs.com/ansn001/archive/2017/11/19/7862470.html
-Advertisement-
Play Games

產品或者服務由數據存儲和數據計算組成。pojo對象就是用於數據存儲。一旦確定後,整個應用或者產品的數據來源就確定。比如一個頁面或者功能需要使用什麼數據就可以快速找到對應的對象或者通過對象的關係找出來。 pojo對象屬於對系統的靜態描述。它應該是名詞,不應該是動詞或者其他。動詞、類型或者狀態等應該是算 ...


產品或者服務由數據存儲和數據計算組成。pojo對象就是用於數據存儲。一旦確定後,整個應用或者產品的數據來源就確定。比如一個頁面或者功能需要使用什麼數據就可以快速找到對應的對象或者通過對象的關係找出來。

pojo對象屬於對系統的靜態描述。它應該是名詞,不應該是動詞或者其他。動詞、類型或者狀態等應該是演算法類型的對象,許可權應該是AOP考慮的,在後面的漫談里還會詳細提到。

目的

對領域的客觀描述反應。比如說:教育領域,農業領域,電商領域,零食領域等。這些只要領域背景沒有變化,就會是客觀穩定的。當然不同的產品的商業模式對同一個領域的理解也會不同,這些是會經常變化的,但是通常也只是體現在流程、類型、演算法、功能等上面,這些並不影響pojo對象。

  • 所有人在溝通的時候理解一致
  • 每個對象職責單一、明確、不可替代

屬性分類

為了快速區分屬性,並且快速找到真正的pojo對象和屬性。這些屬性可以在產品里的新增、詳情、列表等功能里得到體現。

自描述

一般體現出來的就是手動輸入。比如:名稱,標題等。

關聯

有依賴來源,即在別的地方是手動輸入,但是當前功能是選擇。比如:選擇地區,選擇類型。

冗餘

方便查詢,減少複雜度。一般有以下情況:

  • 一旦生成不會變化的,可以考慮冗餘,因為這樣可以減少複雜度。
  • 偏統計類。比如:視頻里冗餘評論數購買數。
  • 為了減少不同類型表的依賴。

功能

個性化業務,純粹是為了做功能

只留自描述,這個很難。需要深層次瞭解領域。通過領域驅動設計。這樣可以通過面向對象,通過很少的關註點,對整個系統有個靜態的認識。而且還可以判斷出產品變更的時候對整個系統的結構(即數據存儲)有什麼影響。特別是出現新名詞的時候。

需要根據產品的實際情況來判斷這些屬性怎麼規劃。如果是想要快速、簡單,但是4種類型都放到pojo上,開發是最快的,但是同時肯定也是擴展性最差的。也需要根據產品的真實需求來判斷怎麼處理後面3種類型的屬性。

抽取步驟

很多童鞋打著面向對象的幌子乾著面向過程的事。在抽取名詞的時候同時又考慮演算法、流程、許可權等。這樣一來關註點幾何倍數增長,本來應該用於考慮pojo對象是否合理的時間更沒辦法充分得到利用。

很多童鞋想成一次就把對象抽取出來。實現上抽取比印象中還要複雜。所以建議的是分步驟,按部就班的去抽取才是最快的辦法。

枚舉

只是把產品里涉及到的所有名詞枚舉出來。
下麵是枚舉時的陷阱:

  • 不要去通過自己的理解去修改名詞叫法
  • 不要去忽略自己覺得不重要的名詞
  • 不要考慮表怎麼存儲
  • 不要考慮非名詞

這些陷阱很容易讓後期返工。

刪除

刪除和產品(領域)無關的名詞。比如:文案可能出現了故宮或者平臺名等和本領域無關的名詞。

去重

必需確保每個名詞都是職責單一,不可替代的。
一般去重的特征如下:不同的名詞體現出來的屬性,功能和生命周期是一樣的,只是描述不同。
比如: 不同角色的人在對同一個名詞描述不同,他們在新增的時候屬性相似度非常高,流程也特別像。

一般的反問自己或者產品:

  • 它們的不同點在哪?
  • 如果改一個地方,另一個地方會不會需要同時修改?
  • 如果把它們做成一樣會有什麼問題嗎?

添加

  • 在描述一個概念的時候,必須通過非常多其他對象,而且經常提。
  • 雖然產品沒有提過,但是在實施的時候發生有很多對象有一樣的特性。常見情況:
    • 一個列表涉及到非常多的名詞,但是列表本身產品並沒有體現概念。
    • 不同的名詞,他們的屬性很雷同,而且生命周期幾乎是一樣的,有種幾條平行線的感覺。比如說:同樣要新增、發佈、審核等

聚合

把屬性名詞聚合到對象名詞里。這裡務必確認只放自描述屬性。其他的屬性暫時不考慮,因為可以很方便的通過關係來描述,而且這個也經常會變化。

陷阱

如果有以下的情況說明對象分析的不夠合理,後面很容易返工,請務必重視。

單方面描述

有一方有一直在說,但是另一方從來不提。說明這裡缺少重要名詞。

描述不一致

在描述同一名詞的時候,往往需求進一步翻譯。
這樣可能會出現的問題是:

  • 溝通和維護成本增加
  • 很可能缺少重要信息或者說關係理解的不對等。

組合描述

  • 用多個詞來描述一個概念。需要一個新詞。
  • 一個概念沒有具體自描述,而是關係出來的,但是又是溝通描述時經常出現。

推薦書單

  • 《UML基礎,應用與案例》
  • 《領域驅動設計》

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Joinpoint 連接點 Pointcut 切入點 Advice 通知/增強 舉例: Aspact 切麵 比如給add()增加日誌功能的過程即稱為切麵 還有幾個術語知道就可以,不常用 Introduction (引入)使用動態的方法在原有屬性基礎上 添加新屬性的操作 ...
  • 前言: 之前寫Java服務端處理POST請求時遇到了請求體轉換成字元流所用編碼來源的疑惑,在doPost方法里通過request.getReader()獲取的BufferedReader對象內部的 Reader用的是什麼編碼將位元組流轉換成字元流的呢?又是在哪裡設置呢和什麼時候生效的呢?通過查找資料, ...
  • 作者:NiceCui 本文謝絕轉載,如需轉載需徵得作者本人同意,謝謝。 本文鏈接:http://www.cnblogs.com/NiceCui/p/7862377.html 郵箱:[email protected] 日期:2017-11-19 Python學習二:詞典基礎詳解 (學習不要求多,小計劃 ...
  • 流程式控制制 與C語言不通的是python的流程式控制制代碼塊不是用{}花括弧表示的,而是強制縮進來控制的;而且縮進必須一致,官方推薦是使用4個空格,不建議使用tab(製表符)做縮進,一是不同的系統tab所占寬度不一致,會比較亂,二是由於python要求同級縮進必須保持一致,所以有些時候看上去是對齊l,但是 ...
  • Composer是一個非常流行的PHP包依賴管理工具,已經取代PEAR包管理器,對於PHP開發者來說掌握Composer是必須的. 對於使用者來說Composer非常的簡單,通過簡單的一條命令將需要的代碼包下載到vendor目錄下,然後開發者就可以引入包並使用了.其中的關鍵在於你項目定義的compo ...
  • 類的繼承 上面代碼中yello_person繼承了person父類。 子類中構造函數先對父類的構造函數進行繼承;然後加上自己的特有屬性。 18,19行示例如何使用對象分別調用父類和子類的方法 上面代碼中6行示例如何在構造函數中操作公有屬性,實現類似全局計數功能。 10行定義的方法示例如何在父類中列印 ...
  • 前言: 最近接手了一個項目,大概過了下需求,然後打開項目準備開搞的時候發現一個問題,這個項目是提供rest服務的一個web項目,其中很多關鍵的查詢都調用這個項目,之前的開發人員為了監控每個方法的執行時間,在方法開始和結束寫了很多logger.info("耗時:"+time)這種代碼。很顯然這是不合理 ...
  • 前言 本文可能不會詳細記錄每一步實現的過程,但一定程度上可以引領小伙伴走向更開闊的視野,串聯每個環節,呈現予你不一樣的效果。 業務規模 8個平臺 100+台伺服器 10+個集群分組 微服務600+ 用戶N+ 面臨問題 隨著分散式微服務容器技術的發展,傳統監控系統面臨許多問題: 容器如何監控 微服務如 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...