standard coding, oop techniques and code reuse

Post on 07-Jul-2015

6.511 Views

Category:

Technology

3 Downloads

Preview:

Click to see full reader

DESCRIPTION

Its about Standard Coding Practices, Object Oriented Programming Techniques and Code Reuse tips in PHP programming language.

TRANSCRIPT

Standard Coding, OOP Techniques and Code Reuse

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 2

Standard Coding

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 3

What isWhat is Standard CodingStandard Coding??

● Clean, smart and readable code● Follows a coding standard● Streamlined to the purpose

“Code is Art”

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 4

Why Standard Coding?

● Code Quality● Less buggy● Maintainability● Scalability● Collaboration

(Readability)

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 5

Coding Standards

● Zend Coding Standard

- The most advanced coding standard in PHP

● PEAR Coding Standards- Base for most of the coding standards in PHP

● CakePHP Coding Standard

● CodeIgniter Coding Standard

Note: There are tons of bad & inconsistent coding standards in PHP

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 6

Code Commenting

● Remember! Doc-block is must for File, Class and Method

● Always in phpDocumentor format, don't put your own tag

● Latest PHP IDE like NetBeans, Zend Studio, Eclipse PDT can help you generating doc-block easily

● Benefit

● Documentation is done as you go with coding

● Doxygen can build your API documentation in chm format instantly from your code

● IDE like netbeans shows code hints, code completion along with popup documentation on the fly

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 7

See, netbeans can show documentation on the fly

for you

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 8

Standard Coding - Tips

● Say no to short tags <? ?>, always long tags (<?php ?>)

● Use foreach instead of for loop for array iteration

● Ensure variable is not empty before any iteration

● Use null as default function parameter if possible

● Avoid nested conditions, return as early as possible

● Use alternative syntax for control structures when mixing with HTML

if ():

else:

endif;

foreach ():

endforeach;

for ():

endfor;

while ():

endwhile;

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 9

Standard Coding – empty

● empty() is a magic in php, learn how to use it, at the end you will love it

● Use !empty() instead of isset() when working with non-empty or non-zero value

● Use !empty($array) instead of count($array) when checking if array has value

● Always check your variable before going further with it

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 10

array functions = green power

● Learn them all, specially: in_array, array_merge, array_map, array_values, array_keys, join, explode!

● They can save your time!

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 11

Clean and Smart

Clean and Smart

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 12

OOP Techniques

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 13

Static Method & Variables

● Ever used Configure::read() in CakePHP.

● Remember! Public static method can be accessed from any part of your application

● No more global function, move them to a wrapper class with static method

● All methods in Sanitize, Set and String among other classes in CakePHP are static

● Extensively used in Zend Framework too

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 14

One-time/Magic Configuration

● Tired of multiple setters! Or you can't remember the order of parameters

● $options array as function parameter instead of multiple parameters or multiple setters

● setConfig() method, in constructor call setConfig(), do not bypass.

● Ensure configure and reconfigure ability

● Chain your method if possible

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 15

Design PatternsDesign Patterns● Solve common design problems not coding problems

● Singleton, Factory and MVC patterns are common

● Worth learning: Registry, Adapter, Decorator, Observer and Strategy patterns

● Same task can be done using different patterns, so choose wisely!

● Reminder! Patterns are not perfect, they have week points too

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 16

Singleton - Design Pattern

● Ensure a class has only one instance● Provide a global point of access to it

● Mostly used in application level Configuration, Logging, Database etc

● CakePHP uses extensive number of singleton classes like Configure, Router, App with static method etc

● Lazy initialization

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 17

class Logger {

protected static $_instance;

private function __construct($options = null) {}

public static function &getInstance($options = null) {

If (is_null(self::$_instance)) {self::$_instance = new self($options);

}

return self::$_instance;}

public function write($message, $type = null) {}}

Logger::getInstance()->write('My log message');

// Or $Logger = Logger::getInstance();$Logger->write('My log message!');

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 18

class Logger {

protected static $_instance;

private function __construct($options = null) {}

public static function &getInstance($options = null) {if (is_null(self::$_instance)) {

self::$_instance = new self($options);}

return self::$_instance;}

protected function _write($message, $type = null) {}

public static function write($message, $type = null) {$_this = self::getInstance();$_this->_write($message, $type = null);

}}

Logger::write('My log message!');

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 19

Order the factory to get

your favorite jeans

Factory MethodFactory Method

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 20

Factory Method - Design Pattern

● Single interface for creating instance from a family of classes that can do the same task in multiple ways

● Reduce platform dependency

● Example:

● Database Driver– mysqli, sqlite, oracle, postgres, odbc, mssql

● Authentication– Database, LDAP, OpenID etc

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 21

class DatabaseDriver {

static function &factory($driver = null, $options = null) {

switch ($driver) {case 'postgres':

return PostgresDriver($options);

case 'sqlite':return SQLiteDriver($options);

default:return MySQLiDriver($options);

}}

}

$DbDriver = DatabaseDriver::factory('mysqli');

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 22

MVC - Design Patterns

● Separate presentation, decision making and data layer

● Web is MVC

● So, your web application should be

● Zend Framework, CakePHP, CodeIgniter all are MVC

StorageClient Server

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 23

ORM – Object Relational Mapping

● Raw SQL? No more!

● ORM is more flexible, efficient and maintainable

● CakePHP has built-in ORM through association

● Zend has Relationships using Zend_Db_Table

● Doctrine and Propel are most popular ORM in PHP

● Doctrine can be used with both Zend Framework & CodeIgniter

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 24

Abstract Class

● Incomplete implementation of some concept

● You can implement multiple Interfaces but extend from only one abstract class

● You can't create instance of an Abstract Class

● Type hinting, enforce object type

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 25

Code Reuse

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 26

Code Reuse – when and how?

● Don't Re-Invent the Wheel

● But, you can always Improve the Wheel

● Decide when to Reuse● Got a peace of code that can perform a specific task

individually

● No copy & paste of the same code, put them inside a wrapper class and call whenever you need.

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 27

Wrap your code● Say you have got a

piece of code for updating Twitter Status

● First, separate configuration variable like apiUrl, username and password

● Separate variables that are specific to call, like message

● Write your update method

class Twitter {

protected $_configs = array('apiUrl' => '_api_url_','username' => '','password' => ''

);

function __construct($options) {

$this->_configs = $options; }

function setConfig($options);

function update($message);

}

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 28

Avoid DependencyAvoid Dependency

● My belief “Always keep the door open”

● Loosely coupled classes are reusable

● Make your class independent and flexible as much as you can

● Avoid dependency on global variables, constants, files, paths, system parameters

● Use dependency injection if necessary

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 29

Share Your Code

● Your Blog

● PHPClasses.org

● Google Code

● Github.com

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 30

Question and Answer

?

phpXperts 2010 Md. Rayhan Chowdhury | ray@raynux.com 31

Source

● All images are taken from flickr.com

top related