我如何设计我的类及其方法,以便清楚地知道,在其他方法调用有用/有效之前,必须先进行某些方法调用?
Stage1 firstStage = StageProcessor( userOriginal )
Stage2 secondStage = firstStage.ApplyRequiredTransformationBeforeSecondStage()
UserResult result = StageProcessor( firstStage, secondStage )我的方法是使用类型强制依赖关系。还有别的办法吗?
请重命名和重构本例中的所有内容,以使其更易读,并增加封装。
我想指出的是,ApplyRequiredTransformationBeforeSecondStage()方法需要在Stage1和Stage2之间调用。但我可以把它移到一个额外的班级。
此外,UserResult实际上同时依赖于Stage1和Stage2。
发布于 2018-12-10 16:20:14
你可以做一些花哨的“流利”风格的界面。
public interface IProcess
{
IStage2 = RunStage1(UserInput input);
}
public interface IStage2
{
IStage3 = RunStage3();
}
public interface IStage3
{
FinalResult FinalResult();
}所以当用户将其放入他们的代码中时,他们会..。
var result = Process
.RunStage1(myinput)
.RunStage2()
.RunStage3()
.FinalResult();发布于 2018-12-10 18:56:25
您正在处理的事务的高级术语是时间耦合。
我的方法是使用类型强制依赖关系。还有别的办法吗?
有很多方法可以做到这一点。
掩盖它们对对象状态或全局变量的依赖的方法通常会导致此问题。解决方案是使这些依赖关系显式化。
例如,你可能有
ProcessOne();
ProcessTwo();
ProcessThree();唯一的暗示就是他们的名字。这就不那么理想了,因为它没有被强制执行,让我们不得不使用描述性不强的名字。
使它们的依赖关系显化的一种方法是将它们所需的状态作为参数。
ProcessThree(ProcessTwo(ProcessOne()));这样就不可能叫他们扰乱秩序了。这在对象内部和函数语言中都是可行的。
对于将从外部访问的面向对象API,您可以使用最恰当的名称为内部领域专用语言 (iDSL)的API。这不应与允许通过返回this按任何顺序调用方法的其他fluent接口混淆。iDSLs (如Java 8流和JOOQ )返回一个中间对象,该对象指示哪些方法现在是合法的。这就是你在谈论用类型控制呼叫顺序时所暗示的。
返回中间类型和this可以混合形成一种复杂的语言,包含必需的和可选的步骤。但是,如果您使用的是一种提供带有默认参数的命名参数的语言,这可能是不必要的。几乎就像为了避开语言限制而大惊小怪。
发布于 2018-12-10 16:33:41
类型是静态地强制执行约束的一种很好的方法,这就是您在这里要做的。因此,您编写它的方式让编译器完成了大部分工作,这是一种很好的方式。
另一种方法是调用单个对象上的方法,该对象内部更新了该对象上的状态机。如果一个特定的操作没有看到正确的状态,那么它将产生一个错误。
更糟糕的是,约束是在运行时而不是编译时检查的。如果您有一组特别复杂的约束,并且类型系统无法充分描述这些约束,那么它可能是一个有用的替代方案。但是,就我个人而言,我更喜欢可能的类型检查方法。
https://softwareengineering.stackexchange.com/questions/382789
复制相似问题