suchen
HeimBackend-EntwicklungPython-TutorialPython: Refactoring zu Mustern

Python: Refactoring to Patterns

Foto von Patric Ho

Diese prägnante Anleitung ordnet Python-Code-Smells den entsprechenden Design-Pattern-Lösungen zu.

class CodeSmellSolutions:
    DUPLICATED_CODE = [
        "form_template_method",
        "introduce_polymorphic_creation_with_factory_method",
        "chain_constructors",
        "replace_one__many_distinctions_with_composite",
        "extract_composite",
        "unify_interfaces_with_adapter",
        "introduce_null_object",
    ]
    LONG_METHOD = [
        "compose_method",
        "move_accumulation_to_collecting_parameter",
        "replace_conditional_dispatcher_with_command",
        "move_accumulation_to_visitor",
        "replace_conditional_logic_with_strategy",
    ]
    CONDITIONAL_COMPLEXITY = [  # Complex conditional logic
        "replace_conditional_logic_with_strategy",
        "move_emblishment_to_decorator",
        "replace_state_altering_conditionals_with_state",
        "introduce_null_object",
    ]
    PRIMITIVE_OBSESSION = [
        "replace_type_code_with_class",
        "replace_state_altering_conditionals_with_state",
        "replace_conditional_logic_with_strategy",
        "replace_implict_tree_with_composite",
        "replace_implicit_language_with_interpreter",
        "move_emblishment_to_decorator",
        "encapsulate_composite_with_builder",
    ]
    INDECENT_EXPOSURE = [  # Lack of information hiding
        "encapsulate_classes_with_factory"
    ]
    SOLUTION_SPRAWL = [  # Scattered logic/responsibility
        "move_creation_knowledge_to_factory"
    ]
    ALTERNATIVE_CLASSES_WITH_DIFFERENT_INTERFACES = [  # Similar classes, different interfaces
        "unify_interfaces_with_adapter"
    ]
    LAZY_CLASS = [  # Insufficient functionality
        "inline_singleton"
    ]
    LARGE_CLASS = [
        "replace_conditional_dispatcher_with_command",
        "replace_state_altering_conditionals_with_state",
        "replace_implict_tree_with_composite",
    ]
    SWITCH_STATEMENTS = [  # Complex switch statements
        "replace_conditional_dispatcher_with_command",
        "move_accumulation_to_visitor",
    ]
    COMBINATION_EXPLOSION = [  # Similar code for varying data
        "replace_implicit_language_with_interpreter"
    ]
    ODDBALL_SOLUTIONS = [  # Multiple solutions for same problem
        "unify_interfaces_with_adapter"
    ]

Refactoring-Beispiele in Python

Dieses Projekt übersetzt Refactoring-Beispiele aus Refactoring to Patterns (Joshua Kerievsky) in Python. Jedes Beispiel zeigt Original- und überarbeiteten Code und hebt Verbesserungen hervor. Der Refactoring-Prozess umfasste die Interpretation von UML-Diagrammen und die Anpassung des Java-Codes an die Nuancen von Python (Verwaltung zyklischer Importe und Schnittstellen).

Beispiel: Compose-Methode

Das „Compose Method“-Refactoring vereinfacht komplexen Code durch Extrahieren kleinerer, aussagekräftigerer Methoden.

# Original (complex) code
def add(element):
    readonly = False
    size = 0
    elements = []
    if not readonly:
        new_size = size + 1
        if new_size > len(elements):
            new_elements = []
            for i in range(size):
                new_elements[i] = elements[i]  # Potential IndexError
            elements = new_elements
        size += 1
        elements[size] = element # Potential IndexError

# Refactored (simplified) code
def is_at_capacity(new_size, elements):
    return new_size > len(elements)

def grow_array(size, elements):
    new_elements = [elements[i] for i in range(size)] # List comprehension for clarity
    return new_elements

def add_element(elements, element, size):
    elements.append(element) # More Pythonic approach
    return len(elements) -1

def add_refactored(element):
    readonly = False
    if readonly:
        return
    size = len(elements)
    new_size = size + 1
    if is_at_capacity(new_size, elements):
        elements = grow_array(size, elements)
    size = add_element(elements, element, size)

Beispiel: Polymorphismus (Testautomatisierung)

Dieses Beispiel demonstriert Polymorphismus in der Testautomatisierung und abstrahiert den Testaufbau für die Wiederverwendbarkeit.

# Original code (duplicate setup)
class TestCase:
    pass

class DOMBuilder:
    def __init__(self, orders): pass
    def calc(self): return 42

