SlideShare a Scribd company logo
CFWheels
Pragmatic, Beautiful code
Indy Nagpal
Straker Software
Melbourne, November 2010
A bit about me
•  CTO, Straker Software, New Zealand
•  Been doing CF (and Flex) for a while
•  Cloud-based CF Using Railo
•  In love with Ruby (the language) & Rails
– Was in love with Groovy (still am, I think)
•  nagpals.com/blog
Rapid ≠ Agile
Agile
•  Early, continuous delivery of software
•  Welcome changing requirements
•  Deliver working software frequently
•  Working software = progress
•  Technical excellence and good design
•  Simplicity is essential – work not done
“There comes a time in the history of
every project when it becomes
necessary to shoot the engineers and
begin production.”
Need
•  Quickly build and deploy database-driven
web apps
•  Rapid iterations in a testable fashion
•  Easy for multiple developers to understand
•  Working app is more important than
configuring the app
Search…
•  Tried lots of frameworks/methodologies
•  Ruby on Rails addressed most issues
•  Learn another language and framework
•  Defeats the whole purpose
•  Enter, CFWheels…
What is CFWheels
•  Framework inspired by Ruby on Rails
•  Simple organization system
•  Suited for typical, database-driven web
applications
•  A couple of years’ old – fairly mature
Convention over configuration
•  Possibly the single most important thing
•  Mostly convention, minor configuration
•  Easy to
– turn on
– tune in
– drop out
Directory structure
•  webroot
– models	
– controllers	
– views	
– images	
– javascripts	
– stylesheets	
– plugins	
– tests	
– events	
– config
Intuitive Code Structure
•  View
–  Responsible for display and user interaction
–  Receive data from controller
•  Controller
–  Process requests from view
–  Get/process data from model
–  Make data available to the view
•  Model
–  Interacts with the database layer
–  Responsible for validation
–  Other methods to process/message data
Convention - URLs
•  URLs mapped to controllers/models/views
http://blog/posts/edit/1	
Controller: Posts
Model: Post
Action: Edit
Key: 1
View – http://blog/posts/
/views/posts/index.cfm	
<cfparam name="posts">	
<ul>	
<cfoutput query="posts">	
	<li>	
	 	#linkTo( 	text 	= "#posts.title#", 	
	 	 	 	action	= "edit", 	
	 	 	 	key 	= post.id, 	
	 	 	 	title 	= "Edit #posts.name#"	
	 	 	 	)#	
	</li>	
</cfoutput>	
</ul>
Controller – http://blog/posts/
/controllers/Posts.cfc	
<cfcomponent extends="Controller">	
<cfscript>	
	function index(){	
	 	posts = model("post").findAll(order="createdAt")	
	}	
</cfscript>	
</cfcomponent
Model – http://blog/posts/
/models/Post.cfc	
<cfcomponent extends="Model">	
<cfscript>	
	function init(){	
	 	belongsTo("author")	
	 	hasMany("comments")	
	 		
	 	validatesLengthOf( 	properties 	= 	"title",	
	 	 	 	 	minimum 	= 	10,	
	 	 	 	 	maximum 	= 	255)	
	}	
</cfscript>	
</cfcomponent>
Convention – Files & Database
•  Place in appropriate folders – MVC
•  Plural database names, singular model
names
– DB Table: posts	
– Model: Post.cfc	
•  Database fields: id, createdat, updatedat
Built-in ORM
•  Simple and elegant
•  All major databases supported
•  Almost no setup required – baked in
•  CRUD instantly available via models/plugin
•  Finding data using “finders”
–  findOne(), findAll(), findByKey()…
Associations
models/Post.cfc	
<cfcomponent extends="Model">

<cfscript>	
	 	function init(){	
	 	 	belongsTo("author")	
	 	}	
</cfscript>

</cfcomponent>	
models/Author.cfc	
<cfcomponent extends="Model">

<cfscript>	
	 	function init(){	
	 	 	hasMany("posts")	
	 	}	
</cfscript>

</cfcomponent>	
<cfscript>	
	posts 	= model("post").findAll(include="author")	
	author 	= model("author").findOneByKey(key=params.key,include="posts")	
