Re: [心得] 談.net mvc

看板Soft_Job作者 (沉默是金。)時間13年前 (2011/08/06 20:50), 編輯推噓9(9069)
留言78則, 8人參與, 最新討論串2/6 (看更多)
※ 引述《prag222 (prag)》之銘言: : → atst2:想請教一下,mvc的pattern其實很早就有了,可是我看板上最近 08/06 20:01 : → atst2:似乎很多網頁相關的都會把這拿出來講,有點當成新東西的意思 08/06 20:01 : → atst2:在, 是以往網頁技術沒有用到MVC的pattern嗎?還是最近有什麼 08/06 20:02 : → atst2:特別的,關於MVC的新想法呢? 08/06 20:02 : → atst2:當然,即便以desktop app來說, MVC依軟體規模,也常變型為  08/06 20:06 : → atst2:MC-V or CV-M 的型式,不過概念上應該是不會有太多更動的. 08/06 20:07 : → atst2:過去的網頁技術,在實現MVC上有特別困難嗎?我還以為網頁 08/06 20:07 : → atst2:反而是最能體現MVC的部分呢... 08/06 20:08 : → atst2:所以這裡的MVC指的是某種實作MVC pattern的方式囉? 08/06 20:08 我突然想一想我發現這是值得討論的。 網頁的基本形式是,page base, 一個 url 的連接,兩個常見 http method 的實作 (get/post)。 如果有玩過cgi / servlet / 早期 php / asp(非.net), 應該對那種有個 output stream (response) 一路 write 到底的 AP很有印象。 web 上談 MVC 的複雜度在於 1.html 其實是 view 的東西,所以一開始沒注意就容易髒掉, 變成一邊寫 view 一邊撈資料,這點一直到有一個階段之後才開始改善。 以 asp 體系來講,從 asp.net 就開始拆 controller, 也有比較豐富的helper 來做這些事情,板友所講的 .net mvc , 應該是 .net 3 還 3.5 以後才推出的新 pattern(吧)。 (歡迎勘誤,我實在有點久沒碰 .net 系列了。:P) 以 J2EE 體系來講,從早期的 java bean 實作到 jstl 等各taglib實作, java bean 或 jstl 都還是比較接近 view base 的東西。 再到現在常見的 struts 這種先讀完資料再進行畫面的分配的作法。 以 PHP 體系來講,像是 CodeIgniter 這類的 solution就算是比較晚成的, 現在接受度也正在抬頭。 當然也有新興的語言/框架是直接就把這件事作進他們預設的工作流程, 像是 ROR 就是個預設的案例就希望你寫 controller 的作法。 2.寫網頁的時候哪些是 mvc 要討論的重點? mvc 對網頁適不適合? 這個就是大哉問了。 a.一般來講網頁至少有一件事情是mvc該作得, 我認為資料的讀取(m) 應該先於 view 的生成。 :P 也就是我個人比較喜歡 rails 或 struts 這類的 solution, 在進入到頁面之前,先進行純資料讀取的程序。 但因為網頁大多是由許多片段頁面互相 include 組裝而成, 所以這資料讀取的作法怎麼作比較有效率跟可再利用,並不容易。 b.controller 的角色定義明不明確 一般 AP 狀況下,controller 基本上應該連事件的處理等都處理, 但是 web app 因為 stateless , 所以對事件的處理跟資料的保存有很大困擾。 i.controller 有人退守到 url base 的作法, 也就是透過特定路徑來進行特定操作,伺服器端只認 url 。 需要 client 互動的,就拆到 javascript 去做, javascript 事實上也參與了 controller 的部份角色。 (這個應該是躲不掉,只是比例問題而已, web 架構上 controller 先天就被切割成兩部份。 :( ) ii.透過特定的格式在每次 request 時保存狀態以達成事件操作 像 .net 的玩法就是預設透過 viewstate 保存狀態, 回到伺服器端的時候以此狀態來進行對應的事件操作。 其實就早期來講是蠻聰明的點子,因為對開發者負擔小, 對使用者來講討厭歸討厭,但是久了也就習慣了。 但現在由於網頁設計的多元化跟 javasript 的應用變多, 所以這樣的潮流也在順應時勢修改, 像是 ajax .net framework 就是個還算有趣的嘗試。 雖然我當時用 ajax .net framework 的想法是他受限於原本的框架, 所以用起來有很多有點彆扭或者意外的地方,好幾年過去了, 不知道現在有沒有好一點。:P GWT 類的 solution 也差不多可以放在這裡, 另外 rails 也有提供 form helper 算是簡化這件事情, 基本上也就是走 restful 路線實作http method,只是有util幫忙。 iii.順帶一提,我現在公司的作法,對這件事情算是採取比較激進的態度, 我們把狀態放在 session ,用某些有效方式去管理他使他不leak, 以此為基礎來發展互動性較高的 controller 。 所有的事件基本上都是跟對應的 java object 去進行操作, 並封裝元件成為 server sdie 的類別, 對開發者來講可以相對較為輕鬆的透過 java 去進行開發。 就目前我所看到的案例來講,效果真的很不錯,而且元件再利用率也很高。 而當你真的需要寫 js的時候,可以把重點放在寫重要的 js , 那種小的畫面切換,在伺服器端就可以有效處理這邏輯了。 c.對 template engine (view) 的不滿 考慮到資料模組的實現,html 對很多人來講是不夠用的, 所以舉凡 java/php 等,幾乎都有特化的 framework 試著處理這問題。 目前也都還在發展中。 ----------------------------------- MVC 的重點在於,對開發者來講, 你該認定的 M V C 三者的歸屬會在程式碼呈現出什麼樣子。 因為這是所謂的認同跟學習曲線, 而在於各 framework 跟語言怎麼實作 MVC 都還在各種嘗試的狀況下, MVC 其實討論的是「這個 MVC 的形式合不合用」,而不是 MVC 本質上的概念。 事實上 MVC 本身的概念算是比較空泛的,他不是方法論, 而是比較偏設計原則的東西,在設計上也比較偏向於各自表述的作法。 -- I am a person, and I am always thinking . Thinking in love , Thinking in life , Thinking in why , Thinking in worth. I can't believe any of what , I am just thinking then thinking , but worst of all , most of mine is thinking not actioning... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 12.208.243.66

08/06 20:53, , 1F
感謝說明:)
08/06 20:53, 1F