class XMLBuilder:
    def __init__(self, orders): pass
    def calc(self): return 42

class DOMTest(TestCase):
    def run_dom_test(self):
        expected = 42
        builder = DOMBuilder("orders")
        assert builder.calc() == expected

class XMLTest(TestCase):
    def run_xml_test(self):
        expected = 42
        builder = XMLBuilder("orders")
        assert builder.calc() == expected

# Refactored code (polymorphic setup)
class OutputBuilder:
    def calc(self): raise NotImplementedError

class DOMBuilderRefac(OutputBuilder):
    def calc(self): return 42

class XMLBuilderRefac(OutputBuilder):
    def calc(self): return 42

class TestCaseRefac:
    def create_builder(self): raise NotImplementedError
    def run_test(self):
        expected = 42
        builder = self.create_builder()
        assert builder.calc() == expected

class DOMTestRefac(TestCaseRefac):
    def create_builder(self): return DOMBuilderRefac()

class XMLTestRefac(TestCaseRefac):
    def create_builder(self): return XMLBuilderRefac()

Beispiel: Besuchermuster

Das Besuchermuster entkoppelt Klassen von ihren Methoden.

# Original code (conditional logic in TextExtractor)
class Node: pass
class LinkTag(Node): pass
class Tag(Node): pass
class StringNode(Node): pass

class TextExtractor:
    def extract_text(self, nodes):
        result = []
        for node in nodes:
            if isinstance(node, StringNode): result.append("string")
            elif isinstance(node, LinkTag): result.append("linktag")
            elif isinstance(node, Tag): result.append("tag")
            else: result.append("other")
        return result

# Refactored code (using Visitor)
class NodeVisitor:
    def visit_link_tag(self, node): return "linktag"
    def visit_tag(self, node): return "tag"
    def visit_string_node(self, node): return "string"

class Node:
    def accept(self, visitor): pass

class LinkTagRefac(Node):
    def accept(self, visitor): return visitor.visit_link_tag(self)

class TagRefac(Node):
    def accept(self, visitor): return visitor.visit_tag(self)

class StringNodeRefac(Node):
    def accept(self, visitor): return visitor.visit_string_node(self)

class TextExtractorVisitor(NodeVisitor):
    def extract_text(self, nodes):
        result = [node.accept(self) for node in nodes]
        return result

Fazit

Dieser praktische, praktische Ansatz zum Erlernen von Designmustern durch Refactoring verbessert das Verständnis erheblich. Die Herausforderungen bei der Übersetzung des Codes festigen das theoretische Wissen.

Das obige ist der detaillierte Inhalt vonPython: Refactoring zu Mustern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Wie werden Arrays im wissenschaftlichen Computer mit Python verwendet?Wie werden Arrays im wissenschaftlichen Computer mit Python verwendet?Apr 25, 2025 am 12:28 AM

Arraysinpython, besondersvianumpy, arecrucialInScientificComputingFortheirefficience undvertilität.1) Sie haben festgelegt, dass die Fornerikerne, Datenanalyse und Machinelarning.2) Numpy'SimplementationIncensuresFasteroperationsdanpythonlisten.3) Araysensableableableableableableableableableableableableableableableableableableableableableableableableableable

Wie gehen Sie mit verschiedenen Python -Versionen im selben System um?Wie gehen Sie mit verschiedenen Python -Versionen im selben System um?Apr 25, 2025 am 12:24 AM

Sie können verschiedene Python -Versionen mithilfe von Pyenv, Venv und Anaconda verwalten. 1) Verwalten Sie PYENV, um mehrere Python -Versionen zu verwalten: Installieren Sie PyEnv, setzen Sie globale und lokale Versionen. 2) Verwenden Sie VenV, um eine virtuelle Umgebung zu erstellen, um Projektabhängigkeiten zu isolieren. 3) Verwenden Sie Anaconda, um Python -Versionen in Ihrem Datenwissenschaftsprojekt zu verwalten. 4) Halten Sie das System Python für Aufgaben auf Systemebene. Durch diese Tools und Strategien können Sie verschiedene Versionen von Python effektiv verwalten, um den reibungslosen Betrieb des Projekts zu gewährleisten.

Was sind einige Vorteile bei der Verwendung von Numpy -Arrays gegenüber Standard -Python -Arrays?Was sind einige Vorteile bei der Verwendung von Numpy -Arrays gegenüber Standard -Python -Arrays?Apr 25, 2025 am 12:21 AM

