高效编程所需要做的14件事

计划(Plan)

所谓Plan,其实就是对应于编程中的“设计”阶段,当然,这里的Plan并不像设计那样重量级。它要求我们程序员在正式编程前至少要考虑一下下面的问题:

  • 你这个程序,工具或是项目的目的,究竟是用来干什么的。你只有知道做什么,要达到什么样的目的,你才能做得对,做得好。
  • 需要有什么样的功能。需要你给出来个功能列表。这样可以保证我们不会遗露了什么。
  • 准备好一些技术难题的前期调查和解决方案。不要等到开始编程的时候才去想。

下面这你因为有“Plan”而得到的好处:

  • 你能够清楚地明白你要做的东西长什么样?
  • 你能清楚知道你要开发的东西要干些什么事?
  • 你能够在开发过程中解决你所有可能发生的难题。

 

使用伪代码

伪代码是一个非常不错的方式,让你可以看到你要写的程序长什么样?根据 维基百科(Wikipedia)
,伪代码被写定义成这样:

伪代码是一个紧凑和非正式的从高层描述一个计算机编程算法的结构约定。其主要是为了让人阅读而不是让计算机执行。典型的伪 代码一般会忽略那些算法中不需要人去关心的细节。比如:变量声明,系统调用,或是子程序。在伪代码中,编程语言被自然的人类语言所增强而放大,从而,更方 便,更紧凑。

一些人并不喜欢伪代码,因为他们并不相把同样的代码写两遍,一遍是伪代码,一遍是真代码。其实,这是可以理解的,因为两个copy的东西是比较不好 维护的。但是我想,这是可以权衡的,如果的算法很简单,那么就不需要伪代码了,如果你的算法比较复杂,比较绕,那么,有一个伪代码提纲挈领将会是一件非常 不错的事情,因为他有利于让别人从一个简单的文档来了解一个复杂的算法或系统。这就好像一个电线的布线图一样,你可以很容易地通过一个简单的文档从复杂的 实现中找到头绪。

书写清楚的注释

请在你的代码中书写清楚的程序注释。当然,注释不是越多越好,注释应该是简明扼要的,如果你的程序足够地清楚简单,那么注释就会显的多余。另外,注释应该是注释“原因,理由,目的”,而不是注释“是什么”。

使用自动的编辑工具

自动的编辑工具有很多,比如 Typinator
, 这是一个可以通过设定一些替代的简单代码来实现重复语句的快捷插入,比如你自己的签名、常用的语句等等,通过它可以设定替代的简短代码。还有其它一些代码 自动完成的工具,比如一些VC的插件,还有像Source Insight这样的东西。别小看这一点点时间,如果你每天都在写代码的话,今天一点点,明天一点点,将会为你省出很多的时间。

减少代码

减少代码的数量,坚持DRY(Don’t Repeat Yourself
) 和KISS(Keep It Simple & Stupid) 原则。这样可以有交物减少代码的复杂度,提高程序的易读性和可维护性,同时也能增加代码的质量。

代码重用

DRY (don’t repeat yourself) 原则就是告诉我们需要重用现有的代码。这样,你才能够站在巨人的肩膀之上,从而可以更多的关注和自己所要处理业务的逻辑。编程的最高境界就是写出来的代码是可能被重用的,重用和泛型这是编程里始终在追求的目标。

代码重构

一些老的代码可能已经不合时宜了,比较以前老的C++的STL库在多线程下可能会出现很多问题。所以,我们自己的代码也是一样的,每过一段时间,我 们需要把这些代码回收再利用,这就是软件的重构。重构代码所追求的并不是要提供更多的功能,而是让老的代码更有生命力,让老的代码跟上时代,更具扩展性, 灵活性。

使用设计模式

设计模式是一种从代码级解决某一些问题的方法论。这个世界上有很多很多的设计模式,比如MVC,单实例,工厂,观察者等等,等等。使用好的设计模式可以让你的代码更具重用和扩展性。

使用程序框架Framework

Frameworks 是一份给程序员的礼物,他们帮助你完成了很多很细节的事情,他们有可能是一个lib库,你需要进行简单的拼装,一个几乎完成了的软件框架就已形成。这是一 个能够给开发工作提速的东西。只要上网随便搜一搜,你可以看到太多太多的框架了。形形色色,几乎都是开源社区贡献的。

泛型编程

如果抽像出一些程序中相似的东西,然后把这些相似的东西用一个标准的东西实现,这也是编程所追求的最高境界之一,像诸如C++中的STL之类的东西就是此类东西的最佳体现。灵活之及,几乎都快放之四海皆准了。

使用开源的代码

这个世界上有太多太多开源的代码了。学会利用他们可以让你更节省时间和精力,因为我们完全没有必要把相当的东西实现若干次,学会使用开源的代码不但是一个学习的过程,同样也是一个增加编程效率的事情。

完善开发环境

开发环境非常重要,因为好的开发环境可以让你事倍功半。他们可以让你不需要关注别的东西,比如,我曾看过某程序员在调整编辑器的字体和高亮上花费了不少工夫。是的,这是值得肯定了,只有把开发环境变得舒服,才能让自己更好的编程。

使用调试器

学会使用调试器来调试代码,单步跟踪,变量值跟踪,内存,堆栈等等。熟练地使用调试器可以让你更好的查找程序的问题,以得到最优的代码。

使用版本管理工具