08/06 20:55, , 2F
2bii的部份, 由於.NET ajax現在也是用jQuery, 和其他
08/06 20:55, 2F

08/06 20:56, , 3F
語言寫web的做法已無多大分別了.
08/06 20:56, 3F

08/06 20:57, , 4F
應該只限於有用 update panel 的那部份吧?我的意思是
08/06 20:57, 4F

08/06 20:57, , 5F
專門使用 .net ajax framework 設計的部份?
08/06 20:57, 5F

08/06 20:58, , 6F
我覺得 .net 先天包袱在於舊的東西跟新的東西,造成複雜度
08/06 20:58, 6F

08/06 20:58, , 7F
也就是如果你想要避免不必要的 page reload ,你必須要很清
08/06 20:58, 7F

08/06 20:58, , 8F
楚哪些行為會造成 page reload ,哪些不會。
08/06 20:58, 8F

08/06 20:58, , 9F
雖然說這件事情是大家都會遇上的,但是 .net 的 user 先天
08/06 20:58, 9F

08/06 20:59, , 10F
比較容易弄出會 page reload 頻繁的應用。XD
08/06 20:59, 10F

08/06 20:59, , 11F
2biii是我最不習慣的地方. 本來View和Controller在MVC
08/06 20:59, 11F

08/06 21:00, , 12F
結構來說是不應該做data manipulation的. 可是你不管
08/06 21:00, 12F

08/06 21:01, , 13F
使用者給甚麼你, 總之就給Model打包回去做processing.
08/06 21:01, 13F

08/06 21:01, , 14F
在client side只做簡單的validation, 這樣有意義嗎?
08/06 21:01, 14F

08/06 21:02, , 15F
那件事情的意義在於降低對開發者的負擔,client 對開發者而
08/06 21:02, 15F

