【问题标题】:Is there any design pattern to execute same method differently based on context of execution是否有任何设计模式可以根据执行上下文以不同方式执行相同的方法
【发布时间】:2016-01-15 23:18:16
【问题描述】:

我正在重构一些代码,我想要的是让该方法根据它正在执行的上下文执行额外的操作。

例如: 如果当前方法如下

public void func1() {

 /// Operation Set 1

 /// Operation Set 2
 // Operation Set 3
 // Operation Set 4

}

我希望它是这样的:

// After refactoring
punlic void func1() {

/// Operation Set 1

if( context == FULL || context == EXEC_REQUIRED )
{
   /// Operation Set 2

    if( context === EXEC_REQUIRED )
    {
       // Operation Set 3
       // Operation Set 4
    }
}

}

所以我只是想知道是否已经有任何设计模式?

目前我可以考虑2个解决方案

  1. 将上下文作为参数从调用者传递给方法,但如果我遵循这一点,那么我将不得不对调用堆栈中的所有函数进行更改,但这些函数可能不会使用此上下文。

  2. 将 ContextProvider 之类的东西定义为静态类。每当我们需要上下文信息时,请询问 ContextProvider。这里的问题是,应用程序是多线程的,所以静态似乎不是正确的想法。

如果您有任何解决方案,那将很有帮助。

【问题讨论】:

  • 根据single responsibility principle,您所描述的可能不是最好的主意(从干净代码的角度来看)。我会尝试一种多态方法(例如,strategy pattern)。
  • 我同意...但在我的情况下这是不可能的,因为一切实际上都发生在构造函数中(更准确地说是基础构造函数)。我提到的问题只是更简单的版本。所以我唯一的选择是以某种方式为这个构造函数提供上下文并使用 ifelse 逻辑。
  • 这个问题让我想起了State pattern

标签: design-patterns language-agnostic


【解决方案1】:

这对 主观性 来说听起来很重要,这几年来一直是 Smalltalk 社区(主要)研究工作的主题。我知道的最新版本是在PharoSubjectopia 中实现的(Daniel Langone。Subjectopia — Unifying Subjectivity。硕士论文,伯尔尼大学,2011 年 2 月)。几年前,我在 Squeak 也有 implemented Darderes 和 Prieto 模型。

主观性提供了一个框架,可以根据消息的发送者、接收者,甚至上下文,或这些因素的任何组合,甚至考虑优先级或力量,来确定可以选择哪些主观行为。

虽然对于您的目的来说可能是压倒性的,但在像主流语言这样的纯文本技术中实现这些方法可能会成为一项传奇任务,因为需要在真实对象环境中进行培训,并且大多数实现都提供了构建专用代码浏览器的工具和/或建议,这就是 Smalltalk 仍然闪耀的地方。

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 2019-11-25
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    相关资源
    最近更新 更多