</cfscript>
Dynamic Finders
•  Dynamic finders are magical
model("user").findOne(where="username='bob' and password='pass'")	
rewritten as
	model("user").findOneByUsernameAndPassword("bob,pass”)
URLs and Routing
•  Beautiful URLs
–  http://blog/a-good-url	
•  Powerful routing mechanism
	<cfset addRoute( 	name 	 	= "showPost", 

	 	 	pattern	 	= "/[key]”,

	 	 	controller 	= "Posts",

	 	 	action	 	= "show")>
•  Can be turned REST-full
Multiple response formats
•  http://blog/posts	
•  http://blog/posts.xml	
•  http://blog/posts.json	
•  http://blog/posts.csv	
•  http://blog/posts.pdf
Common tasks done
•  Adding timestamps
•  Flashing messages
•  Pagination
•  Sending multi-part emails
•  Redirecting users
Lots of helper functions
•  Views
selectBox()	
linkTo()	
timeAgoInWords()	
paginationLinks()	
titleize()	
pluralize()	
•  Model
validatePresenceOf()	
findAll()	
findOneByKey()	
afterSave()	
•  Controller
flash()	
isGet()	
sendMail()
Plugins
•  Neat architecture to add/override
functionality
•  Extremely useful
– Scaffold –generate CRUD application
– DBMigrate – Add/edit database structure
– Remote Form Helpers – Ajax with forms
– Localizer – Localizing an application
Baked in testing
•  Ships with RocketUnit
<cfcomponent extends="tests.Test">	
<cfscript>	
	function test_1_get_timezones(){	
	 	qTimezone 	= model("Timezone").getTimezones()	
	 	assert("isQuery(qTimezone) ")	
	 	assert("qTimezone.recordcount eq 56")	
	}	
	 	 		
</cfscript>	
</cfcomponent>
Environments
•  Different setup for applications based on
stages of development
– Design, Development, Production, Testing,
Maintenance
•  Differ in terms of caching, error-handling
•  Switch environments via config/url
Docs/Support
•  Very helpful docs at cfwheels.org
•  Active and supportive mailing list
•  Quite a few screencasts
•  Direct knowledge transfer from Ruby on
Rails books/docs (e.g., Head First Rails)
•  Bunch of blogs
IDE Support
•  Eclipse, CFBuilder
– Syntax Dictionary
•  Textmate
– Bundle
•  Coda
– Lacking, but works by adding Clips
Beauty
•  Simple code organization and flow
•  Easy to understand code – eyeballing code
•  Common tasks done with minimal code
•  Pretty URLs
•  Almost zero configuration, with power to
configure as much as needed
Pragmatic
•  Focus on simple code that solves issues
•  Trades pure OO for simplicity and structure
•  Easy to not use the framework if needed
•  Common web application problems already
solved – why reinvent the wheel(s)!
Wrap up
•  Evaluate if you need a ‘framework’
•  Learn URL rewrites (Apache, IIS)
•  Dabble with Ruby on Rails
•  cfscript = succinct code
•  Worth trying out just to see how problems
can be solved in a different manner
Thank you
Questions?
indy@nagpals.com	
nagpals.com/blog

More Related Content

What's hot

RavenDB 3.5
RavenDB 3.5RavenDB 3.5
RavenDB 3.5
Oren Eini
 
RavenDB 4.0
RavenDB 4.0RavenDB 4.0
RavenDB 4.0
Oren Eini
 
Infinum Android Talks #09 - DBFlow ORM
Infinum Android Talks #09 - DBFlow ORMInfinum Android Talks #09 - DBFlow ORM
Infinum Android Talks #09 - DBFlow ORM
Infinum
 
Innovating faster with SBT, Continuous Delivery, and LXC
Innovating faster with SBT, Continuous Delivery, and LXCInnovating faster with SBT, Continuous Delivery, and LXC
Innovating faster with SBT, Continuous Delivery, and LXC
kscaldef
 
Real World Rails Deployment
Real World Rails DeploymentReal World Rails Deployment
Real World Rails Deployment
Alan Hecht
 
Simplify integrations-final-pdf
Simplify integrations-final-pdfSimplify integrations-final-pdf
Simplify integrations-final-pdf
Christian Posta
 
Why ruby and rails
Why ruby and railsWhy ruby and rails
Why ruby and rails
Reuven Lerner
 
4 JVM Web Frameworks
4 JVM Web Frameworks4 JVM Web Frameworks
4 JVM Web Frameworks
Joe Kutner
 
Automating JavaScript testing with Jasmine and Perl
Automating JavaScript testing with Jasmine and PerlAutomating JavaScript testing with Jasmine and Perl
Automating JavaScript testing with Jasmine and Perl
nohuhu
 
High Performance Systems in Go - GopherCon 2014
High Performance Systems in Go - GopherCon 2014High Performance Systems in Go - GopherCon 2014
High Performance Systems in Go - GopherCon 2014
Derek Collison
 
Zapping ever faster: how Zap sped up by two orders of magnitude using RavenDB
Zapping ever faster: how Zap sped up by two orders of magnitude using RavenDBZapping ever faster: how Zap sped up by two orders of magnitude using RavenDB
Zapping ever faster: how Zap sped up by two orders of magnitude using RavenDB
Oren Eini
 
About Caching
About CachingAbout Caching
About Caching
Weng Wei
 
MongoDB Days UK: Using MongoDB to Build a Fast and Scalable Content Repositor...
MongoDB Days UK: Using MongoDB to Build a Fast and Scalable Content Repositor...MongoDB Days UK: Using MongoDB to Build a Fast and Scalable Content Repositor...
MongoDB Days UK: Using MongoDB to Build a Fast and Scalable Content Repositor...
MongoDB
 
Don't worry with bower
Don't worry with bowerDon't worry with bower
Don't worry with bower
Frank van der Linden
 
Zend Framwork presentation
Zend Framwork presentationZend Framwork presentation
Zend Framwork presentation
Uva Wellassa University
 
Javascript on Server-Side
Javascript on Server-SideJavascript on Server-Side
Javascript on Server-Side
ASIMYILDIZ
 
DrupalCampLA 2014 - Drupal backend performance and scalability
DrupalCampLA 2014 - Drupal backend performance and scalabilityDrupalCampLA 2014 - Drupal backend performance and scalability
DrupalCampLA 2014 - Drupal backend performance and scalability
cherryhillco
 
JSF2
JSF2JSF2
Building Enterprise Grade Front-End Applications with JavaScript Frameworks
Building Enterprise Grade Front-End Applications with JavaScript FrameworksBuilding Enterprise Grade Front-End Applications with JavaScript Frameworks
Building Enterprise Grade Front-End Applications with JavaScript Frameworks
FITC
 
Hands-on Performance Tuning Lab - Devoxx Poland
Hands-on Performance Tuning Lab - Devoxx PolandHands-on Performance Tuning Lab - Devoxx Poland
Hands-on Performance Tuning Lab - Devoxx Poland
C2B2 Consulting
 

What's hot (20)

RavenDB 3.5
RavenDB 3.5RavenDB 3.5
RavenDB 3.5
 
RavenDB 4.0
RavenDB 4.0RavenDB 4.0
RavenDB 4.0
 
Infinum Android Talks #09 - DBFlow ORM
Infinum Android Talks #09 - DBFlow ORMInfinum Android Talks #09 - DBFlow ORM
Infinum Android Talks #09 - DBFlow ORM
 
Innovating faster with SBT, Continuous Delivery, and LXC
Innovating faster with SBT, Continuous Delivery, and LXCInnovating faster with SBT, Continuous Delivery, and LXC
Innovating faster with SBT, Continuous Delivery, and LXC
 
Real World Rails Deployment
Real World Rails DeploymentReal World Rails Deployment
Real World Rails Deployment
 
Simplify integrations-final-pdf
Simplify integrations-final-pdfSimplify integrations-final-pdf
Simplify integrations-final-pdf
 
Why ruby and rails
Why ruby and railsWhy ruby and rails
Why ruby and rails
 
4 JVM Web Frameworks
4 JVM Web Frameworks4 JVM Web Frameworks
4 JVM Web Frameworks
 
Automating JavaScript testing with Jasmine and Perl
Automating JavaScript testing with Jasmine and PerlAutomating JavaScript testing with Jasmine and Perl
Automating JavaScript testing with Jasmine and Perl
 
High Performance Systems in Go - GopherCon 2014
High Performance Systems in Go - GopherCon 2014High Performance Systems in Go - GopherCon 2014
High Performance Systems in Go - GopherCon 2014
 
Zapping ever faster: how Zap sped up by two orders of magnitude using RavenDB
Zapping ever faster: how Zap sped up by two orders of magnitude using RavenDBZapping ever faster: how Zap sped up by two orders of magnitude using RavenDB
Zapping ever faster: how Zap sped up by two orders of magnitude using RavenDB
 
About Caching
About CachingAbout Caching
About Caching
 
MongoDB Days UK: Using MongoDB to Build a Fast and Scalable Content Repositor...
MongoDB Days UK: Using MongoDB to Build a Fast and Scalable Content Repositor...MongoDB Days UK: Using MongoDB to Build a Fast and Scalable Content Repositor...
MongoDB Days UK: Using MongoDB to Build a Fast and Scalable Content Repositor...
 
Don't worry with bower
Don't worry with bowerDon't worry with bower
Don't worry with bower
 
Zend Framwork presentation
Zend Framwork presentationZend Framwork presentation
Zend Framwork presentation
 
Javascript on Server-Side
Javascript on Server-SideJavascript on Server-Side
Javascript on Server-Side
 
DrupalCampLA 2014 - Drupal backend performance and scalability
DrupalCampLA 2014 - Drupal backend performance and scalabilityDrupalCampLA 2014 - Drupal backend performance and scalability
DrupalCampLA 2014 - Drupal backend performance and scalability
 
JSF2
JSF2JSF2
JSF2
 
Building Enterprise Grade Front-End Applications with JavaScript Frameworks
Building Enterprise Grade Front-End Applications with JavaScript FrameworksBuilding Enterprise Grade Front-End Applications with JavaScript Frameworks
Building Enterprise Grade Front-End Applications with JavaScript Frameworks
 
Hands-on Performance Tuning Lab - Devoxx Poland
Hands-on Performance Tuning Lab - Devoxx PolandHands-on Performance Tuning Lab - Devoxx Poland
Hands-on Performance Tuning Lab - Devoxx Poland
 

Viewers also liked

Testing For Success
Testing For SuccessTesting For Success
Testing For Success
indiver
 
Make It Cooler: Using Decentralized Version Control
Make It Cooler: Using Decentralized Version ControlMake It Cooler: Using Decentralized Version Control
Make It Cooler: Using Decentralized Version Control
indiver
 
Using NoSQL MongoDB with ColdFusion
Using NoSQL MongoDB with ColdFusionUsing NoSQL MongoDB with ColdFusion
Using NoSQL MongoDB with ColdFusion
indiver
 
ITB2016 - NoSQL with mongodb and ColdFusion (CFML)
ITB2016 - NoSQL with mongodb and ColdFusion (CFML)ITB2016 - NoSQL with mongodb and ColdFusion (CFML)
ITB2016 - NoSQL with mongodb and ColdFusion (CFML)
Ortus Solutions, Corp
 
CommandBox : Free CFML
CommandBox : Free CFMLCommandBox : Free CFML
CommandBox : Free CFML
Ortus Solutions, Corp
 
Advanced caching techniques with ehcache, big memory, terracotta, and coldfusion
Advanced caching techniques with ehcache, big memory, terracotta, and coldfusionAdvanced caching techniques with ehcache, big memory, terracotta, and coldfusion
Advanced caching techniques with ehcache, big memory, terracotta, and coldfusion
ColdFusionConference
 

Viewers also liked (6)

Testing For Success
Testing For SuccessTesting For Success
Testing For Success
 
Make It Cooler: Using Decentralized Version Control
Make It Cooler: Using Decentralized Version ControlMake It Cooler: Using Decentralized Version Control
Make It Cooler: Using Decentralized Version Control
 
Using NoSQL MongoDB with ColdFusion
Using NoSQL MongoDB with ColdFusionUsing NoSQL MongoDB with ColdFusion
Using NoSQL MongoDB with ColdFusion
 
ITB2016 - NoSQL with mongodb and ColdFusion (CFML)
ITB2016 - NoSQL with mongodb and ColdFusion (CFML)ITB2016 - NoSQL with mongodb and ColdFusion (CFML)
ITB2016 - NoSQL with mongodb and ColdFusion (CFML)
 
CommandBox : Free CFML
CommandBox : Free CFMLCommandBox : Free CFML
CommandBox : Free CFML
 
Advanced caching techniques with ehcache, big memory, terracotta, and coldfusion
Advanced caching techniques with ehcache, big memory, terracotta, and coldfusionAdvanced caching techniques with ehcache, big memory, terracotta, and coldfusion
Advanced caching techniques with ehcache, big memory, terracotta, and coldfusion
 

Similar to CFWheels - Pragmatic, Beautiful Code

Intro to ColdBox MVC at Japan CFUG
Intro to ColdBox MVC at Japan CFUGIntro to ColdBox MVC at Japan CFUG
Intro to ColdBox MVC at Japan CFUG
Ortus Solutions, Corp
 
ZZ BC#7 asp.net mvc practice and guideline by NineMvp
ZZ BC#7 asp.net mvc practice and guideline by NineMvpZZ BC#7 asp.net mvc practice and guideline by NineMvp
ZZ BC#7 asp.net mvc practice and guideline by NineMvp
Chalermpon Areepong
 
AngularJS One Day Workshop
AngularJS One Day WorkshopAngularJS One Day Workshop
AngularJS One Day Workshop
Shyam Seshadri
 
Staging Drupal 8 31 09 1 3
Staging Drupal 8 31 09 1 3Staging Drupal 8 31 09 1 3
Staging Drupal 8 31 09 1 3
Drupalcon Paris
 
FlexDeploy Product Technical Overview
FlexDeploy Product Technical OverviewFlexDeploy Product Technical Overview
FlexDeploy Product Technical Overview
Dalibor Blazevic
 
Integrating AngularJS with Drupal 7
Integrating AngularJS with Drupal 7Integrating AngularJS with Drupal 7
Integrating AngularJS with Drupal 7
andrewmriley
 
Asp.net mvc presentation by Nitin Sawant
Asp.net mvc presentation by Nitin SawantAsp.net mvc presentation by Nitin Sawant
Asp.net mvc presentation by Nitin Sawant
Nitin Sawant
 
MVC 6 - the new unified Web programming model
MVC 6 - the new unified Web programming modelMVC 6 - the new unified Web programming model
MVC 6 - the new unified Web programming model
Alex Thissen
 
Rapid application development with spring roo j-fall 2010 - baris dere
Rapid application development with spring roo   j-fall 2010 - baris dereRapid application development with spring roo   j-fall 2010 - baris dere
Rapid application development with spring roo j-fall 2010 - baris dere
Baris Dere
 
Give your little scripts big wings: Using cron in the cloud with Amazon Simp...
Give your little scripts big wings:  Using cron in the cloud with Amazon Simp...Give your little scripts big wings:  Using cron in the cloud with Amazon Simp...
Give your little scripts big wings: Using cron in the cloud with Amazon Simp...
Amazon Web Services
 
The future of web development write once, run everywhere with angular.js and ...
The future of web development write once, run everywhere with angular.js and ...The future of web development write once, run everywhere with angular.js and ...
The future of web development write once, run everywhere with angular.js and ...
Mark Roden
 
The future of web development write once, run everywhere with angular js an...
The future of web development   write once, run everywhere with angular js an...The future of web development   write once, run everywhere with angular js an...
The future of web development write once, run everywhere with angular js an...
Mark Leusink
 
Agile Secure Cloud Application Development Management
Agile Secure Cloud Application Development ManagementAgile Secure Cloud Application Development Management
Agile Secure Cloud Application Development Management
Adam Getchell
 
[Struyf] Automate Your Tasks With Azure Functions
[Struyf] Automate Your Tasks With Azure Functions[Struyf] Automate Your Tasks With Azure Functions
[Struyf] Automate Your Tasks With Azure Functions
European Collaboration Summit
 
Structured Functional Automated Web Service Testing
Structured Functional Automated Web Service TestingStructured Functional Automated Web Service Testing
Structured Functional Automated Web Service Testing
rdekleijn
 
Introduction to Flask Micro Framework
Introduction to Flask Micro FrameworkIntroduction to Flask Micro Framework
Introduction to Flask Micro Framework
Mohammad Reza Kamalifard
 
symfony_from_scratch
symfony_from_scratchsymfony_from_scratch
symfony_from_scratch
tutorialsruby
 
symfony_from_scratch
symfony_from_scratchsymfony_from_scratch
symfony_from_scratch
tutorialsruby
 
Office 365 Saturday (Sydney) - SharePoint framework – build integrated user e...
Office 365 Saturday (Sydney) - SharePoint framework – build integrated user e...Office 365 Saturday (Sydney) - SharePoint framework – build integrated user e...
Office 365 Saturday (Sydney) - SharePoint framework – build integrated user e...
Anupam Ranku
 
Codeigniter
CodeigniterCodeigniter
Codeigniter
Joram Salinas
 

Similar to CFWheels - Pragmatic, Beautiful Code (20)

Intro to ColdBox MVC at Japan CFUG
Intro to ColdBox MVC at Japan CFUGIntro to ColdBox MVC at Japan CFUG
Intro to ColdBox MVC at Japan CFUG
 
ZZ BC#7 asp.net mvc practice and guideline by NineMvp
ZZ BC#7 asp.net mvc practice and guideline by NineMvpZZ BC#7 asp.net mvc practice and guideline by NineMvp
ZZ BC#7 asp.net mvc practice and guideline by NineMvp
 
AngularJS One Day Workshop
AngularJS One Day WorkshopAngularJS One Day Workshop
AngularJS One Day Workshop
 
Staging Drupal 8 31 09 1 3
Staging Drupal 8 31 09 1 3Staging Drupal 8 31 09 1 3
Staging Drupal 8 31 09 1 3
 
FlexDeploy Product Technical Overview
FlexDeploy Product Technical OverviewFlexDeploy Product Technical Overview
FlexDeploy Product Technical Overview
 
Integrating AngularJS with Drupal 7
Integrating AngularJS with Drupal 7Integrating AngularJS with Drupal 7
Integrating AngularJS with Drupal 7
 
Asp.net mvc presentation by Nitin Sawant
Asp.net mvc presentation by Nitin SawantAsp.net mvc presentation by Nitin Sawant
Asp.net mvc presentation by Nitin Sawant
 
MVC 6 - the new unified Web programming model
MVC 6 - the new unified Web programming modelMVC 6 - the new unified Web programming model
MVC 6 - the new unified Web programming model
 
Rapid application development with spring roo j-fall 2010 - baris dere
Rapid application development with spring roo   j-fall 2010 - baris dereRapid application development with spring roo   j-fall 2010 - baris dere
Rapid application development with spring roo j-fall 2010 - baris dere
 
Give your little scripts big wings: Using cron in the cloud with Amazon Simp...
Give your little scripts big wings:  Using cron in the cloud with Amazon Simp...Give your little scripts big wings:  Using cron in the cloud with Amazon Simp...
Give your little scripts big wings: Using cron in the cloud with Amazon Simp...
 
The future of web development write once, run everywhere with angular.js and ...
The future of web development write once, run everywhere with angular.js and ...The future of web development write once, run everywhere with angular.js and ...
The future of web development write once, run everywhere with angular.js and ...
 
The future of web development write once, run everywhere with angular js an...
The future of web development   write once, run everywhere with angular js an...The future of web development   write once, run everywhere with angular js an...
The future of web development write once, run everywhere with angular js an...
 
Agile Secure Cloud Application Development Management
Agile Secure Cloud Application Development ManagementAgile Secure Cloud Application Development Management
Agile Secure Cloud Application Development Management
 
[Struyf] Automate Your Tasks With Azure Functions
[Struyf] Automate Your Tasks With Azure Functions[Struyf] Automate Your Tasks With Azure Functions
[Struyf] Automate Your Tasks With Azure Functions
 
Structured Functional Automated Web Service Testing
Structured Functional Automated Web Service TestingStructured Functional Automated Web Service Testing
Structured Functional Automated Web Service Testing
 
Introduction to Flask Micro Framework
Introduction to Flask Micro FrameworkIntroduction to Flask Micro Framework
Introduction to Flask Micro Framework
 
symfony_from_scratch
symfony_from_scratchsymfony_from_scratch
symfony_from_scratch
 
symfony_from_scratch
symfony_from_scratchsymfony_from_scratch
symfony_from_scratch
 
Office 365 Saturday (Sydney) - SharePoint framework – build integrated user e...
Office 365 Saturday (Sydney) - SharePoint framework – build integrated user e...Office 365 Saturday (Sydney) - SharePoint framework – build integrated user e...
Office 365 Saturday (Sydney) - SharePoint framework – build integrated user e...
 
Codeigniter
CodeigniterCodeigniter
Codeigniter
 

Recently uploaded

みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
名前 です男
 
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AI
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AIEnchancing adoption of Open Source Libraries. A case study on Albumentations.AI
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AI
Vladimir Iglovikov, Ph.D.
 
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
Neo4j
 
Mind map of terminologies used in context of Generative AI
Mind map of terminologies used in context of Generative AIMind map of terminologies used in context of Generative AI
Mind map of terminologies used in context of Generative AI
Kumud Singh
 
How to use Firebase Data Connect For Flutter
How to use Firebase Data Connect For FlutterHow to use Firebase Data Connect For Flutter
How to use Firebase Data Connect For Flutter
Daiki Mogmet Ito
 
Artificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopmentArtificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopment
Octavian Nadolu
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
KatiaHIMEUR1
 
Introducing Milvus Lite: Easy-to-Install, Easy-to-Use vector database for you...
Introducing Milvus Lite: Easy-to-Install, Easy-to-Use vector database for you...Introducing Milvus Lite: Easy-to-Install, Easy-to-Use vector database for you...
Introducing Milvus Lite: Easy-to-Install, Easy-to-Use vector database for you...
Zilliz
 
Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1
DianaGray10
 
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
Neo4j
 
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
Edge AI and Vision Alliance
 
Presentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of GermanyPresentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of Germany
innovationoecd
 
Large Language Model (LLM) and it’s Geospatial Applications
Large Language Model (LLM) and it’s Geospatial ApplicationsLarge Language Model (LLM) and it’s Geospatial Applications
Large Language Model (LLM) and it’s Geospatial Applications
Rohit Gautam
 
Pushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 daysPushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 days
Adtran
 
Uni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdfUni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems S.M.S.A.
 
How to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptxHow to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptx
danishmna97
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
Safe Software
 
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to ProductionGenerative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Aggregage
 
20240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 202420240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 2024
Matthew Sinclair
 
GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024
GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024
GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024
Neo4j
 

Recently uploaded (20)

みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
 
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AI
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AIEnchancing adoption of Open Source Libraries. A case study on Albumentations.AI
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AI
 
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
 
Mind map of terminologies used in context of Generative AI
Mind map of terminologies used in context of Generative AIMind map of terminologies used in context of Generative AI
Mind map of terminologies used in context of Generative AI
 
How to use Firebase Data Connect For Flutter
How to use Firebase Data Connect For FlutterHow to use Firebase Data Connect For Flutter
How to use Firebase Data Connect For Flutter
 
Artificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopmentArtificial Intelligence for XMLDevelopment
Artificial Intelligence for XMLDevelopment
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
 
Introducing Milvus Lite: Easy-to-Install, Easy-to-Use vector database for you...
Introducing Milvus Lite: Easy-to-Install, Easy-to-Use vector database for you...Introducing Milvus Lite: Easy-to-Install, Easy-to-Use vector database for you...
Introducing Milvus Lite: Easy-to-Install, Easy-to-Use vector database for you...
 
Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1Communications Mining Series - Zero to Hero - Session 1
Communications Mining Series - Zero to Hero - Session 1
 
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
 
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
“Building and Scaling AI Applications with the Nx AI Manager,” a Presentation...
 
Presentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of GermanyPresentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of Germany
 
Large Language Model (LLM) and it’s Geospatial Applications
Large Language Model (LLM) and it’s Geospatial ApplicationsLarge Language Model (LLM) and it’s Geospatial Applications
Large Language Model (LLM) and it’s Geospatial Applications
 
Pushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 daysPushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 days
 
Uni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdfUni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdf
 
How to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptxHow to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptx
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
 
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to ProductionGenerative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to Production
 
20240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 202420240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 2024
 
GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024
GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024
GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024
 

CFWheels - Pragmatic, Beautiful Code

  • 1. CFWheels Pragmatic, Beautiful code Indy Nagpal Straker Software Melbourne, November 2010
  • 2. A bit about me •  CTO, Straker Software, New Zealand •  Been doing CF (and Flex) for a while •  Cloud-based CF Using Railo •  In love with Ruby (the language) & Rails – Was in love with Groovy (still am, I think) •  nagpals.com/blog
  • 4. Agile •  Early, continuous delivery of software •  Welcome changing requirements •  Deliver working software frequently •  Working software = progress •  Technical excellence and good design •  Simplicity is essential – work not done
  • 5. “There comes a time in the history of every project when it becomes necessary to shoot the engineers and begin production.”
  • 6. Need •  Quickly build and deploy database-driven web apps •  Rapid iterations in a testable fashion •  Easy for multiple developers to understand •  Working app is more important than configuring the app
  • 7. Search… •  Tried lots of frameworks/methodologies •  Ruby on Rails addressed most issues •  Learn another language and framework •  Defeats the whole purpose •  Enter, CFWheels…
  • 8. What is CFWheels •  Framework inspired by Ruby on Rails •  Simple organization system •  Suited for typical, database-driven web applications •  A couple of years’ old – fairly mature
  • 9. Convention over configuration •  Possibly the single most important thing •  Mostly convention, minor configuration •  Easy to – turn on – tune in – drop out
  • 11. Intuitive Code Structure •  View –  Responsible for display and user interaction –  Receive data from controller •  Controller –  Process requests from view –  Get/process data from model –  Make data available to the view •  Model –  Interacts with the database layer –  Responsible for validation –  Other methods to process/message data
  • 12. Convention - URLs •  URLs mapped to controllers/models/views http://blog/posts/edit/1 Controller: Posts Model: Post Action: Edit Key: 1
  • 13. View – http://blog/posts/ /views/posts/index.cfm <cfparam name="posts"> <ul> <cfoutput query="posts"> <li> #linkTo( text = "#posts.title#", action = "edit", key = post.id, title = "Edit #posts.name#" )# </li> </cfoutput> </ul>
  • 14. Controller – http://blog/posts/ /controllers/Posts.cfc <cfcomponent extends="Controller"> <cfscript> function index(){ posts = model("post").findAll(order="createdAt") } </cfscript> </cfcomponent
  • 15. Model – http://blog/posts/ /models/Post.cfc <cfcomponent extends="Model"> <cfscript> function init(){ belongsTo("author") hasMany("comments") validatesLengthOf( properties = "title", minimum = 10, maximum = 255) } </cfscript> </cfcomponent>
  • 16. Convention – Files & Database •  Place in appropriate folders – MVC •  Plural database names, singular model names – DB Table: posts – Model: Post.cfc •  Database fields: id, createdat, updatedat
  • 17. Built-in ORM •  Simple and elegant •  All major databases supported •  Almost no setup required – baked in •  CRUD instantly available via models/plugin •  Finding data using “finders” –  findOne(), findAll(), findByKey()…
  • 18. Associations models/Post.cfc <cfcomponent extends="Model">
 <cfscript> function init(){ belongsTo("author") } </cfscript>
 </cfcomponent> models/Author.cfc <cfcomponent extends="Model">
 <cfscript> function init(){ hasMany("posts") } </cfscript>
 </cfcomponent> <cfscript> posts = model("post").findAll(include="author") author = model("author").findOneByKey(key=params.key,include="posts") </cfscript>
  • 19. Dynamic Finders •  Dynamic finders are magical model("user").findOne(where="username='bob' and password='pass'") rewritten as model("user").findOneByUsernameAndPassword("bob,pass”)
  • 20. URLs and Routing •  Beautiful URLs –  http://blog/a-good-url •  Powerful routing mechanism <cfset addRoute( name = "showPost", 
 pattern = "/[key]”,
 controller = "Posts",
 action = "show")> •  Can be turned REST-full
  • 21. Multiple response formats •  http://blog/posts •  http://blog/posts.xml •  http://blog/posts.json •  http://blog/posts.csv •  http://blog/posts.pdf
  • 22. Common tasks done •  Adding timestamps •  Flashing messages •  Pagination •  Sending multi-part emails •  Redirecting users
  • 23. Lots of helper functions •  Views selectBox() linkTo() timeAgoInWords() paginationLinks() titleize() pluralize() •  Model validatePresenceOf() findAll() findOneByKey() afterSave() •  Controller flash() isGet() sendMail()
  • 24. Plugins •  Neat architecture to add/override functionality •  Extremely useful – Scaffold –generate CRUD application – DBMigrate – Add/edit database structure – Remote Form Helpers – Ajax with forms – Localizer – Localizing an application
  • 25. Baked in testing •  Ships with RocketUnit <cfcomponent extends="tests.Test"> <cfscript> function test_1_get_timezones(){ qTimezone = model("Timezone").getTimezones() assert("isQuery(qTimezone) ") assert("qTimezone.recordcount eq 56") } </cfscript> </cfcomponent>
  • 26. Environments •  Different setup for applications based on stages of development – Design, Development, Production, Testing, Maintenance •  Differ in terms of caching, error-handling •  Switch environments via config/url
  • 27. Docs/Support •  Very helpful docs at cfwheels.org •  Active and supportive mailing list •  Quite a few screencasts •  Direct knowledge transfer from Ruby on Rails books/docs (e.g., Head First Rails) •  Bunch of blogs
  • 28. IDE Support •  Eclipse, CFBuilder – Syntax Dictionary •  Textmate – Bundle •  Coda – Lacking, but works by adding Clips
  • 29. Beauty •  Simple code organization and flow •  Easy to understand code – eyeballing code •  Common tasks done with minimal code •  Pretty URLs •  Almost zero configuration, with power to configure as much as needed
  • 30. Pragmatic •  Focus on simple code that solves issues •  Trades pure OO for simplicity and structure •  Easy to not use the framework if needed •  Common web application problems already solved – why reinvent the wheel(s)!
  • 31. Wrap up •  Evaluate if you need a ‘framework’ •  Learn URL rewrites (Apache, IIS) •  Dabble with Ruby on Rails •  cfscript = succinct code •  Worth trying out just to see how problems can be solved in a different manner