在原始方法调用之后提取方法并插入调用

Posted

技术标签:

【中文标题】在原始方法调用之后提取方法并插入调用【英文标题】:Extract method and insert call after original method call 【发布时间】:2021-12-06 09:30:33 【问题描述】:

我正在使用 PyCharm,我正在尝试进行一些重构,但不知道如何以快速可靠的方式做到这一点。

我有一个方法做太多事情,我想将一部分提取到另一个方法中。提取的方法不应该在它被提取的方法中调用,而应该在调用方法中。

当前状态

class User():
  def doStuff(self):
    calculateA()
    calculateB()
    calculateC()

def callerA():
  # do other things before
  obj.doStuff()

def callerAA:
  # do other things before
  obj.doStuff()

#... and many more methods calling doStuff method

通缉

class User():
  def doStuff(self):
    calculateA()

  def doOtherStuff(self):
    calculateB()
    calculateC()

def callerA():
  obj.doStuff()
  obj.doOtherStuff()

def callerAA:
  obj.doStuff()
  obj.doOtherStuff()

#... and many more methods calling doStuff method and doOtherStuff

# Now I'll be able to create this new method only doing a subset of the original method
def aNewMethod:
   obj.doStuff()


这可能与 PyCharm 有关吗?一直在玩重构,没有任何运气。我想提取到方法中是很容易的部分,但是方法调用最终会出现在错误的位置。如果在 Intellij 中可以的话,我也有许可证,所以我可以切换。

【问题讨论】:

有一个快捷键 Cntrl+Alt+M 可以将选定部分提取为方法 @Kris 是的,但是方法调用将在 doStuff() 方法中结束,我需要在每次调用 doStuff() 之后进行 也许您可以使用搜索并将obj.doStuff() 替换为obj.doStuff()\nobj.doOtherStuff() @LouisSaglio 这是这个简单示例的好方法。实际上,有时调用是多行的,我无法让正则表达式正常工作。 【参考方案1】:

没有这样的选择。欢迎您在 https://youtrack.jetbrains.com/issues/PY 提交功能请求 有关如何使用 YouTrack 的信息:https://intellij-support.jetbrains.com/hc/en-us/articles/207241135-How-to-follow-YouTrack-issues-and-receive-notifications

【讨论】:

【参考方案2】:

第 1 步:将两个新方法提取到您的 User 类中

这个:

class User():
  def doStuff(self):
    calculateA()
    calculateB()
    calculateC()

变成:

class User():
  def doStuff(self):
    newMethodA()
    newMethodB()

  def newMethodA(self):
    calculateA()

  def newMethodB(self):
    calculateB()
    calculateC()

第 2 步:内联 doStuff 方法

class User():

  def newMethodA(self):
    calculateA()

  def newMethodB(self):
    calculateB()
    calculateC()

def callerA():
  newMethodA()
  newMethodB()

def callerAA():
  newMethodA()
  newMethodB()

第 3 步:重命名方法

【讨论】:

以上是关于在原始方法调用之后提取方法并插入调用的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js 打印原始 html 并调用组件方法

在运行时重定向 c 函数并调用原始函数

从 C/C++ 调用 python 方法,并提取其返回值

从 C/C++ 调用 python 方法,并提取其返回值

从 Gradle 构建脚本中提取常用方法

从通过反射调用的 COM 方法中检索原始错误号