[請益] 軟體開發的架構與職責

看板Soft_Job作者時間7年前 (2018/07/06 01:51), 編輯推噓7(7020)
留言27則, 8人參與, 7年前最新討論串1/2 (看更多)
「半夜睡不著覺, 把心情哼成歌」 大家晚上好, 因為開發卡關卻又睡不著所以上來聊聊近況並且請求建議與協助 先介紹一下我自己, 目前職稱是後端工程師, 使用語言為php, 相關年資累計約五年四個月 目前手上的 Project 使用 Laravel Framework 開發, 程式碼架構依目錄區分為 Controller(Presentation)->Service(Business)->Repository(Data)->Entity 基本上各層的存取範圍以箭頭方向為準且不可逆, 但因為協同開發的關係偶爾還是會出現 Controller直接存取Repository的情況 因為沒有新的 feature/issue 的關係, 所以本週有空檔可以回頭整理之前寫的程式碼 越整理我就越沮喪 我發現自己沒有分辨哪些邏輯該歸類到哪一層的能力, 舉例來說: -- 有一個 MemberService 的 Class, 負責跟會員有關的操作 裡頭有一個方法 paginate 會回傳指定頁數與數量的會員資料, 除了吃指定頁數與數量的參數以外這個方法也吃另一個叫 $filter 的參數 $filter 是陣列型態, 我會在方法的最開始檢查這次的 $filter 傳了哪些篩選條件進來 & 這些篩選條件有沒有符合預期的型態 在這裡我會想: $filter是陣列豈不是說其他要使用這個方法的人還需要知道可用的 key 有哪些? 那是不是把 $filter 拿掉改成 addNameFilter(value)->addGenderFilter(value)->paginate(page, perPage) 這樣比較好? 緊接著另一個聲音又出現了: 這樣是不是例外新增一個 MemberFilterService 比較好? 不然篩選條件越來越多怎麼辦? 後來我保留 $filter, 檢查完 $filter 之後丟給 Repository, 在 Repository 裡頭又寫了一些 if-else 判斷 $filter 提供了哪些篩選條件(但沒檢查內容是否符合預期型態) 然後我又想: 是不是乾脆把檢查的程序搬到 Repository 來就了? 或是在 Repository 裡頭加 addXXXXFilter? 可是這樣 Service 不就沒事幹了? --- 諸如此類的狀況, 導致本週我根本沒做多少事情還創造出一些荒腔走板的程式碼 我可以很快的完整交待的 feature/issue, 只要我能夠忍受程式碼職責切分不清 但事實是我也想不出更好的寫法, 深深感受到自己的無力也對於沒有任何產能感到壓力 希望版上各位前輩能對我這樣的困境給一點建議跟方向, 推薦書籍也行, 我最愛買書了(但都沒時間看QQ) -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.71.15.173 ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1530813105.A.DBF.html

07/06 03:05, 7年前 , 1F
這個直接電死
07/06 03:05, 1F

07/06 03:20, 7年前 , 2F
找 refactor 相關的書籍?
07/06 03:20, 2F

07/06 08:13, 7年前 , 3F
Bob大叔是精神支柱
07/06 08:13, 3F

07/06 08:36, 7年前 , 4F
建議可看看Domain driven design的書,對於各層職責會有
07/06 08:36, 4F

07/06 08:36, 7年前 , 5F
不同的想法
07/06 08:36, 5F

07/06 10:56, 7年前 , 6F
按照基本思維,Service是功能,Filter自然是在Service
07/06 10:56, 6F

07/06 10:56, 7年前 , 7F
,key不是問題,想用你的filter的人自然本來就需要了
07/06 10:56, 7F

07/06 10:56, 7年前 , 8F
解你的filter使用方式,不然就寫個enum用autocomplete
07/06 10:56, 8F

07/06 10:56, 7年前 , 9F
來選key。
07/06 10:56, 9F

07/06 11:42, 7年前 , 10F
同樓上,不然就學JAVA流吧,一堆o,定義的清清楚楚
07/06 11:42, 10F

07/06 13:20, 7年前 , 11F

07/06 21:26, 7年前 , 12F
先提醒 小心走火入魔 XD
07/06 21:26, 12F

07/06 21:26, 7年前 , 13F
基本上要把握一個大原則 「不要為了設計而設計」
07/06 21:26, 13F

07/06 21:27, 7年前 , 14F
要為了「改變」而去做設計 也就是說 當你困惑該怎麼分職責
07/06 21:27, 14F

07/06 21:28, 7年前 , 15F
或要使用哪一個架構時 先使用最簡單 最方便 最直覺的方式解
07/06 21:28, 15F

07/06 21:28, 7年前 , 16F
功能做出來測試也做好之後 想一想 這個部份是否「很常改變
07/06 21:28, 16F

07/06 21:29, 7年前 , 17F
」 如果幾乎不會改變 或是依照目前情況看下來 應該是不太會
07/06 21:29, 17F

07/06 21:30, 7年前 , 18F
有變動 那就可以放著了 如果你不確定這部份是不會之後會修
07/06 21:30, 18F

07/06 21:30, 7年前 , 19F
改到 你可以和其它工程師和需求方討論看看 甚至做個小投票
07/06 21:30, 19F

07/06 21:31, 7年前 , 20F
如果一開始就知道這部份常常會因為需求變化而要做更動 那就
07/06 21:31, 20F

07/06 21:31, 7年前 , 21F
得思考更靈活 但卻更複雜的架構了 這時再來重構它
07/06 21:31, 21F

07/06 21:33, 7年前 , 22F
回到你提的案例 真正要問的問題 是你的filter未來半年到一
07/06 21:33, 22F

07/06 21:33, 7年前 , 23F
年內是否會因為需求而要作修改 如果看起來不太會 那就用最
07/06 21:33, 23F

07/06 21:34, 7年前 , 24F
初的驗證寫好就好了 別再自尋煩惱
07/06 21:34, 24F

07/06 21:35, 7年前 , 25F
職責切分不清不是大問題 真正的問題是出在 你在沒有必要的
07/06 21:35, 25F

07/06 21:35, 7年前 , 26F
地方 也做了SOLID和設計模式 造成overdesign
07/06 21:35, 26F

07/06 21:36, 7年前 , 27F
要知道 職責不是分得越細越好 把東西拆開了 是有代價的
07/06 21:36, 27F
文章代碼(AID): #1RFbgns_ (Soft_Job)
文章代碼(AID): #1RFbgns_ (Soft_Job)