您的位置:首页 > 编程语言

编程经验总结(-2013.9.6)

2016-02-24 11:36 309 查看

编程经验总结( -13.9.6)

---by:Kiddy 拙见,写错的地方还请见谅,欢迎提意见...

1.静态类、静态函数、静态变量

静态类,不能滥用静态,应该尽可能的少用,虽然静态类,可以很轻松和简单的获取和修改相关的值,但是这样也存在许多弊端,对象过于公开,基本上任何一个类都可以访问,而且常驻内存,无法销毁等

使用范围:1.需要经常访问和修改的数据....

优化建议:1.将所有的静态类,封装在一个静态类管理器中,然后静态类之间,通过层级关系进行封装,如

public class AppManager {

public function AppManager() {

}

public static function get layerManager():LayerManager{

return LayerManager.instence;

}

}

静态函数、静态变量,和静态类一样,不能滥用,除了静态类中,其他普通类,接近于静止使用,能使用普通函数,普通变量的,就得使用普通函数和普通变量;并且静态函数,不能访问普通的全局变量,如果需要访问该变量,得把普通变量也变成静态变量,不可为之...

 

2.单一责任原则,虽然说过无数遍,但是还是得提一提

单一责任,如其名,只能拥有一个职责,说的是,在平时编写代码时,一个类,一个函数,一个变量,只能拥有一种职责,不要让其担当过多的责任,当然也不能把责任过于细化。

一个类的责任:借鉴与MVC设计模式,一个类,要么只负责数据,要么只负责UI界面,要么只负责控制....

一个函数的责任:一个函数只负责一个模块的处理,比如说更新数据,重新渲染等,通常一个模块也可以分成若干个子模块,等于一个函数的功能可以分成由多个函数完成......

一个变量的责任:相信大家也有过和我一样的想法,为了避免再去重新定义一个变量,直接拿取已有的变量来使用。这样看似也说的过去,但是回过头来想一想,这个变量已经“越界了”,做了不该做的事情,还是做自己该做的事情,更好点。

 

3.键盘事件,关于键盘事件,键盘事件可以单独的进行封装,写成一个静态类,然后对于那些所需要键盘事件,在该静态方法中进行注册。当然文本除外。-----肯定有利也有弊,取决于自己..

public class KeyboardManger {

private static var _instence:KeyboardManger = null;

private var _observes:Vector.<Function> = new Vector.<Function>();

private var _keys:Vector.<uint> = new Vector.<uint>();

public function KeyboardManger() {

}

public static function get instence():KeyboardManger {

if(_instence == null) {

_instence = new KeyboardManger();

}

return _instence;

}

public function init(stage:Stage):void{

stage.addEventListener(KeyboardEvent.KEY_DOWN , onKeyDown);

stage.addEventListener(KeyboardEvent.KEY_UP , onKeyUp);

}

public function register(fun:Function):void{

if(_observes.indexOf(fun) >  -1){

return;

}else{

_observes.push(fun);

}

}

public function remove(fun:Function):void{

if (_observes.indexOf(fun)  >  -1){

_observes.splice(_observes.indexOf(fun) , 1);

}

}

private function notifyObservers():void {

for (var i:int = 0;  i < _observes.length;  i++) {

_observes[i](_keys);

}

}

private function onKeyDown(event:KeyboardEvent):void {

if (_keys.indexOf(event.keyCode) == -1) {

_keys.push(event.keyCode);

}

notifyObservers();

}

private function onKeyUp(event:KeyboardEvent):void {

if (_keys.indexOf(event.keyCode) > -1) {

_keys.splice(_keys.indexOf(event.keyCode) , 1);

}

}

}

 

4.粒子池”,本来不应该写在这里,但是还是写一写,为了让自己更加深刻,“粒子池”。---代码也许设计的并不是很好,请见谅..

粒子池,首先是一个池,其容量有限,每次只用到了其中一部分空间,粒子的存活时间有限,到达一定添加便死亡。需要创建新的粒子时,有两种方法,



第一种:用完后回收,首先判断,粒子池的空间是否已经已经全部使用完毕,如果使用完毕,回收死亡的粒子用于穿件新的粒子

 


第二种,边用边回收,如果需要创建新的粒子,则,直接进行回收,然后使用回收的粒子,创建新的粒子

 


 

适用范围:设计到需要许多该对象的实例时,比如说,粒子效果,大量加载素材的素材池等等...

public class ParticlesFac {

public static const MAX_PARTICLE:int = 200;

private var particles:Vector.<Particle> = new Vector.<Particle>(MAX_PARTICLE,true);

public function creatParticle(num:int):Vector.<Particle>{

if(num <= 0) {

return new Vector.<Particle>();

}

//回收已经死亡的粒子

this.recovery();

var pars:Vector.<Particle> = new Vector.<Particle>();

for (var i:int = 0; i < particles.length; i++) {

//当粒子为空时,进行创建

if (particles[i] == null){

particles[i] = new Particle();

particles[i].init();

pars.push(particles[i]);

} else if (particles[i].isUsed == false){
//粒子未必使用时

particles[i].init();

pars.push(particles[i]);

}

if (pars.length >= num){

break;

}

}

return pars;

}

public function recovery():void{

for (var i:int = 0; i < particles.length; i++) {

if((particles[i])&&(particles[i].isDead == true)){//粒子已经死亡时

particles[i].clear();

}

}

}

}

5.PureMVC设计模式,说说最近学习到的设计模式,主要通过研究PureMVC框架,其中设计到学到设计模式,比如说,单例模式,观察者模式,中介者模式..当然还有其他的设计模式,目前只理解者三个.单例模式也就没什么好说的了,只能创建一个对象,可以通过类名直接获取对象。

观察者模式,指的是,类与类、实例与实例之间的联系方式,通过观察的方法进行联系,当一个实例发生变化时,需要修改另一个实例的相关属性,另一个实例可以通过注册对另一个实例的监听,是不是很复杂?具体的还请查看设计模式相关资料

 


 

中介者模式,个人觉得,和观察者模式有点相似,但是也有区别,当一个实例发生变化时,需要修改另一个实例的相关属性,这个时候,并不是通过注册来进行,而是通过一个“第三方”(中介者)来进行修改.

 

 


 

 

 

6.碰撞检测的优化,在碰撞检测中,我们可以进行分区进行碰撞检测,而不是直接对整个场景对象进行碰撞检测。

检测分割的方法可以有许多在,比如说四叉树,多叉树等等形式。可以将一个庞大的循环分割成多个后代循环系统中。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息