Re: [請益] 低耦合 高內聚?

看板Soft_Job作者 (lonely)時間14年前 (2012/01/28 02:10), 編輯推噓3(300)
留言3則, 3人參與, 最新討論串4/4 (看更多)
※ 引述《Elly (●A利 ●A你)》之銘言: : 常聽到IT人在說低耦合,高內聚,小妹我也希望能作到如此... : 但以我一個初學者,實在很難以理解,到底要如何實作呢? : 最近,我練習作一個client-server-db架構的底層, : 以我一個初學者的想法, : 當然就是作一個Base Form, 讓所有表單來繼承... : 我把每個視窗都會出現的新增、修改、審核、刪除、 : 取消刪除、退回、清除畫面....等按鈕都拉一拉, : 以及中間放一個panel,加以配色、排版後, : 再加上一些屬性:ex.上述按鈕各要呼叫哪些server端的method...等, : 然後再註冊上述按鈕的事件, : 在事件中去呼叫那些屬性設好的Method, : 當然...我還沒能作到讓繼承的表單什麼code都不用寫,只要設一設就可以動, : 因為每個表單總有它特別要處理的地方, : 像是輸入的欄位,都要個別再拉,個別依狀況處理, : 所以我又在Base Form中所有我註冊事件中 : 呼叫我為它們加上的一個[可override的Method], : 讓繼承表單可以override實作內容... : 另外我也花了不少時間繼承開發工具內建的輸入元件, : 像是TextBox, Grid, ComboBox等等,再為他們加上一些功能 : 作了很久之後, : 我覺得...好亂呀XD.... : 所以我想到了IT人常說的, : 要作低耦合+高內聚, : 我悟性不太好,又再去google了好幾次... : 猜想應該是不要作一個Base Form來繼承, : 而是將Base Form要作的事,都提出來寫成很多個小小的靜態函數, : 再讓其它Form呼叫這些靜態函數就好了嗎? : 但這樣感覺好像每個Form都會寫差不多code耶~有點像在複製貼上... : 我實在很疑惑@@? : 有人能教教我嗎?感恩啊~ 低耦合、高內聚只是一種狀態上的形容,對你的學習並沒有太大的意義。 就像我們說某人看起來很幸福,但要怎麼做到跟他一樣幸福還是得研究 細節才會明白如何接近那種狀態。 回顧一下你的描述: =========================================================== 當然就是作一個Base Form, 讓所有表單來繼承... 我把每個視窗都會出現的新增、修改、審核、刪除、 取消刪除、退回、清除畫面....等按鈕都拉一拉, 以及中間放一個panel,加以配色、排版後, 再加上一些屬性:ex.上述按鈕各要呼叫哪些server端的method...等, 然後再註冊上述按鈕的事件, 在事件中去呼叫那些屬性設好的Method, 當然...我還沒能作到讓繼承的表單什麼code都不用寫,只要設一設就可以動, 因為每個表單總有它特別要處理的地方, 像是輸入的欄位,都要個別再拉,個別依狀況處理, =========================================================== → Elly:回1樓,我已將base form內很多東西依功能切割成小小的method 01/19 22:02 → Elly:但很疑惑的是,我要不要將base form給砍了~裡面的method寫成靜 01/19 22:03 → Elly:態Methods呢? 01/19 22:03 =========================================================== 你現在的想法都單純在『形式』上打轉,是說選用繼承的策略包裝 出一個 BaseForm,裡面提供實作表單時需要用的的 method。或是 不需要有 BaseForm 把原本寫在它上面的方法變成 static method。 這個選擇只是單純將程式碼『集結』的形式上做改變,你沒有反映 出處理表單時應該涵含的『行為』。 因此,我一開始給予的評論就是:『設計不在於形式,而是在於行為。』 把程式碼搬來搬去的行為主要是著眼在重構,你目前的做法只能夠 稱為利用『繼承』的形式來進行一個開始實作前的重構,因為你預 先想好了哪些『零碎』的程式片段應該是一個『動作』,並將它們 一一轉化為 method。 當有人要開發新的 Form 時,就得繼承你的 BaseForm,利用一些 你提供的 method 讓整件事變得更加容易些。但是這些 method 在 你的描述上,看起來並不是必定會被後續的實作者採用,這意謂著 實作者可能會實作出跟你預想的行為有其大差距的 Form。 既然都開始規劃了個 BaseForm 了,你其實能再多想一點。 『每一位實作者的責任是什麼?』 如何透過『設計』輔助實作者滿足他應讓擔負的責任,以減少實作 過程因為疏乎而產生的 Bug 呢?你可以試想一下一個 Form 處理 的流程有哪些任務呢?當使用者輸入好內容後,它會 Submit,然 後進入『Business Logic』處理,誰該進資料庫的進資料庫,如何 讓資料回到 UI 顯示的資料回來: *. 一個 Form 操作的基本流程是什麼? *. 如何針對使用者提供的 input 提供 validation *. 如何針對不同使用者提供 authentication & authorization *. 如何規範資料庫存取的準則? 需要有完整的 Service Layer (Business Logic) 還是直接通達 DAO。 *. BaseForm 是直接綁定 UI classes 還是獨立操作的? 如果是 UI classes 要如何隔離出 user input 以便於單元測試? 這只是一些簡單地提問,也許能幫助你去思考你想要針對哪些 『重點』進行設計。無需每個主題都提供設計 (Library or Framework), 重點在於你提出設計後,能達到防禦與進攻的需求: :: 讓參與實作的人避免寫出基本的 bug 像是明明有加 UI Control 但沒有人去取值回來使用。 :: 讓參與實作的人強迫接受一些規範 以先前的文章,您是在金融單位工作,那麼表單的輸入裡 user input validation 就是一個重要的項目。 舉例來說,繼承 BaseForm 的人都必需覆寫 boolean validate() :: 如何讓資料在 UI 與 Datasource 間自動地傳遞 使用者輸入資料很可能不是有空白的表單開始的, 而是先查出一筆記錄,然而以此狀態為基礎進行修改。 我們當然知道手工就是一個一個寫程式地設定上去, 但有些設計方式蠻值得參考的,像 Rails 或 Grails 那樣的方式。 我不確定你目前主要的需求是 Web App 或是 Desktop, 但他們都有現有的一些東西可以參考,Web Framework 多到不勝枚舉。而 Desktop GUI 相對是比較少的,您可 以參考 Web Framework 有的概念來實作。在我個人的經 驗中,用過比較有興有實用的大概是 Data binding framework: JFace Databinding http://www.vogella.de/articles/EclipseDataBinding/article.html Swing 也有相關討論 http://stackoverflow.com/questions/2400998/swing-data-binding-frameworks 針對不同的重點去提出你的設計,即使拼湊起來四不像也 無妨。設計的感覺與經驗都是這樣一步一步演化來的。有 一點需提醒的是:注意 anti-pattern 或 anti- 的問題。 提供設計並不是為了『解決』問題,多數的情況你會發現 問題是不會被解決的,而是被轉化成不同的問題,或是切 割成容易解決的問題。當你的新設計會造成更嚴重的問題 時,就是導入了一個不良的設計了。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.231.50.105

01/28 11:46, , 1F
推~感謝分享~學習了
01/28 11:46, 1F

01/28 11:50, , 2F
01/28 11:50, 2F

01/29 14:07, , 3F
推~感謝
01/29 14:07, 3F
文章代碼(AID): #1F8kYDBQ (Soft_Job)
文章代碼(AID): #1F8kYDBQ (Soft_Job)