Skip to content

Extract Method

Sourcery refactoring id: extract-method

Description:

Extracts complex pieces of functions into their own methods

Requires Sourcery Pro

Before:

def func(self):
    if typed and self.current_char == "(":
        pos = self.pos
        try:
            pass
        except DefinitionError as exParamQual:
            self.pos = pos
            try:
                pass
            except DefinitionError as exNoPtrParen:
                self.pos = pos
                msg = "If parenthesis in noptr-declarator"
                if paramMode == "function":
                    msg += " (e.g., 'void (*f(int arg))(double)')"
                prevErrors.append((exNoPtrParen, msg))
                header = "Error in declarator"
                raise self._make_multi_error(prevErrors, header)

After:

def func(self):
    if typed and self.current_char == "(":
        pos = self.pos
        try:
            pass
        except DefinitionError as exParamQual:
            self.pos = pos
            try:
                pass
            except DefinitionError as exNoPtrParen:
                self._extracted_from_func_11(pos, exNoPtrParen)


def _extracted_from_func_11(self, pos, exNoPtrParen):
    self.pos = pos
    msg = "If parenthesis in noptr-declarator"
    if paramMode == "function":
        msg += " (e.g., 'void (*f(int arg))(double)')"
    prevErrors.append((exNoPtrParen, msg))
    header = "Error in declarator"
    raise self._make_multi_error(prevErrors, header)

Explanation:

Methods are much more readable if they are short, and if every line of code is at the same rough level of abstraction.

This refactoring takes long blocks from functions and extracts them into their own method. It will only trigger for large blocks that are possible to extract, and where the remainder of the method is sufficiently long.

It is recommended that you then rename the extracted function and any arguments that have not been automatically named. Here a suitable method name would be handle_noptr_exception.