Files
Comfyui-LayerForge/js/REFACTORING_GUIDE.md
Dariusz L b4a662b036 Refactor CanvasView.js to use new Canvas facade modules
Updated all CanvasView.js method calls to use the new modular structure (canvasIO, canvasLayers, imageReferenceManager) as part of the Canvas facade refactor. Updated REFACTORING_GUIDE.md to reflect completed migration, document new usage patterns, and outline next steps. This improves code clarity and modularity while maintaining backward compatibility.
2025-06-29 13:42:52 +02:00

5.9 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

Uwagi dla deweloperów

  • Refaktoryzacja zakończona - wszystkie pliki zostały zaktualizowane
  • Nowy kod używa modułów bezpośrednio zgodnie z wzorcem fasady
  • ⚠️ 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.