剔除設計中多餘的概念

2021-04-06 21:05:33 字數 1888 閱讀 7604

軟體設計首先要整理使用者的業務模型,然後以此為參照,結合環境條件,建立軟體系統模型。在這個過程中,很重要的一點是:要剔除軟體模型中多餘的概念。

哪些是「多餘的概念」呢?如果乙個概念是從使用者的業務模型中無法直接觀察到的,而是設計者推想出來的,那麼這個概念就是多餘的概念。

我們想象乙個鐵路公司,經營著abcd四個城市之間的路線。這幾個城市的位置如下:

鐵路公司的老闆想做乙個售票系統,他找到一家軟體公司。假設我就在這個軟體公司工作,擔任這個專案的負責人。鐵路公司的老闆這麼對我說:從a到b的票價是50元,從b到c的票價是60元,從c到d的票價是30元,如下:

在這個基礎上,兩個城市之間的票價是各段之和。比如:從a到c的票價是ab+bc,就是110元。

於是,回到辦公室裡,我開始設計這個系統。我想:這個系統很簡單,以a城市作為起點,把從a城市到各個城市之間的票價記錄下來。就像這樣,我設計了乙個資料表,儲存票價,他是這樣的:

sql>select * from ticket_price;

city    price

---------------

a       0

b       50

c       110

d       140

當旅客來買票,要從b到c去的時候,我們就用c的票價減去b的票價,得到從b到c的票價,得到60元。想從d到b,就用d的票價減去b的票價,得到90元。

這個設計非常簡潔,看上去沒什麼問題。按照這樣的想法,我們開始寫**了。但是,很快我就遇到了麻煩。

鐵路公司的老闆打來乙個**,他說:我們正在對票價做一些調整,從a到b的票價保持50元,b到c保持60元,但是從a直接到c的票價現在調整到100元。並且從c到a的票價要打乙個8折,就是80元。

現在麻煩了,ticket_price這個表面臨著重大的變動,所有基於這個表的業務邏輯都要改了。

煩惱的由來是什麼呢?原因在於,這個設計是基於我的乙個推論,而不是可以直接觀察到的業務事實。直接觀察到的業務事實是:a到b的票價是50元,b到c的票價是60元,a到c的票價是110元……而我在這個基礎上做了乙個推斷:a到c的票價是ab+bc。當然,我做出這個錯誤的推斷,有鐵路公司老闆的一部分「功勞」。無論怎樣,變更不可避免,鐵路公司和我,都必須承擔這個錯誤的後果。鐵路公司要追加專案投資,我們的開發成本要上公升,而我自己,肯定要加班了。

這個設計中有乙個多餘的概念:a城市是乙個基準點。這是乙個在業務過程中無法直接觀察到的概念,而我錯誤的將他作為整個系統的基礎,讓所有城市之間的票價以他們到a城市的票價為基準。

從業務中能夠直接觀察到的是什麼呢?只有兩個城市之間的票價。乙個乘客來到鐵路公司買票,從a到b是50元,從b到d是90元……他能觀察到的只有這些,而沒有作為某個基準點的a城市。系統的設計應該基於堅實的業務基礎,而不是任何推斷。「基準」這個概念需要從設計中剔除掉。

重新設計這個系統,應該用下面這樣的形式描述城市之間的票價:ab

cda0

50110

140b500

6090

c110600

30d

14090300

當然,我可以用這樣的資料表來儲存這樣的票價:

sql>select * from ticket_price;

start     destination      price

---------------------------------

a         b                50

b         a                50

a         c                110

c         a                110

b         c                60

......

如果我一開始就這樣設計的話,接到鐵路公司的**後,心裡就會舒服多了。

剔除集合中多餘的相同的值

我的第乙個想法 原集合 listoldlist mlist 新集合 無重複值的集合 listnewlist new arraylist 遍歷兩個集合,如果原集合裡的值與新集合裡面的所有值都不相同,則為true boolean check true 遍歷原集合 for int i 0 i oldlis...

DX中關於背面剔除概念的澄清

最近在渲染地形時發現把背面剔除模式設為ccw結果我的地形正面就顯示不出來了 知道是網格編織順序出了問題 但我記得我的網格是按順時針編織的 為了徹底將這一問題搞明白,去查了下dx 的sdk,結果發現裡面講得一團糟 上網搜了下,發現有不少人對這個問題也沒搞清楚.於是重新看了下andr lamothe的軟...

通過awk 和 sed 將多餘的列剔除

名詞注釋 awk f 指定分隔符 ofs 指定輸出分隔符 sedsed s test 2 a.log 將第二個 線替換為 test sed s space test 2 a.log 依照空格為分割注 需求將現有的 40 列,減少到 38 列 將第二列於第三列資料刪除 1.檢視檔案按照 切分可以分為多...