使用面向對象抽取業務演算法

来源:http://www.cnblogs.com/wangsen/archive/2017/12/01/7942065.html
-Advertisement-
Play Games

描述 前面我們已經對領域內的名詞進行了抽取,並且已經確定了業務流程中參與的核心對象。 但是對象只是靜態的描述,系統中往往會有很多的業務操作,偏演算法的,之前我們說過 領域內的對象往往是比較穩定不怎麼變化的,但是,業務的流程以及業務操作這些是往往 千變萬化,防不勝防,那麼我們如何去及時發現這些系統內變化 ...


描述

前面我們已經對領域內的名詞進行了抽取,並且已經確定了業務流程中參與的核心對象。
但是對象只是靜態的描述,系統中往往會有很多的業務操作,偏演算法的,之前我們說過
領域內的對象往往是比較穩定不怎麼變化的,但是,業務的流程以及業務操作這些是往往
千變萬化,防不勝防,那麼我們如何去及時發現這些系統內變化點,並且如何使用面向對象
的方式去抽象,封裝它呢?,下麵就簡單介紹我們大神的一些個人經驗,也在此記錄一下。

目的

關註系統中的變化點或者說業務的流程中某個節點的多變的演算法,
提供系統的可維護性和擴展性。

步驟

先說步驟,步驟後面跟著一些場景進行解析,試著理解步驟。

找出變化點

這是第一步也是關鍵的一步,如果你連這個系統中的變化點都找不到,下麵的工作也就
無從談起,所以我們在這個階段就要去細心觀察找出那些業務的變化點,
一般的我們可以從產品的原型中,產品的溝通中可以找到:
關註那些從描述上看起來不一樣,卻又是在做同一件事的場景。

去限定詞

找出這個場景或者演算法每次而且每條都出現的領功能變數名稱詞和沒有限定詞的動詞,其他的全部可以忽略。
簡單的說就是把場景中的不斷出現的領功能變數名稱詞都刪除掉,留下動詞。

抽取動詞

根據上一步的操作,我們對場景中的動詞需要進行抽象一下,使用一個動作統一概括。

抽取介面

將這個動作作為一個介面存在,確定這個介面中的方法用來做什麼以及它的輸入,輸出。
說白了就是定義一個函數的名稱,參數,返回值。
一般來說輸入的要是抽象中每次都出現的名詞,輸出是這個抽象需要的內容。

聚合介面

並不是說一個介面只能有一個方法,實際上,有些方法是成雙成對,甚至是成幾對出現的。
如果發現兩個介面合在一起剛好可以表達一個完整的事情就可以將這兩個介面合併成一個介面。

實例解析

場景一描述

