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

来源: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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...