PureMVC(AS3)剖析:吐槽

PureMVCAS3)剖析:吐槽

寫在前面

世上沒有銀彈——不存在適用于所有情況的框架,只有適合的框架。再者任何一個好的東西(語言、框架等)最終還取決于用的人,語言和框架本身并不能保證用戶的代碼清晰、解耦等,當然它只是盡可能地做到這點。所以記住我寫這篇不是為了否定PureMVC,相反是為了更好的了解它、使用它

1. 吐槽一:過于強調解耦

PureMVC引入了多種設計模式、消息機制(使用觀察者模式,發布/訂閱模式)來解耦各個模塊,它確實做到了這點,但是徹底解耦是需要代價的!

1.1. Notification消息命名及管理復雜

PureMVC為了做到跨平臺,使用Notification來實現模塊間通信,而非Flash原生的EventDispatcher/Event機制。然而Notification使用字符串來定義消息,存在以下“問題”。

注:Notification并不是Event的替代物。一般情況下,Mediator給其視圖組件添加Event偵聽器,按常用方式處理,然后給目標Command/Mediator廣播Notification

n 消息ID為字符串,雖然字符串可以做到編譯時解耦,但無法做到消息強類型,這樣錯誤將推遲到運行時才能發現。

n 消息命名,在一個大型項目中,需要一套詳細的規則。相信我,否則你會吃苦頭的。特別是多人參與項目中,如果沒有按照一定規則命名,命名沖突可是會讓你調試一陣。但不管你如何定義命名規則,【記住】為了模塊間解耦,Notification發布者應該不關心誰對這個消息感興趣(誰來處理),感興趣者自行注冊(Mediator通過listNotificationInterests注冊、Command通過facade.registerCommand()注冊)。例如當Proxy中用戶信息改變時,不應該sendNotification通過“UpdateUserInfoVIew”“UpdateFriendListView”2個通過來分別更新用戶信息、好友列表中對應用戶的信息,而只是發送一個通知,如“UpdateUserInfo”,用戶信息欄、好友列表都注冊這個消息,然后分別處理。

n 無法知道Notification的源頭。然而這點可以通過在消息體body中,增加字段標識,如:

sendNotification(ApplicationConstants.UPDATE_LEVEL_DATA, { "noticeSource": this, "levelData": m_levelData } );

noticeSource標識消息來源,如果您還想要知道消息傳遞層次,可以用數組表示,順序插入傳遞者。

1.2. 強松耦合加重通信次數

PureMVC中模塊間通信推薦使用Notification機制,但是全部使用Notification這種強松耦合模式:①強松耦合加重通信次數;②帶反饋數據的通信加重通信負擔。

clip_image002[4]

圖:UI使用Notification修改Proxy中的數據通信過程

PureMVCUI修改Proxy的數據并返回后刷新過程:Mediator收到UI提交事件后,發送Notification消息給CommandCommand進行業務邏輯處理,調用Proxy接口修改數據(這里還可能涉及到與服務器通信),然后發消息給Mediator刷新,Mediator收到消息調用UI接口刷新。

因為都是消息機制,整個流程很長,而且Proxy中對數據進行操作后,發送Notification時,可能需要攜帶修改后的數據(可能是來自服務器的數據)。這個過程不僅通過次數多,而且帶反饋數據的消息增加通信負擔。另一方面要調試這個過程,我們只能在編譯的時候找出一步一步的通信流程,才能跟蹤調試。

2. 吐槽二:解耦增加了代碼量,不方便調試

解耦的同時將使項目修改的復雜程度提高,某些解耦的辦法還會增加代碼量、降低執行效率。PureMVC是一個強解耦的框架,其效率本身不是很高,函數調用層次較深,而有時根本不清楚消息發到了哪里。

PureMVC為了實現解耦增加了代碼量,不方便調試,但哪個MVC框架不是呢!這不是PureMVC的問題,已經有前輩編寫了PureMVC模版,如FlashDevelop的模板(下載),使用模板可以減少手動編寫代碼量,但不能減少類的數量。

