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

Reply via email to