版本管理工具应该是任何程序员都应该要去学会使用的东西,特别在一个团队中,如何管理程序的不同版本,如何维护,存放代码,版本管理工具绝对是开发过程中不可少的东西。其意义绝对不只代码备份和共享那么简单。下面是一些开源的管理管理工具:Git
SVN
CVS
Bazaar

http://www.coderhome.net/zifa/archives/527

PHP三种设计模式实例

/**观察者模式、策略模式、简单工厂模式
* 定义观察接口
*/
interface Subject
{
    public function Attach($Observer); //添加观察者
    public function Detach($Observer); //踢出观察者
    public function Notify(); //满足条件时通知观察者
    public function SubjectState($Subject); //观察条件
}

/**
* 观察类的具体实现
*/
class Boss Implements Subject
{
    public $_action;
   
    private $_Observer;
   
    public function Attach($Observer)
    {
        $this->_Observer[] = $Observer;
    }
   
    public function Detach($Observer)
    {
        $ObserverKey = array_search($Observer, $this->_Observer);
       
        if($ObserverKey !== false)
        {
            unset($this->_Observer[$ObserverKey]);
        }
    }
   
    public function Notify()
    {
        foreach($this->_Observer as $value )
        {
            $value->Update();
        }
    }
   
    public function SubjectState($Subject)
    {
        $this->_action = $Subject;
    }
}

/**
* 抽象观察者
*
*/
abstract class Observer
{
    protected $_UserName;
   
    protected $_Sub;
   
    public function __construct($Name,$Sub)
    {
        $this->_UserName = $Name;
        $this->_Sub = $Sub;
    }
   
    public abstract function Update(); //接收通过方法
}

/**
* 观察者
*/
class StockObserver extends Observer
{
    public function __construct($name,$sub)
    {
        parent::__construct($name,$sub);
    }
   
    public function Update()
    {
        echo $this->_Sub->_action.$this->_UserName." 你赶快跑...";
    }
}

$huhansan = new Boss(); //被观察者

$gongshil = new StockObserver("三毛",$huhansan); //初始化观察者

$huhansan->Attach($gongshil); //添加一个观察者
$huhansan->Attach($gongshil); //添加一个相同的观察者
$huhansan->Detach($gongshil); //踢出基中一个观察者

$huhansan->SubjectState("警察来了"); //达到满足的条件

$huhansan->Notify(); //通过所有有效的观察者

===============================================

策略模式

/**
* 定义支持算法的接口
*
*/
abstract class Strategy
{
    abstract public function AlgorithmInterface();
}

class ConcreateStratA extends Strategy
{
    public function AlgorithmInterface()
    {
        echo "算法A";
    }
}

class ConcreateStratB extends Strategy
{
    public function AlgorithmInterface()
    {
        echo "算法B";
    }
}


class ConcreateStratC extends Strategy
{
    public function AlgorithmInterface()
    {
        echo "算法C";
    }
}

class Context
{
    private $_StrObj;
   
    public function __construct($strobj)
    {
        $this->_StrObj = $strobj;
    }
   
    public function ContextInterface()
    {
        $this->_StrObj->AlgorithmInterface();
    }
}

$context = new Context(new ConcreateStratA);
$context->ContextInterface();
$context = new Context(new ConcreateStratC);
$context->ContextInterface();
$context = new Context(new ConcreateStratB);
$context->ContextInterface();

=================================================

简单工厂模式

/**
* 定义运算类
*
*/
abstract class Operation
{
    //存储第一个数字
    protected $_NumberA = 0;
   
    //存储第二个数字
    protected $_NumberB = 0;
   
    //存储运算结果
    protected $_Result = 0;
   
    public function __construct()
    {
        //empty
    }
   
    /**
     * 设定需要运行的二个数字
     *
     * @param 第一个数字 $A
     * @param 第二个数字 $B
     */
    public function SetNumber($A=0,$B=0)
    {
        $this->_NumberA = $A;
        $this->_NumberB = $B;
    }
   
    /**
     * 清除所有数据
     *
     */
    protected function ClearResult()
    {
        $this->_Result = 0;
    }
   
    abstract function GetResult();
}


/**
* 数据相加
*/
class OperactionAdd extends Operation
{
    public function GetResult()
    {
        $this->_Result = $this->_NumberA + $this->_NumberB;
       
        return $this->_Result;
    }
}


/**
* 数据相减
*/
class OperactionSub extends Operation
{
    public function GetResult()
    {
        $this->_Result = $this->_NumberA - $this->_NumberB;
       
        return $this->_Result;
    }
}


/**
* 数据相乘
*/
class OperactionMul extends Operation
{
    public function GetResult()
    {
        $this->_Result = $this->_NumberA * $this->_NumberB;
       
        return $this->_Result;
    }
}


/**
* 数据相除
*/
class OperactionDiv extends Operation
{
    public function GetResult()
    {
        $this->_Result = $this->_NumberA / $this->_NumberB;
       
        return $this->_Result;
    }
}

class OperactionFactory
{
    private static $_Obj;
   
    public static function CreateOperaction($type)
    {
         switch($type)
         {
             case "+":
                 self::$_Obj = new OperactionAdd;
                 break;
             case "-":
                 self::$_Obj = new OperactionSub;
                 break;
             case "*":
                 self::$_Obj = new OperactionMul;
                 break;
             case "/":
                 self::$_Obj = new OperactionDiv;
                 break;
         }
        
         return self::$_Obj;
    }
}

$Obj = OperactionFactory::CreateOperaction("*");
$Obj->SetNumber(6,4);
$num = $Obj->GetResult();
var_dump($num);