有篇文章詳細介紹了PureMVC的耦合與解耦:耦合與脫耦——深入分析為什么使用pureMVC、接口或抽象基類(入口http://bbs.9ria.com/thread-161667-1-1.html

3. 吐槽三:過度使用單例模式

單例模式過于萬能,屬于高耦合寫法。PureMVC中有4個單例ModelViewControllerFa?ade我們可以通過ModelViewControllergetInstance()方法獲取實例,并對他們進行操作。然而Fa?ade是用于管理ModelViewController并對外提供接口。如果ModelViewController對外不可見,為什么要設定為單例,而不是Fa?ade的成員變量呢?

4. 總結

上面說了一些PureMVC的缺點,不過總體來說PureMVC還算一個優秀的框架,解耦徹底、靈活性高。




本文轉自吳秦博客園博客,原文鏈接:http://www.cnblogs.com/skynet/archive/2013/02/17/2914742.html,如需轉載請自行聯系原作者

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256185.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256185.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256185.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Pytorch基礎(八)——正則化

一、概念 正則化在深度學習領域是為了防止訓練結果過擬合而采取的一種方法。 1.1 過擬合 過擬合表示模型的泛化能力較差,體現在實際訓練模型上就是在訓練集表現很好,但是在測試集的效果一般。 過擬合的原因:1,模型過于復雜。2&…

uva 11997 K Smallest Sums 優先隊列處理多路歸并問題

題意&#xff1a;K個數組每組K個值&#xff0c;每次從一組中選一個&#xff0c;共K^k種&#xff0c;問前K個小的。 思路&#xff1a;優先隊列處理多路歸并&#xff0c;每個狀態含有K個元素。詳見劉汝佳算法指南。 1 #include<iostream>2 #include<cstdio>3 #includ…

.net生成隨機字符串

生成隨機字符串的工具類&#xff1a; /// <summary>/// 隨機字符串工具類/// </summary>public class RandomTools{/// <summary>/// 隨機系數/// </summary>public static int _RandIndex 0;#region 獲取某個區間的一個隨機數/// <summary>///…

【圖像處理】——Python鼠標框選ROI(感興趣)區域并且保存(含鼠標事件)

鼠標交互切割矩形 接下來,就是本文重點了。先吐個槽,網上有資源,但搜到的都是C++的。本來有點氣餒的,還好,有官網在,文檔寫得很清楚,而且接口函數名字變化不大,稍微做下修改就行了。 import cv2global img global point1, point2 def on_mouse(event, x, y, flags, pa…

c++ 11 override final

C 11添加了兩個繼承控制關鍵字&#xff1a;override和final。 override確保在派生類中聲明的重載函數跟基類的虛函數有相同的簽名。final阻止類的進一步派生和虛函數的進一步重載 出處&#xff1a;http://www.cnblogs.com/zhangdongsheng/ 作者&#xff1a;張東升

泛型方法與橋方法

Java泛型中有存在一種方式叫做類型擦除&#xff0c;也就是說泛型在編譯期間進行類型檢驗上做到有效安全&#xff0c;但是在運行當中&#xff0c;會將該泛型類型用頂層父類&#xff08;若無繼承關系則用Object&#xff09;代替&#xff0c;然后再進行強轉換成目標類型&#xff0…

Pytorch基礎(九)——損失函數

一、概念 損失函數在深度學習領域是用來計算搭建模型預測的輸出值和真實值之間的誤差。 具體實現過程&#xff1a;在一個批次&#xff08;batch&#xff09;前向傳播完成后&#xff0c;得到預測值&#xff0c;然后損失函數計算出預測值和真實值之間的差值&#xff0c;反向傳播…

用程序猿思維、程序設計師思維兩種方式寫求斐波那契數列的方法。

//用Java實現斐波那契數列(Fibonacci) public class Test {public int f(int n)//n代表第幾個數字。程序返回它相應的值{return n>2?f(n-1)f(n-2):1;//看似如此優雅的一句程序}//程序設計師的思維&#xff1a;會重構上面的代碼。讓他們更易讀。推薦&#xff01;&#xff01…

【圖像處理】——圖像的差集、并集、補集、交集以及兩個圖像相減出現負數的處理方法

目錄 目錄 1、交集 2、差集 3、并集 4、補集 5、差為負值,和超過255的解決辦法

Pytorch基礎(十)——優化器(SGD,Adagrad,RMSprop,Adam,LBFGS等)

一、概念 Pytorch中優化器的目的&#xff1a;將損失函數計算出的差值Loss減小。 優化過程&#xff1a;優化器計算網絡參數的梯度&#xff0c;然后使用一定的算法策略來對參數進行計算&#xff0c;用新的參數來重新進行訓練&#xff0c;最終降低Loss。 其中官網提供了13種優化算…

【圖像處理】——改變圖像的大小(降采樣重采樣)下采樣和上采樣

轉載自:https://jingyan.baidu.com/article/a3a3f81139be1f8da2eb8ade.html 上采樣、下采樣和金字塔加速參考:https://blog.csdn.net/Eastmount/article/details/89341077 目錄 1、拉伸圖片——重采樣 2、縮小圖片 1)三次插值法cv2.INTER_CUBIC

一段代碼到可執行程序所有經歷

如果你寫的代碼是hello.c&#xff0c;你的程序將經歷下面的步驟到達硬盤或者內存成為可執行文件。 第一步&#xff1a;hello.c&#xff08;文本&#xff09;經過預編譯生成hello.i&#xff08;文本&#xff09; 第二步&#xff1a;hello.i&#xff08;文本&#xff09;經過編譯…

js獲取url參數值

今天碰到要在一個頁面獲取另外一個頁面url傳過來的參數&#xff0c;一開始很本能的想到了用 split("?")這樣一步步的分解出需要的參數。 后來想了一下&#xff0c;肯定會有更加簡單的方法的&#xff01;所以在網上找到了兩個很又簡單實用的方法&#xff0c;mark下 方…

[PyCharm]unindent does not match any outer indentation level解決方法

轉載&#xff1a;https://www.jianshu.com/p/b34f30717eb2 問題出現原因 1、代碼前后縮進量不一致 2、tab和space混用&#xff08;如果一段代碼既使用space又使用tab進行縮進&#xff0c;會發生錯誤&#xff0c;這個時候PyCharm會自動進行判斷&#xff0c;根據設置的預先縮進…

為什么要選擇Apache Pulsar(二)

這是介紹Apache Pulsar關鍵特性系列文章的第二篇。Pulsar是由Yahoo開發并開源的下一代發布訂閱消息系統。在第一篇文章里&#xff0c;我們介紹了Pulsar對消息模型的靈活支持、多租戶、多地域復制和持久性。在這一篇文章里&#xff0c;我們將繼續介紹Pulsar的IO隔離機制、伸縮性…

Yolov5目標檢測模型運行遇到的相關問題匯總

一、yolov5-5.0常見錯誤 1. pycocotools工具包無法安裝 具體報錯如下&#xff1a; requirements: pycocotools>2.0 not found and is required by YOLOv5 pkg_resources.DistributionNotFound: The pycocotools>2.0 distribution was not found and is required by th…

PHP反射之類的反射

最近在琢磨如何用PHP實現站點的插件功能&#xff0c;需要用到反射&#xff0c;于是現學了一下&#xff0c;筆記如下&#xff1a; class Person {public $name Lily;public $gender male;public $age 20;public function eat(){echo Lily is eating!;}public function run(){…

數據結構(復習)--------關于平衡二叉樹(轉載)

在上一個專題中&#xff0c;我們在談論二叉查找樹的效率的時候。不同結構的二叉查找樹&#xff0c;查找效率有很大的不同&#xff08;單支樹結構的查找效率退化成了順序查找&#xff09;。如何解決這個問題呢&#xff1f;關鍵在于如何最大限度的減小樹的深度。正是基于這個想法…

mysql外鍵

效果 a,b,c 如果c設置到a的外鍵&#xff0c;那么只能在刪除c的記錄后&#xff0c;才能刪除a的記錄。 https://stackoverflow.com/questions/1905470/cannot-delete-or-update-a-parent-row-a-foreign-key-constraint-fails CREATE TABLE IF NOT EXISTS advertisers ( adverti…