Fusedoc: An Emerging Standard: Make Everything As Simple As Possible, But Not Simpler
Fusedoc: An Emerging Standard: Make Everything As Simple As Possible, But Not Simpler
AN EMERGING STANDARD
Make everything as simple as possible, but not simpler.
-Albert Einstein
WHY FUSEDOC?
The purpose of Fusedoc is to provide
a standard that will help developers
in…
shortening development cycles
reducing development costs
lessen occasion and severity of bugs
make maintenance of programs easier
THE CRITICAL PATH
Dependent Events
Independent Events
A2 B4 C8 D6 G2
F2 H1 J9
E5 I3
THE FUSEBOX PATH
Fusebox
Fusedocs
Architecture
Query
Sims Queries/
Queries/
Data Model
Fusestubs
Sprocs
Sprocs
& Schema Queries/
Sprocs
Wireframe Prototype
THE FUSEBOX PATH
Fusebox
Fusedocs
Architecture
Query
Sims Queries/
Queries/
Data Model
Fusestubs
Sprocs
Sprocs
& Schema Queries/
Sprocs
Wireframe Prototype
Dependencies
Dependencies are broken through
strong interfaces
Fusedoc provides way to specify the
interface of fuses
THE GOAL: FUSESTUBS
Fusestubs provide a coder with the
fuse layout (HTML/CSS, etc.), any
applicable query sims and the
Fusedoc needed to complete the
fuse.
FUSEDOC
When asked what was the most
frightening thing he had ever
experienced, Mark Twain immediately
answered, “a blank piece of paper.”
We have been taught that we should
document our code but now how.
A SAMPLE FUSEDOC
<!---
|| BEGIN FUSEDOC ||
|| RESPONSIBILITIES ||
I provide the user a login of both userName and password, returning to the
fusebox with an RFA of submitForm. If I get a var called ‘badLogin’, the
user is returning to me from an invalid login.
|| HISTORY ||
Author: hal.helms@TeamAllaire.com
|| ATTRIBUTES ||
--> RFA.submitForm: a FUSEACTION
--> [badLogin]: a STRING
<-- userName: a STRING
<-- password: a STRING
|| END FUSEDOC ||
--->
FUSEDOC DISSECTED
<!---
Limit || BEGIN FUSEDOC ||
|| RESPONSIBILITIES ||
I provide the user a login of both userName and
password, returning to the fusebox with an RFA of
submitForm. If I get a var called ‘badLogin’, the user
is returning to me from an invalid login.
Sections || HISTORY ||
Author: hal.helms@TeamAllaire.com
|| ATTRIBUTES ||
--> RFA.submitForm: a FUSEACTION
--> [badLogin]: a STRING
<-- userName: a STRING
<-- password: a STRING
|| RESPONSIBILITIES ||
I provide the user a login of both userName and password, returning to the
fusebox with an RFA of submitForm. If I get a var called ‘badLogin’,
the user is returning to me from an invalid login.
|| ATTRIBUTES ||
--> RFA.submitForm: a FUSEACTION
--> [badLogin]: a STRING
<-- userName: a STRING
<-- password: a STRING
|| END FUSEDOC ||
--->
CUSTOMIZED FUSEDOC
<!---
|| BE GIN F US EDO C ||
|| HI STO RY ||
Author: 8.8.20000 hal.helms@TeamAllaire.com
Revised: 9.14.2000 hal.helms@TeamAllaire.com; changed to default badLogin to “FALSE”
|| SP ERF ID IE S ||
Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium,
totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta
sunt, explicabo.
|| AT TRI BU TE S ||
--> RFA.submitForm: a FUSEACTION
--> [badLogin]: a STRING default=“FALSE”
<-- userName: a STRING REQUIRED
<-- password: a STRING REQUIRED
|| EN D F US ED OC ||
--->
PARSING ENGINES
Provides ability to view Fusedoc in
browser
Formal description of Fusedoc
provided in Extended Backus-Naur
Form
Flexible nature of Fusedoc allows
each developer/shop to define the
specification a fuse subscribes to
ATTRIBUTE IDENTIFIERS
<!---
|| FUSEDOC ||
|| RESPONSIBILITIES ||
I show the user's cart summary based on the cookie "cartID" that exists. If no cookie exists, I tell the user they
don't have anything in their cart.
|| ATTRIBUTES ||
--> RFA.continueShopping: a FUSEACTION
--> RFA.removeItemFromCart: a FUSEACTION
--> RFA.retotalCart: a FUSEACTION called when the Update_&partID&_&quantity& is changed
--> RFA.checkout: a FUSEACTION
@DeveloperNote: The ampersand indicates that this will be replaced by a value at run time. For example, a valid
variable name might be "Update_2107_1"
<-- Update_&partID&_quantity: a STRING on RFA.retotalCart (may be multiple)
+++ qryGetCartSummary.cfm
+++ incHeader.cfm
+++ incFooter.cfm
|| END FUSEDOC ||
--->
<!-- dspOrderReceipt.cfm -->
DOES IT WORK?
<!-- hal.helms@TeamAllaire.com -->
<!---
|| FUSEDOC ||
|| RESPONSIBILITIES ||
I first try to get credit card authorization. If it fails, I let the customer know there was a problem and I invite them to try again
with RFA.checkoutAgain. If auth succeeds, I call qryInsertOrder.cfm to add an order,
I show the order summary (qryGetCartSummary.cfm and qrymyShippingInfo.cfm) and thank them for their business. I also email an order
summary to them and then an order summary to each of the developers who had items in their order. Finally, I clear out the cart
(qryClearCart.cfm) and delete the cookie.cartID and the cookie.ShoppingInfo.
|| ATTRIBUTES ||
--> RFA.failure: a FUSEACTION
+++ qryGetCartSummary.cfm
+++ qrymyShippingInfo.cfm
+++ qryInsertOrder.cfm
+++ qryClearCart.cfm
+++ incHeader.cfm
+++ incFooter.cfm
+++ PaymentNet: a CFX tag to communicate withe creditcard auth.
|| END FUSEDOC ||
DOES IT WORK?
www.solutionssite.com
Hal Helms, Fusebox architect
Jeff Bane, database architect
Aaron Newman, layout specialist
A Philippines-based CF shop were coders
DOES IT WORK?
www.solutionssite.com, a Sun ecommerce
site
Aaron worked with client on look and feel
Simultaneously, Jeff worked on data model
while
I worked on overall Fusebox architecture
I created Fusestubs and query sims and sent
them off to the Philippines for coding
We received them back (with test harnesses)
and I integrated them and did integrated
testing.
Results:
60% cost savings
FUSEBOX TRAINING
If written directions alone would suffice, libraries
wouldn't need to have the rest of the universities
attached.
- Judith Martin
“Developing Applications with ColdFusion &
Fusebox”, developed and taught by Hal
Helms
Oct 16-20, Tampa, FL
hal.helms@teamallaire.com for more info