[問題] 在流程中插入檢查或不檢查 程式怎麼寫
有遇到一個程式流程中 某些步驟可能要檢查或不檢查的問題 想請問該
怎麼寫比較好. 語言是使用C++
首先我有一個computing class, 裡面有個member function,
專門負責做計算的動作 而裡面有七個步驟:
class Engine::compute(...arguments...)
1. compute1
2. compute2
3. if checking fails this return pre-condition is not satisfied
4. compute3
5. foreach cofig in allowed_user_configurations
6 if checking succeed then store this configuration
7. return allowed_configuration
步驟3)跟步驟6)的檢查是由一個complianceChecker的class來做的:
bool compliance.check(....arguments....)
現在呢 為了一些原因 提供了一個選項 可以讓步驟3.)跟步驟6.)的檢查不做-也就是
永遠檢查成功, 請問要怎麼在不動到主流程的狀況下, 來達成這件事情呢?
因為這邊是簡化版本 但其實檢查的地方大概十多處....
全部都加if-else好像不是太好 如果考慮到未來在其他部分需要加檢查 或是未來
流程異動 這樣if-else很容易漏掉 或是忘記要加if-else
目前我的想法是 加一個wrapper class在compliance checker上 ctor吃一個要不要
做檢查的boolean, 然後有一個perfect forwarding的 member function取代掉
原本的 compliance checker的check function(轉call):
class wrapper {
public:
wrapper(bool doCheckIn): doCheck(doCheckIn) {}
template <typename ... Args>
bool check(Args&& ... args){
return !doCheck || checker.check(std::forward<Args>(args) ... );
}
private:
compliance checker
bool doCheck;
}
然後在第一行之前生成這個wrapper, 用這個wrapper取代掉步驟3.)跟步驟6.)的
compliance class:
class Engine::compute(...arguments...)
==> 0. wrapper newChecker(doCheckOrNot);
1. compute1
2. compute2
=> 3. if (!newChecker.check(...)) return the pre-condition is not satisfied
......................
5. foreach cofig in allowed_user_configurations
==> 6. if (newChecker.check(....)) then store this configuration
7. return allowed_configuration
目前這個做法有一些好處:
1. 不動到compliance checker, 而且也不用怕compliance checker的interfance of
check function會改變(用template+perfect forwarding處理掉了)
2. 整個流程不變 邏輯上也很分明 就是有檢查跟永遠成功這兩種
但是有些不順的地方:
1.這個wrapper class定位很尷尬, 不知道要當作一個放出來給大家用的class 或是該
跟誰綁在一起 綁在一起是指邏輯關係上.......現在wrapper class九成像syntax sugar
我直接放在CPP file的 anonymous的namespace裡 XDDDDD
未來 若別的地方遇到同一種狀況 是不是又要寫一次? 要不然就要把這個有template的
wrapper class放在header, 但這樣會引進compliance class的dependency.....
2. 要改寫成virtual function的形式嗎? 這樣可繼承之類的
但因為有用到template所以 沒法用virtual function, 而且只有兩種狀況
用virtual是否有效益呢?
3. wrapper class生成後 就決定他的行為了(由ctor的參數決定) 要動態變化就得再多
一組setter/getter. 想要動態變化的理由是 這樣wrapper可當作一個member variable..
不知道要當作local variable還是member variable比較好......
其實覺得這種狀況應該是一個非常標準且常見的狀況(二選一) 只是不曉得一般是怎麼
處理的 覺得應該是繼承+virtual function處理居多吧? 但個人比較傾向少用繼承
先嘗試template + 組合的方式, 或是virtual function是做在別的地方的方式
P.S. compliance checker是我們動不了的一個class.......
在此 想請各位給一些想法跟建議~~~謝謝~~~
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.164.105.187 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1698596742.A.6F2.html
※ 編輯: saladim (1.164.105.187 臺灣), 10/30/2023 00:26:06
※ 編輯: saladim (1.164.105.187 臺灣), 10/30/2023 00:29:29
推
10/30 08:41,
1年前
, 1F
10/30 08:41, 1F
→
10/30 08:41,
1年前
, 2F
10/30 08:41, 2F
→
10/30 08:41,
1年前
, 3F
10/30 08:41, 3F
→
10/30 08:41,
1年前
, 4F
10/30 08:41, 4F
→
10/30 08:41,
1年前
, 5F
10/30 08:41, 5F
→
10/30 08:41,
1年前
, 6F
10/30 08:41, 6F
→
10/30 08:41,
1年前
, 7F
10/30 08:41, 7F
→
10/30 08:41,
1年前
, 8F
10/30 08:41, 8F
→
10/30 08:41,
1年前
, 9F
10/30 08:41, 9F
→
10/30 08:41,
1年前
, 10F
10/30 08:41, 10F
→
10/30 08:41,
1年前
, 11F
10/30 08:41, 11F
→
10/31 03:17,
1年前
, 12F
10/31 03:17, 12F
→
10/31 03:19,
1年前
, 13F
10/31 03:19, 13F
→
10/31 03:20,
1年前
, 14F
10/31 03:20, 14F
→
10/31 03:21,
1年前
, 15F
10/31 03:21, 15F
→
10/31 03:22,
1年前
, 16F
10/31 03:22, 16F
→
10/31 03:24,
1年前
, 17F
10/31 03:24, 17F
→
10/31 03:25,
1年前
, 18F
10/31 03:25, 18F
→
10/31 03:27,
1年前
, 19F
10/31 03:27, 19F
→
10/31 03:28,
1年前
, 20F
10/31 03:28, 20F
推
10/31 11:07,
1年前
, 21F
10/31 11:07, 21F
→
10/31 11:07,
1年前
, 22F
10/31 11:07, 22F
→
10/31 11:07,
1年前
, 23F
10/31 11:07, 23F
→
10/31 11:07,
1年前
, 24F
10/31 11:07, 24F
→
10/31 11:07,
1年前
, 25F
10/31 11:07, 25F
→
10/31 11:07,
1年前
, 26F
10/31 11:07, 26F
→
10/31 11:07,
1年前
, 27F
10/31 11:07, 27F
→
10/31 11:07,
1年前
, 28F
10/31 11:07, 28F
→
10/31 11:07,
1年前
, 29F
10/31 11:07, 29F
→
10/31 11:07,
1年前
, 30F
10/31 11:07, 30F
→
10/31 11:07,
1年前
, 31F
10/31 11:07, 31F
→
10/31 11:07,
1年前
, 32F
10/31 11:07, 32F
→
10/31 11:07,
1年前
, 33F
10/31 11:07, 33F
→
10/31 11:07,
1年前
, 34F
10/31 11:07, 34F
→
10/31 11:07,
1年前
, 35F
10/31 11:07, 35F
→
10/31 11:07,
1年前
, 36F
10/31 11:07, 36F
推
10/31 12:32,
1年前
, 37F
10/31 12:32, 37F
→
10/31 12:33,
1年前
, 38F
10/31 12:33, 38F
→
10/31 12:35,
1年前
, 39F
10/31 12:35, 39F
→
10/31 12:36,
1年前
, 40F
10/31 12:36, 40F
→
10/31 12:38,
1年前
, 41F
10/31 12:38, 41F
推
11/01 09:06,
1年前
, 42F
11/01 09:06, 42F
→
11/02 03:14,
1年前
, 43F
11/02 03:14, 43F
→
11/02 03:15,
1年前
, 44F
11/02 03:15, 44F
→
11/02 03:16,
1年前
, 45F
11/02 03:16, 45F
→
11/02 03:18,
1年前
, 46F
11/02 03:18, 46F
→
11/02 03:21,
1年前
, 47F
11/02 03:21, 47F
→
11/02 03:22,
1年前
, 48F
11/02 03:22, 48F
→
11/02 03:23,
1年前
, 49F
11/02 03:23, 49F
→
11/02 03:25,
1年前
, 50F
11/02 03:25, 50F
推
11/04 10:30,
1年前
, 51F
11/04 10:30, 51F
推
11/04 12:29,
1年前
, 52F
11/04 12:29, 52F
→
11/04 12:30,
1年前
, 53F
11/04 12:30, 53F
→
11/04 12:31,
1年前
, 54F
11/04 12:31, 54F
→
11/04 12:31,
1年前
, 55F
11/04 12:31, 55F
→
11/04 12:36,
1年前
, 56F
11/04 12:36, 56F
→
11/04 12:36,
1年前
, 57F
11/04 12:36, 57F
→
11/04 12:37,
1年前
, 58F
11/04 12:37, 58F
→
11/04 12:38,
1年前
, 59F
11/04 12:38, 59F
推
11/06 03:30,
1年前
, 60F
11/06 03:30, 60F
→
11/06 03:30,
1年前
, 61F
11/06 03:30, 61F
推
12/02 13:43,
11月前
, 62F
12/02 13:43, 62F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章