代码之家  ›  专栏  ›  技术社区  ›  Paralife

类结构模式问题。我应该选择什么?

  •  6
  • Paralife  · 技术社区  · 16 年前

    什么是(如果有的话)隐含的假设或限制以及设计的差异,比如:

    A):

    class SampleClass1
    {
        IWorker workerA;
        IWorker workerB;
    
        void setWorkerA(IWorker w);
        void setWorkerB(IWorker w);
        WorkResult doWork();
    }
    

    B):

    class SampleClass2
    {
        WorkResult doWork(IWorker workerA, IWorker workerB);
    }
    

    我知道这取决于具体的项目,但是如果上面的类是一个小框架的一部分呢?第一个类能够更自然地保持状态和分离步骤,但第二个类确保与外部调用程序的“实时通信”更自然,因为每次调用dowork()时都会传递worker。

    是否有任何推荐的用法或通用实践指导上述两种方法之间的选择?谢谢。

    8 回复  |  直到 16 年前
        1
  •  5
  •   Garth Gilmour    16 年前

    在选项(a)中,您正在创建所谓的函数对象或函数,这是一个设计模式,即 well documented .

    两个主要优势是:

    • 工人可以在一个地方设置,然后在其他地方使用对象。
    • 对象可以在调用之间保留状态

    另外,如果您使用的是依赖注入框架(Spring、Guice等),那么函数可以在需要时自动初始化和注入。

    函数对象在库中广泛使用,例如C++标准模板库

        2
  •  6
  •   scubabbl    16 年前

    样本集1

    • 我可能需要在工作间隙保持工人的状态
    • 我可能需要有能力单独安排工人。(用1和2做嫁接,然后用2和3做嫁接)
    • 我想维护工人,因为可能会期望同一个工人做几次家务。
    • 我不是实用类的。我的一个例子很重要。

    样本集2

    • 给我两个工人,我就和他们一起工作。
    • 我不在乎他们是谁,也不想维护他们。
    • 保持工人之间的任何配对都是别人的工作。
    • 我可能更像是一个实用类。也许我可以保持静止。
        3
  •  2
  •   Andy Balaam    16 年前

    另一种选择是案例A的变体,如下所示:

    class SampleClass3
    {
        SampleClass3( IWorker workerA, IWorker workerB );
        WorkResult doWork();
    }
    

    优势:

    • 很难使物体有缺陷,因为你需要提供施工时所需的所有工人(与案例A相反)。

    • 您仍然可以在sampleclass3和/或其中一个工人中携带状态。(这种情况在B种情况下是不可能的。)

    缺点:

    • 在构建sampleclass3之前,您必须准备好所有的工人,而不是稍后提供他们。当然,您也可以提供setter,以便以后更改它们。
        4
  •  1
  •   Jon Limjap    16 年前

    如果有多个方法依赖于iWorker A和iWorker B,我就说是do sample A。

    如果只有doWork()同时使用iWorker A和iWorker B,则执行示例B。

    另外,你的样品班的真正目的是什么?DoWork看起来有点像实用方法mroe。

        5
  •  1
  •   Thorsten79    16 年前

    a)是一个糟糕的设计,因为它允许对象有缺陷(可能未设置一个或两个工人类)。

    b)可以是好的。如果不依赖于sampleClass2的内部状态,则将其设为静态

        6
  •  0
  •   Richard Walton    16 年前

    另一种选择:

    工人阶级:

    静态工作结果工单(工单A、工单B);

        7
  •  0
  •   aku    16 年前

    IMO第二种方法看起来更好,它要求调用者使用更少的代码来执行任务。第二种方法不太容易出错,调用者不必担心对象可能没有完全初始化。

        8
  •  0
  •   Konrad Rudolph    16 年前

    不如定义一个 WorkDelegate (或者具有单一接口的接口 doWork 方法而不带参数)只返回 WorkResult 让各个类决定如何实现它?这样,你就不会局限于过早的决定。