如題
目前做的project架構長這樣
Loader1 Loader2 Loader3 ........... Loader30
Area 1
Area 2
Area 3
....
....
Area 10
就是同一個Loader 會算出結果給不同Area的人
有分成前端跟後端,前後端都是我維護 (前端 .Net Framework java script MVC,會
用到一點 jquery,其他大多套套件用現成的物件再加工,後端就純C#
query DB用的工具是公版的不用自己寫,就負責input 要打的SQL跟DB,然
後output datatable或是對DB做insert/delete/update....)
Loader每支老闆認知都不算很大所以也是一人包辦XD
Loader每支的邏輯也類似:
Start
作者:
neo5277 (I am an agent of chaos)
2022-11-22 01:29:00我看到1=1了耶...也不要用*
作者:
peter98 (新兵)
2022-11-22 01:32:00把條件弄成dynamic 不要hardcoded 設定好權限 讓個別user可以選要加甚麼條件在filter裡 我做過這個 很難寫難在一堆無聊人士搞audit 設定權限他們也不懂
作者:
neo5277 (I am an agent of chaos)
2022-11-22 01:34:00辛苦啦,我是建議你讓sql參數化單純一點,把條件的東西搬去c#用策略模式做然後多使用虛擬類別,多的kpi用介面去加這樣你sql就相對單純現在這樣筆數多撈起來會很慢吧...然後你sql要板控的話可以加一個sql,專案在方案裡最終還是sp化接參數再透過策略選擇呼叫那一種就好好維護,改起來也快,而且會好閱讀很多吧
1=1是為了 後面串條件方便吧 應該是後面可能不會出現條件
作者: play714 (play) 2022-11-22 08:39:00
不太懂分那麼多支loader 的原因為何?
作者: CRPKT (crpkt) 2022-11-22 09:22:00
先把上游資料轉成同樣格式,query 的部分再跟著 area 版控現在這樣維護成本就是 loader 與 area 數量乘開把東西拆到讓維護成本變成加法是唯一的活路
作者:
enthos (影斯作業系統)
2022-11-22 09:32:00作者:
giacch 2022-11-22 11:41:00Loader1.GetSQLText(Area1), Loader2.GetSQLText(Area1)
作者:
wulouise (在線上!=在電腦前)
2022-11-22 12:08:00query可以獨立分開放在檔案裡讀吧?
作者:
brucetu (sec)
2022-11-22 17:12:00你做好一版 馬上把所有可能被影響的loader/area重跑 比對實際被影響的資料是否符合你預期 先建立這樣的系統避免改A壞B沒發現 再來談重構會發生改a壞b表示你有共用的code卻允許共用的其中一個需求端任意更改 這當然不正常, 如果一種東西會被多個需求端各自提需求修改 那這種東西不論有多相似 都應該建立單獨的class你的整個重構會很複雜不是你一人一兩個月就能完成 一定要先建立確保不會改A壞B的機制你這正常的架構就是要先定義原始資料類別有哪些, 聚合資料的filter有哪些你的loader程式應該要給每個最終報表有適當的命名 同時有文件紀錄每個報表會有哪些單位查看每一支報表由哪些資料源以及哪些filter算出中間的結果以及最終報表 要有文件當有人跟你說 他要增加採計AA類別 你就去查程式 採計AA類別這個行為是哪一支filter在處理, 有其他單位用到嗎?如果沒有 那大概就是直接修改這支filter 最終報表就會是他要的結果 也不影響別的單位. 如果有其他單位用到 你可能需要拆分成兩支filter給兩個單位使用 或是你的這個filter可以吃參數 那就是兩個area吃不同config即可. 最重要是不管你的架構如何 改完就是要測試確保沒有動到不該動的東西 這就是測試的覆蓋率的重要性最後建議 直接換工作
不太懂 老闆聽你這樣解釋之後還是認為是你的問題嗎通常這樣看你敘述下來就知道是架構問題了吧?
作者:
f821027 (蛋餅)
2022-11-22 18:43:00SQL WHERE 用 python 的 f-string 把 list 傳進去,這樣只要更新這個list就好
像是水流一樣,資料一站一站往下流,就很好追蹤!可能會變動的地方可以另開TABLE存放參考物件AA ,BB...後續就算新增參考,也只需更動參考TABLE內容,MAIN SQL部分只要寫好關聯,後續就不用一直改
已經有參數化,loader唯一有設計的就是把同一支loader的可能10幾、20幾支SQL擺在同一個class,然後用return string的方式去return SQL,只是除了用class的殼包住&部分用參數之外就沒做其他的了。參數有的帶了6-7個結果還是沒辦法把SQL拆到自由度完全釋放我的確很想by Area去把SQL list拆出來,但是可能和其他公司不同,SQL除了擺在公司共用的SQL池以外就是只有hard code一法,SQL池只是儲存string跟參數位置,假設要把本來是hard code的條件改成帶參數,就是原本C#裡面call SQL池的地方要改。例如string SQL=sql pool(type,gender)要改成SQL=sqlpool(type,gender,age)就要重新上code,不能自行維護一份txt檔就好感覺前人在這樣的infra環境下,選擇hard code或是擺SQL pool需要的effort是差不多的,為了快速完成,也不會去選擇把TABLE裡每個欄位都拆出來寫成class…table跟table我覺得關聯性很差,常常出現10幾個column的table,我資料庫不強不知道這算不算是架構不好的象徵QQ但大家的建議都很棒,我會多尋找機會點的!謝謝
作者:
giacch 2022-11-23 00:55:00sql = "" +(age != null ? "" +"\n and age = @age" +"" : "") +"";藍色的if可以寫成上面哪樣, 字串一直串不想整個Code重上, 可以拆成不同project (dll)若你將所有C# Code都寫在一個cs檔,就可以實現維護一份text參數太多可以考慮用一個物件來放(type, class or Dictionary<string, object> args)
作者:
hanshsu (小肉呆)
2022-11-23 11:16:00c# call sqlpool interface 改成傳 object 就可以解決改來改去的問題?
作者:
giacch 2022-11-23 11:28:00樓上是講我嗎? "實現維護一份text"那一行只是玩笑話不太懂樓上的意思
另外花點時間寫一支自己理解後的模組?然後兩邊比較結果,久了沒問題就能把舊的取代
作者:
qss05 (minami)
2022-11-24 22:53:00如果你會很常異動邏輯,通常會把核心做成view有需要再篩選吧,這樣就從資料庫改就好,子查詢也可以做成function放在資料庫
作者:
ck237 (白色小雞)
2022-11-25 01:09:00這個架構也太神奇了吧?
作者:
jack0204 (Jarbar王朝)
2022-11-26 09:11:00為啥不從程式去處理要用SQL去處理?