Files
Comfyui-LayerForge/js/REFACTORING_GUIDE.md
Dariusz L 1bb4909438 Remove CanvasState delegating methods from Canvas
Removed delegating methods to CanvasState from Canvas.js and updated all references to use canvas.canvasState directly for state operations (undo, redo, saveStateToDB). Updated CanvasInteractions.js, CanvasIO.js, CanvasLayers.js, and CanvasView.js accordingly. Updated REFACTORING_GUIDE.md to reflect the completion of this refactor.
2025-06-29 14:11:34 +02:00

8.3 KiB

Przewodnik refaktoryzacji Canvas

Podsumowanie wykonanych prac

Przeprowadzono kompleksową refaktoryzację klasy Canvas oraz powiązanych plików w celu poprawy architektury i zastosowania wzorca fasady.

Zmiany w architekturze

1. Wzorzec Fasady w Canvas.js

Klasa Canvas została przekształcona w prawdziwą fasadę:

Struktura przed refaktoryzacją:

  • ✗ Dziesiątki metod delegujących (copySelectedLayers() { return this.canvasLayers.copySelectedLayers(); })
  • ✗ Canvas jako pośrednik dla wszystkich operacji
  • ✗ Trudność w utrzymaniu kodu

Struktura po refaktoryzacji:

  • Główne operacje fasady: loadInitialState(), saveState(), render(), addLayer()
  • Publiczne moduły: canvas.canvasLayers, canvas.canvasInteractions, canvas.canvasIO, canvas.canvasState
  • Metody delegujące: Zachowane dla kompatybilności, wyraźnie oznaczone jako tymczasowe

2. Nowa struktura Canvas.js

Canvas/
├── Konstruktor i inicjalizacja
│   ├── _initializeModules()
│   └── _setupCanvas()
├── Główne operacje fasady
│   ├── loadInitialState()
│   ├── saveState()
│   ├── render()
│   └── addLayer()
├── Operacje na masce
│   └── startMaskEditor()
├── Metody pomocnicze
│   ├── getMouseWorldCoordinates()
│   ├── updateHistoryButtons()
│   └── incrementOperationCount()
└── Metody delegujące (tymczasowe)
    └── [zachowane dla kompatybilności]

3. Aktualizacja CanvasView.js

Główny interfejs użytkownika został zaktualizowany aby używać nowego podejścia:

Przykłady zmian:

// PRZED
onclick: () => canvas.mirrorHorizontal()

// PO  
onclick: () => canvas.canvasLayers.mirrorHorizontal()

// PRZED
const imageData = await canvas.getLayerImageData(selectedLayer);

// PO
const imageData = await canvas.canvasLayers.getLayerImageData(selectedLayer);

Mapowanie modułów

Moduł Odpowiedzialność Przykładowe metody
canvasLayers Operacje na warstwach copySelectedLayers(), moveLayerUp(), mirrorHorizontal()
canvasInteractions Obsługa interakcji handleMouseMove(), handleKeyDown()
canvasIO Operacje wejścia/wyjścia importLatestImage(), sendDataViaWebSocket()
canvasState Zarządzanie stanem saveStateToDB(), undo(), redo()
canvasRenderer Renderowanie render() (wywoływane przez fasadę)
maskTool Narzędzie masek activate(), setBrushSize()
imageReferenceManager Zarządzanie pamięcią manualGarbageCollection()

Instrukcje migracji

Stare podejście (przestarzałe)

// Bezpośrednie wywołanie metod delegujących
canvas.copySelectedLayers(); 
canvas.handleMouseMove(e);
canvas.getLayerImageData(layer);

Nowe podejście (zalecane)

// Dostęp bezpośrednio do modułów
canvas.canvasLayers.copySelectedLayers(); 
canvas.canvasInteractions.handleMouseMove(e);
canvas.canvasLayers.getLayerImageData(layer);

// Lub użycie głównych operacji fasady
canvas.render();
canvas.saveState();
canvas.addLayer(image);

Zasady wyboru podejścia

  1. Główne operacje → Używaj fasady (canvas.render(), canvas.saveState())
  2. Operacje specjalistyczne → Używaj modułów (canvas.canvasLayers.mirrorHorizontal())
  3. Częste operacje → Metody delegujące zostały zachowane dla kompatybilności

Korzyści refaktoryzacji

Przed refaktoryzacją:

  • 🔴 80+ metod delegujących w klasie Canvas
  • 🔴 Każda nowa funkcja wymagała aktualizacji fasady
  • 🔴 Trudne debugowanie i śledzenie przepływu danych
  • 🔴 Naruszenie zasady Single Responsibility

