After all, a MXML gets compiled into a AS 2.0 class. Most MXML files are instances of the View (classic View in MVC that is) - so to me it's logic andvalid to have functionality inside that file that handles and delegates user interactions.
Dirk. -----Original Message----- From: Steven Webster [mailto:[EMAIL PROTECTED] Sent: Thursday, March 03, 2005 9:25 AM To: [email protected] Subject: [flexcoders] Theory and Practice: Mixing AS2.0 in MXML code - as a pragmatic (slothfull? :-) Flex programmer I am rather fond of using a bit more actionscript in my mxml, but then I understand where Aral is coming from - and in Flash I would never put code in my fla. I would be happy to recommend either framework to a client. Not having seen Aral's recommendations, I can't comment specifically, but I'd also like to pick up the idea of "no code in MXML" as a "best theory" rather than a "best practice". Separation of content and code is the key driving principle, imho, as to why when we were building RIA with Flash, that it was essential not to scatter ActionScript code around the actual Flash movie itself. So ... we would advocate that code was not scattered around the timeline, that there was a single layer in the timeline, with a single frame, where a single file "includes.as" was included in the application, and the bare minimum of initialisation code (perhaps creation of your controller) was placed on that first frame. Thereafter, we advocated using the Cairngorm framework, extracting all business logic in classes, and keeping these classes in external ActionScript files. Despite the limitations of the Flash IDE as an RIA development environment, this allowed us to achieve best-practices of keeping our content (the FLA) as separate as possible from the code, in turn promoting reuse, promoting maintainability, encouraging that code could be versioned and kept under source control, etc. Inevitably, some code might find it's way into a component in the Flash Symbol library; but if this ever were the case, then it would be code that BELONGED on that component, and was typically responsible in some way for the view logic associated with that component - so some degree of encapsulation was achieved. But code in the FLA rather than in external ActionScript 2.0 was a bad code smell. Let's now move to Flex. Let me first state the obvious; I would not advocate placing business logic(or lots of it) within <mx:Script> blocks in Flex, if it can be extracted into an external ActionScript 2.0 class. I would *never* use the Include functionality in Flex to pull in blocks of script, and where possible, I would always encourage that external classes, imports, and object creation is used. However, let's remind ourselves why we might want to not have code in our MXML -- not in theory, but in practice. Not mix content and code This is the key one; if we have business logic in our MXML, we should be refactoring this into external AS2.0 classes (and unit-testing it). If you have screeds of business logic in a big <mx:Script> block, then you should be pulling this into external classes - you are beginning to mix your content and your code. Maintainability and Scalability If we have AS2.0 code in our MXML, does it make our code harder to maintain? Not necessarily -- if the code is directly related to that MXML file, it may be the case that encapsulation would encourage the code to belong as a method on the MXML file. An example ? Perhaps we have a click handler, that is going to respond to a button press in our MXML component; perhaps on pressing a button, we want to set a status bar message, and then broadcast an event for the controller ... it makes sense to have: public function billPaymentButtonClick() : Void { ViewLocator.getInstance().getView( "statusView" ).setStatusMessage("Paying Bill..." ); EventBroadcaster.getInstance().broadcastEvent( EventList.BILL_PAYMENT_REQUEST ); } and then in our same MXML file: <mx:Button id="payBillButton" label="Pay Bill" click="billPaymentButtonClick()" /> In this instance, I do not see what is to be gained by being purist, and extracting the billPaymentButtonClick() method out of the MXML and into an external AS2.0 file, JUST to be able to say it's an external file. This is a convoluted example, that Idon't want to pick apart (there are nicer ways of doing it) but it serves a point I think. Because MXML are text files, we can still keep these files under source control, and we can merge them if more than one person works on them. More importantly, for maintainability, I would argue that it's easier for developers to maintain this source, where the methods that are unique and specific to the MXML file, are held within the MXML file - especially when they are concerned with view logic, or with dispatching events so that theycan be used as discrete components without coupling them to anything else in the architecture. We're not risking the scalability, maintainability, performance, clarity orelegance of our code by mixing MXML and ActionScript 2.0 here. On clarity; often in the Flex Book, we would place more code than we would be comfortable with in a production project, in the body of the MXML file ... but we did warn about this in the introduction to the book. Why ? Because we found that when trying to explain a concept, the clarity of having the code in the MXML file outweighed the "purist" benefit of keeping the code in separate files. Pragmatism won over theory. On a similar note, data binding is an immensely powerful feature of Flex; and this will often result in us binding to a var in our MXML, and then as our codebase matures, we may replace the var with a public method on our MXML that we bind to. Why should that method live in an external ActionScript 2.0 file, what benefit does that bring us ? I'd hate to cripple the utility of data binding, by taking a purist approach to removing all occurence of AS2.0 from MXML. Data binding saves an incredible amount of overall development time, effort, risk, and leads to an elegance and clarity of code (cheque's in the mail Matt). I truly believe that this is a matter of individual style ... but when you're building Enterprise Flex apps with hundreds and thousands of MXML and ActionScript 2.0 files inyour code base, I do not believe that a purist approach of not having a line of ActionScript 2.0 in your MXML reaps any particular rewards -- rather a pragmatic, common-sense approach to keeping ActionScript 2.0 to a sensible minimum in your MXML, extracting AS2.0 code into classes (and unit-testing them) where possible, is the most pragmatic approach. Do not mix content and code. Do not convolute the clarity of your application. Think about encapsulation. Think about maintainability of the code-base not just by yourself, but by other engineers on the project. Don't do things that stop you keeping your source code under version control. Those are the "forces" that make us think about keeping our content and code separate; they are not forces to which the solution is "don't have AS2.0 inMXML". I'd hate this to turn into a holy war of opinion ... rather I think it's a developer decision that most developers who turn to Flex are more than capable of making for themselves. But having *some* AS2.0 in your MXML is not necessarily a bad practice, andshouldn't be demonised as such. I'm not interested in maintaining a 2-way compatibilitybetween Flash and Flex, as I have no experience of use-cases where a project would bouncebetween the 2 technologies for its implementation. Hope this offers some food for thought. Steven -- Steven Webster Technical Director iteration::two

