Maybe I'm off, but I don't think the controller should manipulate data. Jason Merrill Instructional Technology Architect II Bank of America Global Learning
_______________________ -----Original Message----- From: flashcoders-boun...@chattyfig.figleaf.com [mailto:flashcoders-boun...@chattyfig.figleaf.com] On Behalf Of Mattheis, Erik (MIN-WSW) Sent: Thursday, February 23, 2012 8:26 PM To: Flash Coders List Subject: Re: [Flashcoders] MVC style Correction "Ross Sclafani" <ross.sclaf...@gmail.com> wrote: It is very easy to locate any code in one of my projects by ascertaining the domain of the code in question and looking in the appropriate branch. Does it store data? It's in the model. Does it interpret and display data? Try your views. Does it manipulate data? Look in the controller. This thread has been useful, thanks all. I've a ton of questions regarding judgment calls and below I post a class illustrating a few I've struggled with. The comments are intended to be my questions/admissions of bafflement. I'm unsure where in a MVC this class should go as its main purpose is to work with the File class which itself has methods which retrieve (File.applicationDirectory), interpret (File.exists) and display (File.browseForOpen) data. The class also is a dreaded example of allowing the view to listen directly to the model for events, perhaps only because I've misguidedly decided to make it part of the model as it has to do with copying and deleting a SQLite file used in the app. package mvc.model { /* saveFileAs() saves a copy of a SQLite DB for the purposes of transferring data to an instance of this app on another computer. closeDBAndReplace() = replaces the db file if the user is importing data. */ import flash.events.EventDispatcher; import flash.events.Event; import flash.filesystem.File; // class Data works with a SQLite DB import mvc.model.Data; // Where in a MVC should custom event classes // be located? I wish to pass my own objects // along with events, usually "Transfer Objects" // or a string to be displayed import mvc.controller.CustomDataEvent; public class ManipulateDBFile extends EventDispatcher { private var _data:Data; private var _sourceFile:File; private var _copyToDirectory:File; public function ManipulateDBFile(data:Data) { _data = data; } public function saveFileAs() : void { var docsDir:File = File.desktopDirectory; // This creates a UI element. I would look for this code in the view! docsDir.browseForDirectory('Save File in ...'); // This is asking a UI elemt to inform the Model directly. Big bad no? docsDir.addEventListener(Event.SELECT, copyFile); } private function copyFile(e:Event):void { _sourceFile = File.applicationStorageDirectory.resolvePath("msgDB.db"); _copyToDirectory = e.target.resolvePath("msgDB.db"); if (_copyToDirectory.exists) { // Passing this event through the Controller seems to create complexity, // or at least unnecessary lines of code. Is there an advantage gained by // communicating to the view through the controller here? var evt:CustomDataEvent = new CustomDataEvent(CustomDataEvent.FILE_ALREADY_EXISTS); dispatchEvent(evt); } else { replaceFile(); } } public function replaceFile() : void { var evt:CustomDataEvent = new CustomDataEvent(CustomDataEvent.COPY_COMPLETE); try { _sourceFile.copyTo(_copyToDirectory, true); dispatchEvent(evt); } catch (error:Error) { evt.param = error.message; dispatchEvent(evt); } _sourceFile = null; _copyToDirectory = null; } public function closeDBAndReplace() : void { // The file cannot be deleted if there is a SQLConnection to it. // The class that is aware of a possible connection also does the // deletion. But deleting the file seems to conceptually // fit into this class better _data.addEventListener(CustomDataEvent.DRILL_RESET, findFile, false, 0, true); _data.deleteDBFile(); } private function findFile(e:CustomDataEvent) : void { _data.removeEventListener(CustomDataEvent.DRILL_RESET, findFile, false); var docsDir:File = File.desktopDirectory; docsDir.browseForOpen('Select msgDB.db file ...'); docsDir.addEventListener(Event.SELECT, replaceDBFile); } private function replaceDBFile(e:Event):void { var sourceFile:File = e.target as File; var destination:File = File.applicationStorageDirectory.resolvePath("msgDB.db"); try { sourceFile.copyTo(destination, true); dispatchEvent(new CustomDataEvent(CustomDataEvent.RESTART_REQUIRED)); } catch (error:Error) { trace("Error:", error.message); } } } } On 2/17/12 6:07 PM, "Ross Sclafani" <ross.sclaf...@gmail.com> wrote: It is very easy to locate any code in one of my projects by ascertaining the domain of the code in question and looking in the appropriate branch. Does it store data? It's in the model. Does it interpret and display data? Try your views. Does it manipulate data? Look in the controller. _ _ _ Erik Mattheis | Weber Shandwick P: (952) 346.6610 M: (612) 377.2272 _______________________________________________ Flashcoders mailing list Flashcoders@chattyfig.figleaf.com http://chattyfig.figleaf.com/mailman/listinfo/flashcoders ---------------------------------------------------------------------- This message w/attachments (message) is intended solely for the use of the intended recipient(s) and may contain information that is privileged, confidential or proprietary. If you are not an intended recipient, please notify the sender, and then please delete and destroy all copies and attachments, and be advised that any review or dissemination of, or the taking of any action in reliance on, the information contained in or attached to this message is prohibited. Unless specifically indicated, this message is not an offer to sell or a solicitation of any investment products or other financial product or service, an official confirmation of any transaction, or an official statement of Sender. Subject to applicable law, Sender may intercept, monitor, review and retain e-communications (EC) traveling through its networks/systems and may produce any such EC to regulators, law enforcement, in litigation and as required by law. The laws of the country of each sender/recipient may impact the handling of EC, and EC may be archived, supervised and produced in countries other than the country in which you are located. This message cannot be guaranteed to be secure or free of errors or viruses. References to "Sender" are references to any subsidiary of Bank of America Corporation. Securities and Insurance Products: * Are Not FDIC Insured * Are Not Bank Guaranteed * May Lose Value * Are Not a Bank Deposit * Are Not a Condition to Any Banking Service or Activity * Are Not Insured by Any Federal Government Agency. Attachments that are part of this EC may have additional important disclosures and disclaimers, which you should read. This message is subject to terms available at the following link: http://www.bankofamerica.com/emaildisclaimer. By messaging with Sender you consent to the foregoing. _______________________________________________ Flashcoders mailing list Flashcoders@chattyfig.figleaf.com http://chattyfig.figleaf.com/mailman/listinfo/flashcoders