小编Gri*_*lij的帖子

依赖注入:在实际需要时拉出所需的组件

DI背后的要点是减轻一个类创建和准备它依赖的对象并将它们推入.这听起来很合理,但有时一个类不需要所有的对象,它们被推入它来执行它的功能.这背后的原因是"早期返回"发生在无效的用户输入或之前所需对象之一抛出的异常,或者在代码块运行之前实例化对象所必需的某个值不可用.

更实际的例子:

  • 注入永远不会使用的数据库连接对象,因为用户数据未通过验证(前提是没有使用触发器来验证此数据)
  • 注入收集输入的类似excel的对象(例如PHPExcel)(因为整个库被拉入并且从未使用过,所以加载和实例化很重,因为验证会在写入发生之前抛出异常)
  • 在类中确定的变量值,但在运行时不是注入器; 例如,路由组件,用于确定应根据用户输入调用的控制器(或命令)类和方法
  • 虽然这可能是一个设计问题,但是一个实质性的服务类,这取决于很多组件,但每个请求只使用1/3(原因,为什么我倾向于使用命令类而不是控制器)

因此,推动所有必要组件的方式与某些组件的创建和从未使用的方式相矛盾的是"延迟加载",这有点不实用且影响性能.就PHP而言 - 加载,解析和编译更多文件.如果被推入的对象具有自己的依赖关系,则这尤其痛苦.

我看到它有3种方法,其中2种听起来不太好:

  • 注射工厂
  • 注入喷射器(反模式)
  • 注入一些外部函数,一旦到达相关点就从类中调用(smtg,如"数据验证完成后检索PHPExcel实例"); 由于其灵活性,这是我倾向于使用的

问题是处理这种情况的最佳方法是什么/你们使用什么?

更新:@GordonM这里有3种方法的例子:

//inject factory example
interface IFactory{
    function factory();
}
class Bartender{
    protected $_factory;

    public function __construct(IFactory $f){
        $this->_factory = $f;
    }
    public function order($data){
        //validating $data
        //... return or throw exception
        //validation passed, order must be saved
        $db = $this->_factory->factory(); //! factory instance * num necessary components
        $db->insert('orders', $data);
        //...
    }
}

/*
inject provider example
assuming that the provider prepares necessary objects …
Run Code Online (Sandbox Code Playgroud)

php design-patterns dependency-injection

18
推荐指数
2
解决办法
484
查看次数

构建小型GUI引擎:可见与addChild/removeChild

目前,我正在尝试一个非常简单的GUI绘图......"引擎"(我想你可以称之为).它的要点:

  1. 有一个FrontController受到用户请求的攻击; 每个请求都有一个uid
  2. 每个uid(读"页面")都有一个声明它存在的组件("模块")
  3. 组件是Sprite子类,实质上是唯一的

当然,我需要一种隐藏/显示这些精灵的方法.目前,我非常喜欢Flex默认情况下 - 就像"如果我们在comp可见的地方,创建它,缓存它并在每次再次可见时重复使用它".

现在的问题是-这将是隐藏和显示的更适当的和有效的方式-通过addChild/ removeChild或肘节visible.

我看到它的方式是:

  • visible 快速而肮脏(在第一次测试时)
  • visible不会像Event.ADDED或那样创造一系列冒泡事件Event.REMOVED
  • 隐形组件不会获得鼠标事件

因此removeChild,当我确定,屏幕上不再需要该组件时(例如,缓存太大,我会调用)

stackoverflow'ers/AS3疯狂的人会怎么想?

更新:这是一个很好的阅读(忘了谷歌).

我会坚持visible; 它似乎更适合我的任务; 手册页上的"性能优化的Flash平台"由Adobe.69让我更有信心.

这是我为那些感兴趣的人测试的东西的代码片段:

package 
{
import flash.display.Sprite;
import flash.display.Stage;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.utils.getTimer;

/**
 * Simple benchmark to test alternatives for hiding and showing
 * DisplayObject.
 * 
 * Use:
 * <code>
 * new DisplayBM(stage);
 * </code> …
Run Code Online (Sandbox Code Playgroud)

flash user-interface actionscript-3

5
推荐指数
1
解决办法
2005
查看次数