# W PA Z
A D VA N C E D D E V E L O P E R M E E T U P
C H R I S
K L O S O W S K I
• Co-Lead Developer - Easy
Digital Downloads
• Founding Developer - Post
Promoter Pro
• Writing - KungFuGrep.com
• Home brewing
• Weird Dad
• @cklosowski (usually)
cklosowski
easydigitaldownloads.com | kungfugrep.com
T I M E I S M O N E Y
R A N G I N G F R O M $ 3 0 - $ 1 5 0 / H O U R , D E V T I M E I S N ’ T C H E A P
P R E V E N T I N E F F I C I E N C Y
T H R O U G H C O D E , W E C A N R E D U C E D E V T I M E
Reduce Code Complexity
Reuse Common Patterns
Refactor When Needed
C O N T E X T S W I T C H I N G I S B A D
H T T P : / / C H R I S K . I O / I / C O N T E X T
I N A P E R F E C T W O R L D …
C O N T E X T S W I T C H I N G I S A N E C E S S A RY E V I L
O P T I M I Z I N G W O R K F L O W
M A K I N G O U R A C T U A L “ F L O W ” T I M E M O R E E F F E C T I V E
R E D U C E C O M P L E X I T Y
T H E H A R D E R T O R E A D , T H E H A R D E R T O F I X
“Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by
definition, not smart enough to debug it.”
-Brian Kernighan: Co-Developer of Unix
W H AT I S
C O M P L E X I T Y ?
• Difficult to read
• “Tricky” solutions
• Cyclomatic complexity
• Examples…?
• You Bet!
if ( true === $foo ) {
foreach ( $bar as $key => $baz ) {
$bar[ $key ] = strtolower( $baz );
}
}
H A R D T O R E A D
function execute_data_input( $data = array() ) {
// Hard to know what is needed to use `execute_data_input`
}
function execute_data_input( $arg1 = '', $arg2 = '', $arg3 = '' ) {
// Easily readable and defined argument sets
}
T R I C K Y C O D E
// Input
$utm = array(
'campaign' => 'PostPromoterPro',
'source' => 'twitter',
'medium' => 'social',
);
// Output is a string
utm_campaign=PostPromoterPro&utm_source=twitter&utm_medium=social
T R I C K Y C O D E
$utm_string .= implode( '&', array_map( function ( $v,
$k ) { return 'utm_' . $k . '=' . $v; }, $utm,
array_keys( $utm ) ) );
$first = true;
foreach ( $utm as $key => $value ) {
if ( ! $first ) {
$utm_string .= '&';
}
$utm_string .= 'utm_' . $key . '=' . $value;
$first = false;
}
R E U S E C O M M O N PAT T E R N S
C R E AT E C O M M O N PAT T E R N S A N D C O N V E N T I O N S
R E U S I N G Y O U R
PAT T E R N S
• Standardize
• Function Naming
• Variable Naming
• Directory Structure
• Abstract Data Models
• Build Base Classes
A L L A B O U T T H AT B A S ES L I D E S W I T H O U T A P U N A R E N ’ T R E A L LY S L I D E S …
‣ EDD_Recurring_Gateway
‣ EDD_Recurring_2Checkout extends EDD_Recurring_Gateway
‣ EDD_Recurring_Authorize extends EDD_Recurring_Gateway
‣ EDD_Recurring_Stripe extends EDD_Recurring_Gateway
‣ EDD_Recurring_PayPal extends EDD_Recurring_Gateway
‣ …
Object Inheritance - When you extend a class, the
subclass inherits all of the public and protected methods
from the parent class. Unless a class overrides those
methods, they will retain their original functionality.
B U I L D A T E M P L AT EH T T P S : / / G I T H U B . C O M / E A S Y D I G I TA L D O W N L O A D S / E D D - E X T E N S I O N - B O I L E R P L AT E
R E FA C T O R I N G I S O K
I T ’ S N O T A N E V I L W O R D A N D I S S O M E T I M E S N E C E S S A RY
Code refactoring is the process of restructuring existing code without
changing its external behavior.
W H Y R E FA C T O R
W E ’ R E N O T M A K I N G I T D O A N Y T H I N G D I F F E R E N T ! ?
B E N E F I T S O F
R E FA C T O R I N G
• Performance Improvements
• Improve Readability
• Reduce Complexity
• Seeing a Trend?
• Improve Matainability
• Adapt New Best Practices
• Foundation Improvements
• Improve Extensibility
S T O RY T I M E
A ‘ R E C U R R I N G PAY M E N T S ’ C O M I N G O F A G E TA L E
August 30, 2012
First Commit, Ever
The Recurring Payments Story
January 23, 2015
Pressnomics 3
May 19, 2015
2.4 Development Starts
Jan 28, 2016
Preview Post
Feb 24, 2016
2.4 Goes Live
Jan 21, 2016
Live on AffiliateWP
The Recurring Payments Story
The Recurring Payments Story
• No “Backwards Compatibility”
• Introduced Gateway Base Class
• Introduced Classes for:
• Subscriber
• Subscription
• Emails
• Reminders
• Completely Refactored
• Raised the Price
Reduce, Reuse, Refactor