Po refaktoryzacji:

  • Czysta fasada z kluczowymi operacjami wysokiego poziomu
  • Modułowa architektura z jasnym podziałem odpowiedzialności
  • Łatwiejsze utrzymanie - zmiany w module nie wpływają na fasadę
  • Większa elastyczność - wybór między uproszczonym a szczegółowym interfejsem
  • Kompatybilność wsteczna - istniejący kod nadal działa

Status refaktoryzacji

Zakończone zadania

  1. Refaktoryzacja klasy Canvas - przekształcenie w prawdziwą fasadę
  2. Aktualizacja CanvasView.js - migracja do nowego podejścia
  3. Implementacja wzorca fasady - główne operacje wysokiego poziomu
  4. Zachowanie kompatybilności - metody delegujące dla istniejącego kodu

📋 Zmiany w CanvasView.js

Wszystkie wywołania zostały zaktualizowane zgodnie z nowym podejściem:

// Operacje I/O
canvas.canvasIO.importLatestImage()
canvas.canvasLayers.handlePaste(addMode)

// Operacje na warstwach
canvas.canvasLayers.moveLayerUp()
canvas.canvasLayers.moveLayerDown()
canvas.canvasLayers.mirrorHorizontal()
canvas.canvasLayers.mirrorVertical()
canvas.canvasLayers.getLayerImageData(selectedLayer)

// Garbage Collection
canvas.imageReferenceManager.getStats()
canvas.imageReferenceManager.manualGarbageCollection()

🎯 Kolejne kroki

  1. Monitorowanie działania - sprawdzenie czy wszystkie funkcje działają poprawnie
  2. Usunięcie metod delegujących do CanvasState - zakończone
  3. Rozszerzenie dokumentacji - dla poszczególnych modułów
  4. Dodanie testów jednostkowych - dla modułów

🔧 Ostatnie poprawki (2025-06-29)

  1. Dodano brakujące metody w CanvasLayers.js

    • resizeLayer(scale) - zmienia rozmiar wybranych warstw
    • rotateLayer(angle) - obraca wybrane warstwy
    • Poprawiono delegację z Canvas.js do CanvasLayers.js
  2. Weryfikacja spójności

    • Wszystkie delegacje w Canvas.js wskazują na istniejące metody w modułach
    • CanvasView.js używa nowego podejścia modułowego
    • Dokumentacja została zaktualizowana
  3. Finalne poprawki architektury

    • Poprawiono konstruktor CanvasLayers.js - zmieniono mylącą nazwę parametru z canvasLayers na canvas
    • Zaktualizowano wszystkie odwołania this.canvasLayers. na this.canvas. w CanvasLayers.js
    • Poprawiono wywołania w CanvasView.js - canvas.rotateLayer()canvas.canvasLayers.rotateLayer()
    • Wszystkie moduły używają teraz spójnej konwencji nazewnictwa
  4. Usunięcie metod delegujących do CanvasState

    • Usunięto metodę delegującą saveStateToDB() z Canvas.js
    • Zaktualizowano wszystkie wywołania w CanvasView.js: canvas.undo()canvas.canvasState.undo()
    • Zaktualizowano wszystkie wywołania w CanvasInteractions.js dla operacji undo/redo i copy/paste
    • Zaktualizowano wywołania w CanvasLayers.js i CanvasIO.js
    • Wszystkie operacje na stanie używają teraz bezpośrednio modułu canvasState

Uwagi dla deweloperów

  • Refaktoryzacja zakończona - wszystkie pliki zostały zaktualizowane
  • Nowy kod używa modułów bezpośrednio zgodnie z wzorcem fasady
  • Wszystkie delegacje wskazują na istniejące metody w modułach
  • Spójna architektura - wszystkie moduły używają poprawnych referencji
  • ⚠️ Metody delegujące są zachowane dla kompatybilności, ale oznaczone jako tymczasowe
  • 📚 Dokumentacja została zaktualizowana w tym przewodniku
  • 🔄 Kompatybilność z istniejącym kodem jest zachowana

Refaktoryzacja została zakończona pomyślnie! System jest gotowy do dalszego rozwoju z lepszą architekturą opartą na wzorcu fasady.

📋 Mapowanie kompletnych funkcjonalności

Funkcjonalność Moduł Metoda Status
Dodawanie warstw canvasLayers addLayerWithImage()
Kopiowanie/wklejanie canvasLayers copySelectedLayers(), handlePaste()
Przesuwanie warstw canvasLayers moveLayerUp(), moveLayerDown()
Transformacje canvasLayers resizeLayer(), rotateLayer()
Odbicia lustrzane canvasLayers mirrorHorizontal(), mirrorVertical()
Obsługa interakcji canvasInteractions handleMouseMove(), handleKeyDown()
Zarządzanie stanem canvasState saveState(), undo(), redo()
Operacje I/O canvasIO importLatestImage(), sendDataViaWebSocket()
Renderowanie canvasRenderer render()
Zarządzanie pamięcią imageReferenceManager manualGarbageCollection()