首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将依赖关系传递给API的用户?

如何将依赖关系传递给API的用户?
EN

Software Engineering用户
提问于 2018-12-10 16:01:18
回答 6查看 191关注 0票数 1

我如何设计我的类及其方法,以便清楚地知道,在其他方法调用有用/有效之前,必须先进行某些方法调用?

代码语言:javascript
复制
Stage1 firstStage = StageProcessor( userOriginal )

Stage2 secondStage = firstStage.ApplyRequiredTransformationBeforeSecondStage()

UserResult result = StageProcessor( firstStage, secondStage )

我的方法是使用类型强制依赖关系。还有别的办法吗?

请重命名和重构本例中的所有内容,以使其更易读,并增加封装。

我想指出的是,ApplyRequiredTransformationBeforeSecondStage()方法需要在Stage1Stage2之间调用。但我可以把它移到一个额外的班级。

此外,UserResult实际上同时依赖于Stage1Stage2

EN

回答 6

Software Engineering用户

回答已采纳

发布于 2018-12-10 16:20:14

你可以做一些花哨的“流利”风格的界面。

代码语言:javascript
复制
public interface IProcess
{
    IStage2 = RunStage1(UserInput input);
}

public interface IStage2 
{
    IStage3 = RunStage3();
}

public interface IStage3 
{
    FinalResult FinalResult();
}

所以当用户将其放入他们的代码中时,他们会..。

代码语言:javascript
复制
var result = Process
        .RunStage1(myinput)
        .RunStage2()
        .RunStage3()
        .FinalResult();
票数 3
EN

Software Engineering用户

发布于 2018-12-10 18:56:25

您正在处理的事务的高级术语是时间耦合

我的方法是使用类型强制依赖关系。还有别的办法吗?

有很多方法可以做到这一点。

掩盖它们对对象状态或全局变量的依赖的方法通常会导致此问题。解决方案是使这些依赖关系显式化。

例如,你可能有

代码语言:javascript
复制
ProcessOne();
ProcessTwo();
ProcessThree();

唯一的暗示就是他们的名字。这就不那么理想了,因为它没有被强制执行,让我们不得不使用描述性不强的名字。

使它们的依赖关系显化的一种方法是将它们所需的状态作为参数。

代码语言:javascript
复制
ProcessThree(ProcessTwo(ProcessOne()));

这样就不可能叫他们扰乱秩序了。这在对象内部和函数语言中都是可行的。

对于将从外部访问的面向对象API,您可以使用最恰当的名称为内部领域专用语言 (iDSL)的API。这不应与允许通过返回this按任何顺序调用方法的其他fluent接口混淆。iDSLs (如Java 8流JOOQ )返回一个中间对象,该对象指示哪些方法现在是合法的。这就是你在谈论用类型控制呼叫顺序时所暗示的。

返回中间类型和this可以混合形成一种复杂的语言,包含必需的和可选的步骤。但是,如果您使用的是一种提供带有默认参数的命名参数的语言,这可能是不必要的。几乎就像为了避开语言限制而大惊小怪。

票数 3
EN

Software Engineering用户

发布于 2018-12-10 16:33:41

类型是静态地强制执行约束的一种很好的方法,这就是您在这里要做的。因此,您编写它的方式让编译器完成了大部分工作,这是一种很好的方式。

另一种方法是调用单个对象上的方法,该对象内部更新了该对象上的状态机。如果一个特定的操作没有看到正确的状态,那么它将产生一个错误。

更糟糕的是,约束是在运行时而不是编译时检查的。如果您有一组特别复杂的约束,并且类型系统无法充分描述这些约束,那么它可能是一个有用的替代方案。但是,就我个人而言,我更喜欢可能的类型检查方法。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/382789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档