在優學習(教育網站http://www.uxuexi.com)這個網站上為用戶提供了很多的服務,比如:
可以購買單個視頻進行觀看,
也可以將視頻打包購買進行觀看,
可以購買閱卷服務讓老師給用戶的試卷進行評閱
也可以購買約課的服務讓老師上門或者線上進行輔導
這個業務場景是一個變化點,因為平臺中可以添加任何具有服務性質的東西讓用戶購買。
這裡可以抽取一個商品的概念,其實用戶購買的就是商品,不管它是視頻,評捲服務,輔導服務都是商品。
所有我們按照步驟就這麼做。

去限定詞:

購買xx商品得到xx商品的服務

抽取動詞:

購買,服務

抽取介面:

IBuy
介面中的方法:
方法名稱:goToBuy
參數:商品
執行:完成購買
返回:空
IService
方法名稱:supply
參數:商品
執行:商品提供的服務
返回:空

類圖如下:

合併介面

我們會發現但凡我們需要增加一個商品都需要實現這兩個介面,這個時候就說明我們可以
將這兩個介面抽取成一個介面,這就是聚合介面。

類圖如下:

場景二描述

在電商網站中支付是一個重要的環節,往往會有以下需求:
用戶可以使用支付寶完成訂單支付
用戶可以使用微信完成訂單支付
用戶可以使用銀行卡的方式完成訂單支付

找出變化點

這個場景的變化點就是用戶可以使用多種方式完成支付。

去限定詞

使用xx方式完成訂單支付

抽取動詞

這個場景強調的動作是支付,所以動詞應該就是:去支付
但是,我們知道每一個支付都需要我們提供給一個支付完成的回調供支付平臺通知支付結果,
所以這裡要添加一個動作:完成支付

抽取介面

介面中的方法:
方法名稱:goToPay
參數:訂單
執行:完成購買
返回:空
方法名稱:finish
參數:訂單
執行:完成購買
返回:空

類圖:

場景三描述

在做優學習網站時,出現了這麼一個場景,每一個視頻的播放需要鑒權,
也就是說用戶點擊某個視頻的時候由後臺決定他是否有觀看的許可權。
情況如下:
免費的視頻可以觀看
課程包中的第一個視頻可以觀看
購買的視頻中包含這個視頻的可以觀看
請求來源的功能變數名稱如果在白名單中可以觀看所有視頻
網站的合作商可以觀看所有視頻
等等。。。。

找出變化點

判斷視頻是否可以播放的條件在不斷增加,這就是一個變化點。

去限定詞

視頻是否可以觀看

抽取動作

判斷視頻是否可以觀看其實就是鑒權,所以動作就是:是否可以播放

抽取介面

介面名稱:IVideoAuthentication
介面中的方法:
方法名稱:goToPay
參數:視頻id
執行:判斷是否具有播放許可權
返回:布爾

類圖:

設計心得

介面有了,但是我們怎麼更好組織它呢?
一般的場景我們可以採用以下方案:

平行演算法

如果這些介面的具體實現在同一時刻只能出現一個具體演算法,這些演算法又可以平行替換,
我們就可以參考“策略模式"去設計。

串列演算法

如果這些介面的具體實現在同一時刻有可能需要組合一起去完成某個功能這就是串列,
我們可以使用”職責鏈模式“去設計。

考慮重用

如果這些演算法之間有一些公用的邏輯,業務,演算法我們可以考慮使用,模板模式,裝飾模式去解決重覆問題,
讓我們的設計更加合理有擴展性。


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

-Advertisement-
Play Games
更多相關文章
  • 格式化D盤1.右擊我的電腦2.高級系統設置3.高級4.性能->設置5.高級->虛擬記憶體(更改)6.雙擊D設置->無分頁文件7.確定->重啟電腦 ...
  • 1.cpu #lscpu命令,查看的是cpu的統計信息.(部分舊版本不支持) 使用#cat /proc/cpuinfo ,可以知道每個cpu信息,如每個CPU的型號,主頻等。 2.記憶體 #free -m # 查看記憶體使用量和交換區使用量 # cat /proc/meminfo #dmidecode ...
  • 日誌文件系統(journaling file system)是一個具有故障恢復能力的文件系統,在這個文件系統中,因為對目錄以及點陣圖的更新信息總是在原始的磁碟日誌被更新之前寫到磁碟上的一個連續的日誌上,所以它保證了數據的完整性。當發生系統錯誤時,一個全日誌文件系統將會保證磁碟上的數據恢復到發生系統崩潰 ...
  • 磁碟整理是對磁碟長期使用過程中產生的不連續的文件碎片進行拼接、移動、整合,將不在一處的同一文件移動到一起,釋放出被浪費掉的可用磁碟空間,也便於系統快速準確地找到所需的數據。 由於磁碟的磁頭在讀寫文件時是連續讀取的,如果文件不連續,那麼磁頭就需要反反覆復來回掃描那些不連續的文件,再從緩存中將這些不連續 ...
  • 《Linux設備驅動》 -- 也就是我們所說的LDD3了; 適合一定基礎的人閱讀,深入學習Linux不可或缺的知識; 《UNIX環境高級編程》 這本書並不是面對linux內核的書,但是我是從最基礎看這本書逐步入門的; 《Linux內核完全剖析》 本書對早期Linux內核(v0.12)全部代碼文件進行 ...
  • 基礎知識: 1、Redis的數據類型: 字元串、列表(lists)、集合(sets)、有序集合(sorts sets)、哈希表(hashs)2、Redis和memcache相比的獨特之處: (1)redis可以用來做存儲(storge)、而memcache是來做緩存(cache)。這個特點主要是因為 ...
  • 1.1 負載均衡介紹 1.1.1 負載均衡的妙用 負載均衡(Load Balance)集群提供了一種廉價、有效、透明的方法,來擴展網路設備和伺服器的負載、帶寬、增加吞吐量、加強網路數據處理能力、提高網路的靈活性和可用性。 ü 單台電腦無法承受大規模的併發訪問或數據流量了,此時需要搭建負載均衡集群把 ...
  • 1、下載軟體包 wget http://pecl.php.net/get/redis-2.2.5.tgz 2、解壓 tar zxvf redis-2.2.5.tgz 3、進入安裝目錄 cd redis-2.2.5 4、用phpize生成configure配置文件 /usr/local/php/bin ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...