NumpyarrayShaveseveraladVantagesOverStandardPythonArrays: 1) SiearemuchfasterDuetoc-basiert, 2) sie istaremoremory-effizient, insbesondere mit mit LaShlargedatasets und 3) sie können sich mit vektorisierten Funktionsformathematical und Statistical opertical opertical opertical operticaloperation, Making

Wie wirkt sich die homogene Natur der Arrays auf die Leistung aus?Wie wirkt sich die homogene Natur der Arrays auf die Leistung aus?Apr 25, 2025 am 12:13 AM

Der Einfluss der Homogenität von Arrays auf die Leistung ist doppelt: 1) Homogenität ermöglicht es dem Compiler, den Speicherzugriff zu optimieren und die Leistung zu verbessern. 2) aber begrenzt die Typ -Vielfalt, was zu Ineffizienz führen kann. Kurz gesagt, die Auswahl der richtigen Datenstruktur ist entscheidend.

Was sind einige Best Practices für das Schreiben von ausführbaren Python -Skripten?Was sind einige Best Practices für das Schreiben von ausführbaren Python -Skripten?Apr 25, 2025 am 12:11 AM

TocraftexecutablePythonScripts, folge theseBestPractices: 1) addashebangline (#!/Usr/bin/envpython3) tomakethescriptexcutable.2 SetPermissions withchmod xyour_script.py.3) organisation -bithacleardocstringanduseInname == "__ __": FormAcleardocstringanduseInname

Wie unterscheiden sich Numpy Arrays von den Arrays, die mit dem Array -Modul erstellt wurden?Wie unterscheiden sich Numpy Arrays von den Arrays, die mit dem Array -Modul erstellt wurden?Apr 24, 2025 pm 03:53 PM

NumpyarraysarebetterFornumericaloperations und multi-dimensionaldata, whilethearraymoduleiStableforbasic, an Gedächtniseffizienten

Wie vergleichen sich die Verwendung von Numpy -Arrays mit der Verwendung der Array -Modularrays in Python?Wie vergleichen sich die Verwendung von Numpy -Arrays mit der Verwendung der Array -Modularrays in Python?Apr 24, 2025 pm 03:49 PM

NumpyarraysarebetterforeheavynumericalComputing, während der projectwithsimpledatatypes.1) numpyarraysoferversatility und -PerformanceForlargedataSets und Compoxexoperations.2) thearraysoferversStility und Mächnory-Effefef

Wie bezieht sich das CTypes -Modul auf Arrays in Python?Wie bezieht sich das CTypes -Modul auf Arrays in Python?Apr 24, 2025 pm 03:45 PM

ctypesallowscreatingandmanipulationsc-stylearraysinpython.1) usectypestoInterfaceWithClibraryForperformance.2) createCec-stylearraysFornumericalComputationen.3) PassarrayStocfunctionsFectionFicecher-Operationen.

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Sicherer Prüfungsbrowser

Sicherer Prüfungsbrowser

Safe Exam Browser ist eine sichere Browserumgebung für die sichere Teilnahme an Online-Prüfungen. Diese Software verwandelt jeden Computer in einen sicheren Arbeitsplatz. Es kontrolliert den Zugriff auf alle Dienstprogramme und verhindert, dass Schüler nicht autorisierte Ressourcen nutzen.

PHPStorm Mac-Version

PHPStorm Mac-Version

Das neueste (2018.2.1) professionelle, integrierte PHP-Entwicklungstool

MinGW – Minimalistisches GNU für Windows

MinGW – Minimalistisches GNU für Windows

Dieses Projekt wird derzeit auf osdn.net/projects/mingw migriert. Sie können uns dort weiterhin folgen. MinGW: Eine native Windows-Portierung der GNU Compiler Collection (GCC), frei verteilbare Importbibliotheken und Header-Dateien zum Erstellen nativer Windows-Anwendungen, einschließlich Erweiterungen der MSVC-Laufzeit zur Unterstützung der C99-Funktionalität. Die gesamte MinGW-Software kann auf 64-Bit-Windows-Plattformen ausgeführt werden.

MantisBT

MantisBT

Mantis ist ein einfach zu implementierendes webbasiertes Tool zur Fehlerverfolgung, das die Fehlerverfolgung von Produkten unterstützen soll. Es erfordert PHP, MySQL und einen Webserver. Schauen Sie sich unsere Demo- und Hosting-Services an.

VSCode Windows 64-Bit-Download

VSCode Windows 64-Bit-Download

Ein kostenloser und leistungsstarker IDE-Editor von Microsoft