Files
Comfyui-LayerForge/js/REFACTORING_GUIDE.md
Dariusz L 22627b7532 Delegate layer resize and rotate to CanvasLayers
Moved the resizeLayer and rotateLayer logic from Canvas.js to CanvasLayers.js, improving modularity and consistency. Updated REFACTORING_GUIDE.md to reflect these changes and document the current architecture and status.
2025-06-29 13:47:08 +02:00

7.4 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 - w przyszłych wersjach (po okresie przejściowym)
  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

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
  • ⚠️ 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()