262_Jeff_Tapper_How_not_to_code_Flex_Applications

Comments

There aren't any comments for this presentation.

Add Comment

Please enter a valid email address.

Optional. Enter a URL for your website.

  Remember Me
  Notify me of follow up comments

Transcript

no image

Slide Text

Slide Notes


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



Rule4.mxml

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 &amp;&amp; (hasRight || (gridTests.selectedItem.StatusCode!='XX' &amp;&amp;gridTests.selectedItem.StatusCode!='XY')))?((gridTests.selectedItem.IsDerived=='n')?
   (gridTests.selectedItem.StatusCode!='YY'&amp;&amp; gridTests.selectedItem.StatusCode!='YX' &amp;&amp; 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