08/06 21:02, , 16F
由其在這有ajax可以以相當低的overhead來做這些的時候?
08/06 21:02, 16F

08/06 21:02, , 17F
言並不好管理,而且資料的序列化/反序列化成本很高。
08/06 21:02, 17F

08/06 21:03, , 18F
或者再直接說, javascript 的邏輯再利用不利,組織上也困難
08/06 21:03, 18F

08/06 21:03, , 19F
另外以敝公司的作法,我們也是透過ajax 傳輸model。:P
08/06 21:03, 19F

08/06 21:03, , 20F
目前我只用jQuery+jQuery Form組件, 不排除以後會加/改
08/06 21:03, 20F

08/06 21:04, , 21F
我們主要還是降低序列化/反序列化 跟寫出/找到對應的事件
08/06 21:04, 21F

08/06 21:04, , 22F
處理者的 overhead .
08/06 21:04, 22F

08/06 21:04, , 23F
在IDE中可以用NuGet連到微軟的網站選用.
08/06 21:04, 23F

08/06 21:06, , 24F
這裡就我所知其實玩家們現在有兩票分歧的路縣
08/06 21:06, 24F

08/06 21:07, , 25F
我現在傾和不依賴那叫Model的object, 把可以給user知道
08/06 21:07, 25F

08/06 21:07, , 26F
有一票的玩法是認為所有的 js 是難以被 reuse 的,所以他們
08/06 21:07, 26F

08/06 21:07, , 27F
寧願手工去操作每個細節,這樣的作法是可以有效掌握每個細節
08/06 21:07, 27F

08/06 21:07, , 28F
不浪費任何一點資源,有最好的體驗。
08/06 21:07, 28F

08/06 21:08, , 29F
和修改的東西都攤開到hidden control內, 在user action
08/06 21:08, 29F

08/06 21:08, , 30F
有另一票的玩家則認為他們可以犧牲一點細節,但他們希望能重
08/06 21:08, 30F

