How not to code Flex Applications
no text exists for this slide
no notes exist for this slide
Who Am I
Jeff Tapper (jtapper@digitalprimates.net)
Jeff Tapper (jtapper@digitalprimates.net)
Senior Consultant â Digital Primates IT Consulting Group
Building Internet Applications since 1995
Authored 10 books on internet technologies
Adobe Certified Instructor for all Flex, AIR, Flash, and ColdFusion courses
http://blogs.digitalprimates.net/jefftapper
Twitter: jefftapper
no notes exist for this slide
Who Are You
Developers whoâ¦
Developers whoâ¦
are open to learning
Have some experience with Flex
Have a sense of humor
If this isnât you, you should probably leave
no notes exist for this slide
Agenda
What is bad code
What is bad code
Why do developers code badly
Bad Code Samples
Rules to Live By
Questions
no notes exist for this slide
What is Bad Code
Bad code isâ¦
Bad code isâ¦
Code which doesnât meet the needs of a project
Efficiency
maintainability
Time to develop
Code which doesnât make sense
no notes exist for this slide
Why do developers code badly
Lack of Time
Lack of Time
Lack of Knowledge
Lack of Caring
no notes exist for this slide
Some of my bad code
public class XMLListener extends EventDispatcher
public class XMLListener extends EventDispatcher
{
// FIXME! - JT - yes, i know this is
// not the right solution
// but im making the socket public so I
// can attach a listener to it
// this can clearly be done better, but im
// tired, and this is what i have at the
// moment
public var socket:XMLSocket;
no notes exist for this slide
What are the consequences
Bad code can lead to
Bad code can lead to
Delays
Project failure
Job loss
Death
no notes exist for this slide
Sample 1
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:TextInput id="username" width="150"/>
<mx:TextInput id="password" width="150"/>
<mx:VBox width=â150" height="10" styleName="doubleLine"/>
<mx:Button label="submit"/>
</mx:VBox>
Main.css
.doubleLine{
background-image: Embed("/assets/images/doubleLine.png");
}
Rule1.mxml
no notes exist for this slide
What is wrong with 1
Summary: Inappropriate use of container.
Summary: Inappropriate use of container.
Description: <mx:Image> should be used to display an image, not a container with an backgroundImage style
Type: Maintainability, Performance
Rule: Its never appropriate to use a container which will never have children.
no notes exist for this slide
2
Main App
Main App
<mx:List dataProvider="{ac}"
itemRenderer="component.ItemRenderer"
selectable="false" />
ItemRenderer
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" >
<mx:Image source="{data.image}"/>
<mx:Label text="{data.colorname}" height="30"/>
</mx:VBox>
Rule2.mxml
no notes exist for this slide
What is wrong with 2
Summary: List used when VBox more appropriate
Summary: List used when VBox more appropriate
Description: A List control has lots of code dealing with selecting items, clearly, this is not about item selection
Type: Performance, Maintainability
Rule: Never use a List based component when list functionality is not needed.
no notes exist for this slide
3
<mx:Script>
<mx:Script>
<![CDATA[
private function setData(un:String, pw:String):void{
username.text=un;
password.text=pw;
}
]]>
</mx:Script>
<mx:TextInput id="usernameâ />
<mx:TextInput id="password" />
no notes exist for this slide
What is wrong with 3
Summary: Properties are set on controls, when data binding would be better
Summary: Properties are set on controls, when data binding would be better
Description: Setting properties on controls
Type: Maintenance, Development Time
Rule: Modify the Model, Let the View Follow
no notes exist for this slide
4
no notes exist for this slide
What is wrong with 4
Summary: Views events handled in top level component
Summary: Views events handled in top level component
Description: View is dispatching an event which is handled by a controller by passing event data back to view
Type: Maintenance, Separation of Concerns
Rule: Always handle events as locally as possible
no notes exist for this slide
5
<mx:VBox borderStyle="solid" borderColor="#00000" backgroundColor="#FFFFFF"
<mx:VBox borderStyle="solid" borderColor="#00000" backgroundColor="#FFFFFF"
width="200" height="100">
<mx:Text text="{bodyText}" width="100%" height="100%" />
</mx:VBox>
Rule5.mxml
no notes exist for this slide
What is wrong with 5
Summary: Inappropriate container nesting
Summary: Inappropriate container nesting
Description: Additional containers added for styling, not for child layout
Type: Performance
Rule: If you have a container with only one child, you are usually doing something wrong.
no notes exist for this slide
6
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:comp="*">
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:comp="*">
<comp:ChooseMenu id= "chooser" />
<comp:DisplayMenu
menuForDisplay="{chooser.menuGroup.selection.label}" />
</mx:Application>
Rule6.mxml
no notes exist for this slide
What is wrong with 6
Summary: reaching into a child of a child
Summary: reaching into a child of a child
Description: Components should interact with their children, not their childrenâs children
Type: Separation of Concerns, Encapsulation
Rule: Two dots and you are out
no notes exist for this slide
7
<mx:LinkButton label="{labels.ProcessStatus}"
<mx:LinkButton label="{labels.ProcessStatus}"
enabled ="{(gridTests.selectedItems.length==1 && (hasRight || (gridTests.selectedItem.StatusCode!='XX' &&gridTests.selectedItem.StatusCode!='XY')))?((gridTests.selectedItem.IsDerived=='n')?
(gridTests.selectedItem.StatusCode!='YY'&& gridTests.selectedItem.StatusCode!='YX' && gridTests.selectedItem.StatusCode!='XYX'):false)
:false}"
click ="setTestStatus(event);"/>
Rule7.mxml
no notes exist for this slide
What is wrong with 7
Summary: unreadable code
Summary: unreadable code
Description: Use functions, not complex binding expressions
Type: Maintainability
Rule: Being too clever makes you a dumb-ass
no notes exist for this slide
Everyone Writes Bad Code sometimes
If you spend some time in the SDK source code, you can find gems like this:
If you spend some time in the SDK source code, you can find gems like this:
var changeCount:int;
changeCount=Math.max(1,getStyle("horizontalChangeCount"));
if (changeCount * 0 != 0){
changeCount = 1;
}
no notes exist for this slide
Rules To Live By
Its never appropriate to use a container when they will never have children.
Its never appropriate to use a container when they will never have children.
Never use a List based component when list functionality is not needed.
Modify the Model, Let the View Follow
Always handle events as locally as possible
If you find you have a container with only one child, you are probably doing something wrong.
Donât be a dumb-ass
Flex isnt broken, you are.
no notes exist for this slide
Questions
no notes exist for this slide
Upcoming talks
Adobe MAX 10/4-10/8 Los Angeles
Adobe MAX 10/4-10/8 Los Angeles
RIA Unleashed 11/13 Boston
no notes exist for this slide
Great slides
Posted By: Toronto Printing On: 04/26/10 11:29 AM