小编Dav*_*uth的帖子

使用SplObjectStorage序列化对象树时出错

我使用SplObjectStorage实现了一个简单的Composite模式,就像上面的例子一样:

class Node
{
    private $parent = null;

    public function setParent(Composite $parent)
    {
        $this->parent = $parent;
    }
}

class Composite extends Node
{
    private $children;

    public function __construct()
    {
        $this->children = new SplObjectStorage;
    }

    public function add(Node $node)
    {
        $this->children->attach($node);
        $node->setParent($this);
    }
}
Run Code Online (Sandbox Code Playgroud)

每当我尝试序列化一个Composite对象时,PHP 5.3.2就会抛出一个Segmentation Fault.只有在向对象添加任意类型的任意数量的节点时才会发生这种情况.

这是违规的代码:

$node = new Node;
$composite = new Composite;
$composite->add($node);
echo serialize($composite);
Run Code Online (Sandbox Code Playgroud)

虽然这个有效:

$node = new Node;
$composite = new Composite;
echo serialize($composite);
Run Code Online (Sandbox Code Playgroud)

另外,如果我使用array()而不是SplObjectStorage实现Composite模式,那么所有运行也都可以.

我做错了什么?

php spl serialization composite segmentation-fault

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

代理模式和适配器模式之间的差异?

似乎Proxy和Adapter模式之间有相似之处?

任何人都可以解释一下有什么区别吗?为什么我们要求他们两个?在哪些问题中我们应该只使用代理而不是另一个.net示例?

谢谢

.net design-patterns adapter proxy-pattern

5
推荐指数
2
解决办法
5757
查看次数

排除teamcity工件中的文件类型

我正准备第一次自己设置teamcity.我不得不说,在很多方面非常好看和简单.但是,我有一个问题,我无法解决并找到任何相关信息.

当我想发布我的工件时,我想要排除一些文件类型.

例:

%system.agent.work.dir%\trunk\Source\Projects\Webproject.Web/Controllers => Webproject.Web/Controllers
Run Code Online (Sandbox Code Playgroud)

但是,我不想复制文件夹中的所有.cs文件.我只需要文件夹.是否可以只复制文件夹而不是内容,然后复制我需要的内容?或者,如果我复制目录,我可以排除文件吗?

teamcity teamcity-5.1

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

状态设计模式用户界面

我正在学习国家设计模式.我正在使用C#ASP.Net(不确定语言是否相关).

基本上,我的对象有状态A,B和C,也行动不同状态之间移动:ActionAToB,ActionBtoAActionAtoC.

我想要做的是将这个对象绑定到一个屏幕,并让按钮触发这些操作,但问题是:我如何只显示与对象所处状态相关的按钮,并在状态时显示/隐藏按钮变化?

我正在寻找一个优雅的解决方案,与状态模式,或任何建议,使UI易于维护.

c# asp.net user-interface state design-patterns

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

虚拟模板方法有意义吗?

假设这样的结构:

class Interface
{
public:
   template <typename T>
   virtual void reportOperationError(T code , std::string message) = 0;
};
Run Code Online (Sandbox Code Playgroud)

我不明白这个东西的用例,在这种情况下它是有用的,怎么样?

万一你想知道,我没有在任何地方看到这个代码,只是想了解这是否有一些特殊用途

c++ abstract-class virtual-functions

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

具有特定于实现的参数类型的模板方法模式

当我想使用模板方法模式时,我经常遇到这种情况,但模板方法需要不同类型的参数,如下所示:

public abstract class AbstractFoo  {

    public void process(TypeA a, TypeB b) {

     //do common processing
        if (b == null) {
          doProcess(a);
        } else if(a == null) {
          doProcess(b);
        }
    }

    public abstract void doProcess(TypeA a);
    public abstract void doProcess(TypeB b);
}
Run Code Online (Sandbox Code Playgroud)

这看起来不太好。提供的参数之一必须为 null,并且所有服务都必须为其他类型实现虚拟 doProcess 方法。有没有更好的模式呢?你如何处理这个问题?我不想使用构造函数,因为这些服务是 spring bean。同样的问题也适用于策略模式。

java design-patterns template-method-pattern

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

"开放/封闭原则"和"依赖性倒置原则"之间有什么区别?

我读过有关SOLID的文章但我没有看到OCP和DIP之间有任何区别.看看这个OCP的例子:

http://www.oodesign.com/open-close-principle.html
Run Code Online (Sandbox Code Playgroud)

持有OCP的代码也满足DIP.任何人都可以给我一个持有OCP但不是DIP的代码示例吗?

oop design-patterns open-closed-principle solid-principles dependency-inversion

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

桥模式 - Java编译的好处?

设计模式 - 可重用面向对象软件的元素书中说:

在只有一个实现(一对一)的情况下,创建一个抽象的实现者类是没有必要的.这是桥模式的退化情况; Abstraction和Implementor之间存在一对一的关系.然而,当类的实现中的更改不得影响其现有客户端时,这种分离仍然有用 - 即它们不应该被重新编译,只需重新链接.

我对编译时间的好处表示怀疑,因为我无法想象Java中的一个案例,即实现中的更改会重新编译其超类(在本例中为abstract).

例如,如果我们有X扩展Y并且客户端执行:

Y y = new X();  
Run Code Online (Sandbox Code Playgroud)

X中的更改并不意味着重新编译Y(当然,如果我们不想更改X的方法签名)

使用Bridge Pattern时完全相同:

YAbstraction yabstraction = new YRefinedAbstraction(new XImplementor());
Run Code Online (Sandbox Code Playgroud)

XImplementor中的更改并不意味着重新编译YAbstraction.

因此,根据我的说法,这种好处不会发生在Java中,并且需要一对一=>无桥模式.

也许子类强制超类的更改要在其他语言中重新编译?喜欢SmallTalk和C++?

你有什么看法?

java design-patterns bridge compilation

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

使用Github的正确VCS用户名设置是什么,以便"我的更改"正常工作?

我有一个TeamCity持续构建过程设置为个人GitHub项目运作良好.但是,在TeamCity中,我想在"我的更改"(http://teamcity/changes.html)下看到一个提交列表.

在"VCS用户名设置"(http://teamcity/vcsSettings.html)下,我将用户名设置为"benpowell"以匹配我的Github帐户,因为您可以看到所有提交都以该名称记录.但是,"我的更改"下没有记录任何提交.

有什么想法吗?

teamcity continuous-integration github

5
推荐指数
2
解决办法
4820
查看次数

如何从构建步骤永久更改TeamCity 6中的系统属性

我找到了一种在TeamCity中更改属性的方法:

##teamcity[setParameter name='ddd' value='fff']
Run Code Online (Sandbox Code Playgroud)

但不幸的是,这种变化只发生在当前版本中.我希望此更改为PERMANENT,但TeamCity仅针对当前正在运行的构建更改此更改.

如何对TeamCity中的系统属性进行永久性更改?

teamcity teamcity-6

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