08/06 21:08, , 31F
用邏輯,或者是加速他們的開發效率(犧牲細節來方便包裝util
08/06 21:08, 31F

08/06 21:08, , 32F
用$.ajax()的data參數控制只回傳這動作需要知道的東西.
08/06 21:08, 32F

08/06 21:09, , 33F
.net當年的 form submit 走得其實就很有這味道。
08/06 21:09, 33F

08/06 21:09, , 34F
leicheong , 其實你說的並不violate 我說的 b.iii XD
08/06 21:09, 34F

08/06 21:09, , 35F
甚至我覺得我們在這點上作得相當好。:P
08/06 21:09, 35F

08/06 21:11, , 36F
我想對大型網站來說還是一開始算清楚點好, 實在沒有多少
08/06 21:11, 36F

08/06 21:11, , 37F
透過元件化你才能有效封裝操作
08/06 21:11, 37F

08/06 21:12, , 38F
浪費系統資訊的餘裕呢... :P (照需求來說)
08/06 21:12, 38F

08/06 21:12, , 39F
那效果會比自己寫ajax 來得好很多,他封裝的單位會更細。
08/06 21:12, 39F

08/06 21:12, , 40F
這倒是。
08/06 21:12, 40F

08/06 21:13, , 41F
其實我覺得有機會應該要來討論一下元件封裝這件事,我在
08/06 21:13, 41F

08/06 21:13, , 42F
這件事情上已經做了快一年了,有很多在js/server side 合作
08/06 21:13, 42F

08/06 21:13, , 43F
我覺得很值得一談的東西。
08/06 21:13, 43F

08/06 21:16, , 44F
元件封裝在web 上是個不容易成功的案例,因為它需要一起綁定
08/06 21:16, 44F

08/06 21:16, , 45F
server side跟client side 。
08/06 21:16, 45F

08/06 21:16, , 46F
目前最成功也最廣為人用的元件應該是 ckeditor
08/06 21:16, 46F

08/06 21:16, , 47F
再來就是pure client 的 solution , ex. extJS
08/06 21:16, 47F

08/06 21:17, , 48F
元件封裝對維護是件好事 對效能要看你有多要求。
08/06 21:17, 48F

08/06 21:19, , 49F
嘖嘖 這樣寫很像有我在推銷我家產品的感覺 -3-;;
08/06 21:19, 49F

08/06 21:19, , 50F
不過本來作產品的就會對自家產品有認同敢 哈哈 沒辦法 :P
08/06 21:19, 50F

08/06 21:20, , 51F
還是覺得有機會的話應該來作一下案例探討,這塊很有趣。
08/06 21:20, 51F

08/06 21:25, , 52F
元件封裝一個難點在修改 尤其有需要改動到生命週期的話
08/06 21:25, 52F

08/06 21:26, , 53F
某些用純servlet很簡單的事 會拆拆解解到抓狂
08/06 21:26, 53F

08/06 21:27, , 54F
是啊 這考驗元件設計者的功力
08/06 21:27, 54F

08/06 21:27, , 55F
另一個就是學習曲線的問題 元件的學習曲線一定比serlvet高
08/06 21:27, 55F

08/06 21:27, , 56F
這沒辦法。
08/06 21:27, 56F

08/06 21:27, , 57F
*servlet
08/06 21:27, 57F

08/06 21:28, , 58F
不過我覺得元件封裝 跳下來作的人實在太少了 所以還沒有
08/06 21:28, 58F

08/06 21:28, , 59F
好的 pattern 累積下來,我現在公司的例子算是還可以了。
08/06 21:28, 59F

08/06 21:28, , 60F
不過這就是所謂的 spec...用以前要k熟再... (倒
08/06 21:28, 60F

08/06 21:28, , 61F
至少我寫 javascript 也這麼久了,對這個 pattern 還蠻滿意
08/06 21:28, 61F

08/06 21:29, , 62F
講到元件封裝,我想到幾個糟糕例子,JSF/portlet..
08/06 21:29, 62F

08/06 21:37, , 63F
.net 還有該死的生命週期問題....Orz
08/06 21:37, 63F

08/06 22:25, , 64F
我覺得用ajax後.NET生命週期的重要性淡化了許多.
08/06 22:25, 64F

08/06 22:26, , 65F
因為那些HTML element和grid都是等page載入完成後再
08/06 22:26, 65F

08/06 22:26, , 66F
pull data去更新的... :P
08/06 22:26, 66F

08/06 22:31, , 67F
淡化?還是要看需求和行為吧...
08/06 22:31, 67F

08/07 00:22, , 68F
很清楚的觀念, 原po專業不推不行
08/07 00:22, 68F

08/07 23:01, , 69F
或者這樣說吧... 因為現在都是由client-side的script
08/07 23:01, 69F

08/07 23:02, , 70F
呼叫生成child control, 不像以前「一體成型」時要求
08/07 23:02, 70F

08/07 23:03, , 71F
每個control render順序都想得清楚. Viewstate我都拆開
08/07 23:03, 71F

08/07 23:04, , 72F
成幾塊自己包了, Save/LoadViewstate的先後也沒甚麼
08/07 23:04, 72F

08/07 23:04, , 73F
影響了...
08/07 23:04, 73F

08/12 21:53, , 74F
viewstate那種東西不是內建的嗎=_=?
08/12 21:53, 74F

08/13 14:44, , 75F
本來是. 但如果是因為需求要在一個webform放多於一個
08/13 14:44, 75F

08/13 14:45, , 76F
form control的組合, 而每一個組合需要persist的東西
08/13 14:45, 76F

08/13 14:46, , 77F
都不同的時候 (主要是為了serve custom control), 就要
08/13 14:46, 77F

08/13 14:46, , 78F
手動生出來了... :P
08/13 14:46, 78F
文章代碼(AID): #1EFJYW32 (Soft_Job)
討論串 (同標題文章)
本文引述了以下文章的的內容:
心得
10
86
以下文章回應了本文
完整討論串 (本文為第 2 之 6 篇):
心得
10
86
文章代碼(AID): #1EFJYW32 (Soft_Job)