你在用什麼思想編碼 事務指令碼 OR 物件導向?

2021-09-06 15:48:15 字數 2564 閱讀 1820

最近在公司內部做技術交流的時候,說起技能提公升的問題,調研大家想要培訓什麼,結果大出我意料,很多人想要培訓:物件導向編碼。於是我丟擲乙個問題:你覺得我們現在的**是物件導向的嗎?有人回答:是,有人回答否。我對這個問題的回答是:語法上,是了,但是架構上或者思想上,不是。我們現在的大部分**,如果要死扣乙個名詞的話,那就是:事務指令碼。

1:最開始的事務指令碼

在 martin fowler 的書中,存在乙個典型的 應用場景,即「收入確認」(revenue recognition)。該「收入確認」的描述:

一家軟體公司有3種產品,其售價策略分別為,第一種:交全款才能賣給你;第二種,付三分之一,就給你,60天後,再給1/3,90天後給完全部;第三種,付1/3,就給你,30天後給1/3,60天後給完。

但是,關於這個描述,我打算多囉嗦幾句,而且個人覺的這個囉嗦非常之緊要,因為它影響到了我們的設計。以下是囉嗦的部分:

「收入確認」,在概念上,確實是產品的入賬策略,實際上,martin 的**,也是這麼去實現的,不同的產品有不同的入賬策略。不過,資料庫實現,revenuerecognition 這個表記錄的是「產品的某個合同根據產品型別所計算出來的:應該執行的入賬日及金額」,即策略是跟著合同走的,而不是跟著產品走的。這很有意思,如果你精讀此部分,這種矛盾就會一直糾結在你心頭。同時,我們又不得不時刻提醒自己存在的這個需求。

現在,關於這個場景,如果我們理解了 產品 合同 revenuerecognition 之間的關係,我們就很能理解了資料庫是被設計成這樣的:

其概念模型為如下:

好了,現在我們來看看什麼是事務指令碼,對的,就用**來說話。在原文中, martin 舉了兩個例子,但是精讀之後,我打算將其顛個倒,把原文中的示例2講在前頭。因為示例2,很好的表達了什麼才是作者或者譯者眼中的「收入確認」,以及我眼中的「收入策略」。

第乙個要實現的功能,即第乙個事務指令碼描述如下:

根據合同 id,找到該合同,並根據合同型別得到應該在哪天收入多少錢,並插入資料庫。

從該描述中,我們知道,這個指令碼最應該發生在簽訂合同時。因為合同一旦簽訂,就應該記錄什麼時候應該收到客戶端多少錢。**如下:

class recognitionservice

else if(type == "w")    // 文書處理

else if(type == "d")    // 資料庫

}   

}

第二個需求是:計算某合同在某個日期前的應該有的入賬。

class recognitionservice

return r; } }

從上面的**,我們可以看出什麼才是 事務指令碼:

1:採用面向過程的方式組織業務邏輯;

2:沒有或盡量少的實體類;

3:乙個方法一件事情,故有大量業務類或方法;

4:能與行資料入口表資料入口很好協作;

2:事務指令碼之變體

class recognitionbll

else if(type == "w")    // 文書處理

else if(type == "d")    // 資料庫 }

// 得到哪天前入賬了多少

public double recognizedrevenue(long contractnumber, datetime asof)

return r; } }

public class product

public class contact

public class revenuerecognition

在這個事務指令碼的變種中,我們看到了所有人寫過**的影子:

1:有了實體類了,所以看上去貌似是物件導向編碼了;

2:看到了 「三層架構」 了,即:實體層、dal層、業務邏輯層等;

但是,它仍舊是 事務指令碼 的!唯一不同的是,它光鮮的把 dataset 變成了 list了!

3:什麼是物件導向的?

那麼,什麼是物件導向的編碼,物件導向的乙個很重要的點就是:「把事情交給最適合的類去做」,並且「你得在乙個個業務類之間跳轉,才能找出他們如何互動」。這確實是個不那麼簡單的話題,而本文的主旨也僅在於指出,如果我們的**中還沒有 工作單元 對映 快取 延遲載入 等等概念,即便我們編碼再熟練,也僅僅是在熟練的 面向過程編碼。

你在用什麼思想編碼 事務指令碼 OR 物件導向?

最近在公司內部做技術交流的時候,說起技能提公升的問題,調研大家想要培訓什麼,結果大出我意料,很多人想要培訓 物件導向編碼。於是我丟擲乙個問題 你覺得我們現在的 是物件導向的嗎?有人回答 是,有人回答否。我對這個問題的回答是 語法上,是了,但是架構上或者思想上,不是。我們現在的大部分 如果要死扣乙個名...

hash(雜湊) 思想 編碼應用

雜湊 1,思想 引入 直接把輸入的數作為陣列的下標來對這個數的性質進行統計 但是如果輸入的範圍大於10 9或是字串,就不能將它們直接作為陣列下標了。核心思想 將元素通過乙個函式轉為整數,使得該整數可以盡量唯一地代表這個元素。這個函式就是雜湊函式 即 如果乙個元素在轉換前為key,那麼轉換後就是乙個整...

你最近在用什麼語言寫些什麼東西 V2EX

你最近在用什麼語言寫些什麼東西 v2ex 用python 寫了個某電商的 監控軟體,低於期望 自動下單,並自動通過飛信發簡訊到手機提示下單結果你最近在用什麼語言寫些什麼東西 v2ex 用go寫vps管理系統。嗯另外發現個go實現的dns伺服器,fork了下準備搞個geodns玩玩。cc cuptoo...