Reduce, Reuse, Refactor

  • 1.
    # W PAZ A D VA N C E D D E V E L O P E R M E E T U P
  • 2.
    C H RI S K L O S O W S K I • Co-Lead Developer - Easy Digital Downloads • Founding Developer - Post Promoter Pro • Writing - KungFuGrep.com • Home brewing • Weird Dad • @cklosowski (usually)
  • 3.
  • 4.
    T I ME I S M O N E Y R A N G I N G F R O M $ 3 0 - $ 1 5 0 / H O U R , D E V T I M E I S N ’ T C H E A P
  • 5.
    P R EV E N T I N E F F I C I E N C Y T H R O U G H C O D E , W E C A N R E D U C E D E V T I M E Reduce Code Complexity Reuse Common Patterns Refactor When Needed
  • 8.
    C O NT E X T S W I T C H I N G I S B A D H T T P : / / C H R I S K . I O / I / C O N T E X T
  • 9.
    I N AP E R F E C T W O R L D … C O N T E X T S W I T C H I N G I S A N E C E S S A RY E V I L
  • 10.
    O P TI M I Z I N G W O R K F L O W M A K I N G O U R A C T U A L “ F L O W ” T I M E M O R E E F F E C T I V E
  • 11.
    R E DU C E C O M P L E X I T Y T H E H A R D E R T O R E A D , T H E H A R D E R T O F I X “Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” -Brian Kernighan: Co-Developer of Unix
  • 12.
    W H ATI S C O M P L E X I T Y ? • Difficult to read • “Tricky” solutions • Cyclomatic complexity • Examples…? • You Bet!
  • 13.
    if ( true=== $foo ) { foreach ( $bar as $key => $baz ) { $bar[ $key ] = strtolower( $baz ); } } H A R D T O R E A D function execute_data_input( $data = array() ) { // Hard to know what is needed to use `execute_data_input` } function execute_data_input( $arg1 = '', $arg2 = '', $arg3 = '' ) { // Easily readable and defined argument sets }
  • 14.
    T R IC K Y C O D E // Input $utm = array( 'campaign' => 'PostPromoterPro', 'source' => 'twitter', 'medium' => 'social', ); // Output is a string utm_campaign=PostPromoterPro&utm_source=twitter&utm_medium=social
  • 15.
    T R IC K Y C O D E $utm_string .= implode( '&', array_map( function ( $v, $k ) { return 'utm_' . $k . '=' . $v; }, $utm, array_keys( $utm ) ) ); $first = true; foreach ( $utm as $key => $value ) { if ( ! $first ) { $utm_string .= '&'; } $utm_string .= 'utm_' . $key . '=' . $value; $first = false; }
  • 16.
    R E US E C O M M O N PAT T E R N S C R E AT E C O M M O N PAT T E R N S A N D C O N V E N T I O N S
  • 17.
    R E US I N G Y O U R PAT T E R N S • Standardize • Function Naming • Variable Naming • Directory Structure • Abstract Data Models • Build Base Classes
  • 18.
    A L LA B O U T T H AT B A S ES L I D E S W I T H O U T A P U N A R E N ’ T R E A L LY S L I D E S … ‣ EDD_Recurring_Gateway ‣ EDD_Recurring_2Checkout extends EDD_Recurring_Gateway ‣ EDD_Recurring_Authorize extends EDD_Recurring_Gateway ‣ EDD_Recurring_Stripe extends EDD_Recurring_Gateway ‣ EDD_Recurring_PayPal extends EDD_Recurring_Gateway ‣ … Object Inheritance - When you extend a class, the subclass inherits all of the public and protected methods from the parent class. Unless a class overrides those methods, they will retain their original functionality.
  • 19.
    B U IL D A T E M P L AT EH T T P S : / / G I T H U B . C O M / E A S Y D I G I TA L D O W N L O A D S / E D D - E X T E N S I O N - B O I L E R P L AT E
  • 20.
    R E FAC T O R I N G I S O K I T ’ S N O T A N E V I L W O R D A N D I S S O M E T I M E S N E C E S S A RY Code refactoring is the process of restructuring existing code without changing its external behavior.
  • 21.
    W H YR E FA C T O R W E ’ R E N O T M A K I N G I T D O A N Y T H I N G D I F F E R E N T ! ?
  • 22.
    B E NE F I T S O F R E FA C T O R I N G • Performance Improvements • Improve Readability • Reduce Complexity • Seeing a Trend? • Improve Matainability • Adapt New Best Practices • Foundation Improvements • Improve Extensibility
  • 23.
    S T ORY T I M E A ‘ R E C U R R I N G PAY M E N T S ’ C O M I N G O F A G E TA L E
  • 24.
    August 30, 2012 FirstCommit, Ever The Recurring Payments Story January 23, 2015 Pressnomics 3 May 19, 2015 2.4 Development Starts Jan 28, 2016 Preview Post Feb 24, 2016 2.4 Goes Live Jan 21, 2016 Live on AffiliateWP
  • 25.
  • 26.
    The Recurring PaymentsStory • No “Backwards Compatibility” • Introduced Gateway Base Class • Introduced Classes for: • Subscriber • Subscription • Emails • Reminders • Completely Refactored • Raised the Price