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

模块化:是否使用接口?

  •  4
  • Patrick  · 技术社区  · 14 年前

    从几年前开始,常识似乎就规定,最好是针对接口编程,而不是针对实现编程。对于高级代码来说,这看起来确实是合乎逻辑的,例如,如果我的应用程序中有一个复杂的解算器,那么最好是这样:

    ISolver *solver = solverFactory.getSolver();
    solver->solve(inputdata);
    

    Solver solver;
    solver.solve(inputdata);
    

    但我的问题是:在哪个层次上使用界面不再有意义了。例如,如果我的应用程序中有一个ComplexNumber类(或String类,或其他类),那么写下:

    IComplexNumber *complexNumber = complexNumberFactory.create(1,2);   // 1+2i
    

    似乎比写作要复杂得多(尤其是在表现方面):

    ComplexNumber complexNumber(1,2);   // 1+2i
    

    那么,在决定是否应该将某个内容放在接口后面以及何时不应该将其放在接口后面时,哪些元素是重要的呢?

    3 回复  |  直到 14 年前
        1
  •  3
  •   Michael Anderson    14 年前

    移动到接口的原因是当它使事情变得更简单或减少耦合时。(这就是接口的用途)。

    但不要认为你需要用一种方式做每件事,也不要认为你的决定是一成不变的。使用一个接口进行转换非常容易。

        2
  •  1
  •   WW.    14 年前

    如果根据类所扮演的角色将类分为“服务”类和“价值”类,那么答案很简单。只在服务类上使用接口。在您的问题中,“solver”是一个服务,“复数”是一个值。

    使用new()创建值类应该很容易,因为它们只接受构造函数中的基本类型和其他值类。值类对模拟没有用处,因为您可以使用真实的对象。

        3
  •  -2
  •   mmmmmm    14 年前