• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

OOP - pętla w konstruktorze, czy to jest błąd?

VPS Starter Arubacloud
0 głosów
382 wizyt
pytanie zadane 20 września 2019 w JavaScript przez Falwack Początkujący (400 p.)

Pisząc jeden z projektów, naszła mnie w pewnej chwili myśl, czy tak jak zrobiłem jest dobrze i czy może tak być. Otóż potrzebowałem zrobić listenery na poszczególne kolumny tabeli stworzonej w html. Na początku kombinowałem inaczej, próbowałem te listenery dodawać do metod odpowiedzialnych za to co dzieje się przy klikaniu w przycisk, ale to mi się "dublowało" (za każdym kliknięciem w przycisk wywoływało się n + ilosc_klikniec razy). W końcu uznałem, że stworzę takie coś: 

    constructor() {
        for (let i = 0; i < this.table.firstColumnLength; i++) {
            this.table.firstColumn[i].addEventListener("click", this.x.bind(this, i));
            this.table.secondColumn[i].addEventListener("click", this.x.bind(this, i));
        }
    }

 

Uprościłem trochę ten kod na rzecz wpisania go tutaj - nie ma potrzeby wstawiania całych 40 linijek z konstruktora kiedy pytanie dotyczy raptem trzech. W konstruktorze oczywiście mam deklaracje innych zmiennych, pobieranie elementów oraz tworzenie instancji klas.

I gdy stworzyłem już taki zapis w konstruktorze zacząłem się zastanawiać - czy ja nie podważam jakichś zasad OOP? Czy w ogóle jest coś takiego? 
Więc moje pytanie brzmi - czy taki zapis w konstruktorze, czyli pętla for a w niej takie odwołanie i stworzenie listenerów - jest błędem, czy nie? Czy tak wolno/można pisać, czy trzeba to rozbić jakoś inaczej?

Podejrzewam, iż jest to raczej błahy problem, jednak lekka niepewność w mojej głowie zaistniała i po prostu chciałbym ją rozwiać.

 

1 odpowiedź

+2 głosów
odpowiedź 20 września 2019 przez Comandeer Guru (599,730 p.)

Hmm, bardziej bym się zastanowił, czemu Twój konstruktor ma aż 40 linii? Konstruktor powinien być jak najmniejszy i robić to, czego się po nim oczekuje: tworzyć obiekt. Jeśli istnieje jakaś logika, która musi być wykonana przy tworzeniu obiektu, to można to wyrzucić do zewnętrznych metod, które będą po prostu odpalane w konstruktorze (np. bindListeners lub podobna w tym wypadku). Tym sposobem całość będzie ładna, a konstruktor pozostanie mały i zgrabny.

Inna rzecz, że tutaj chyba o wiele lepiej będzie po prostu zastosować event delegation i przypiąć jeden listener, bezpośrednio na this.table.

komentarz 20 września 2019 przez Falwack Początkujący (400 p.)
Tylko ze this.table jest instancja klasy Table, w której mam pobrane te dwa elementy, czyli firstColumn i secondColumn - stąd dwa listenery.

Jeśli chodzi o długość konstruktora - mam tam stworzone zmienne których używam w dalszych metodach - pobrane elementy z html, inne zmienne i instancje klas. Stąd taki duży ten konstruktor. Powinienem to zmienić? Wyrzucić pobieranie elementów i tworzenie zmiennych do oddzielnej metody?
komentarz 20 września 2019 przez Comandeer Guru (599,730 p.)

Tylko ze this.table jest instancja klasy Table, w której mam pobrane te dwa elementy, czyli firstColumn i secondColumn - stąd dwa listenery.

A czemu ta klasa nie wystawia metody typu on, która pozwoliłaby to ładnie podpiąć wewnątrz instancji Table? Nie widzę sensu, żeby takie operacje były wykonywane wewnątrz konstruktora innej klasy.

 Powinienem to zmienić? Wyrzucić pobieranie elementów i tworzenie zmiennych do oddzielnej metody?

IMO tak. 

komentarz 20 września 2019 przez Falwack Początkujący (400 p.)

A czemu ta klasa nie wystawia metody typu on, która pozwoliłaby to ładnie podpiąć wewnątrz instancji Table? Nie widzę sensu, żeby takie operacje były wykonywane wewnątrz konstruktora innej klasy.

Ponieważ po wykonaniu kliknięcia, będzie się zmieniać coś, co jestem wstanie tylko zmienić w tej innej klasie i osobiście nie za bardzo wiem czym jest metoda typu on. Ogólnie to te pobieranie elementów firstColumn i secondColumn było zrobione z marszu w klasie Table na samym początku projektowania, ale potem pojawiły się problemy, których nie byłem w stanie w tej klasie rozwiązać, pomimo wielu godzin prób, dlatego ja i tak miałem zamiar pobieranie tych dwóch elementów przerzucić do klasy w której tworze te listenery - bo tam po prostu znalazłem rozwiązanie tego problemu. 

 

Ogólnie, dopisując: po tych listenerach będzie wywoływać się jedna z metod z klasy Table i dodatkowo będą wykonywane inne rzeczy z tej klasy, z której skopiowałem kod konstruktora. 

 

 Powinienem to zmienić? Wyrzucić pobieranie elementów i tworzenie zmiennych do oddzielnej metody?

IMO tak. 

Zatem zmieniam to, dziękuję za dobrą radę na przyszłość. Niestety gdziekolwiek bym spojrzał do projektu, czy też do jakichś poradników/kursów wszędzie takie rzeczy widziałem wrzucone do konstruktora. Zatem od dzisiaj idąc za Twoją radą, będę to robił w oddzielnych metodach. 

 

Podobne pytania

0 głosów
1 odpowiedź 172 wizyt
pytanie zadane 21 lipca 2019 w PHP przez niezalogowany
0 głosów
1 odpowiedź 205 wizyt
pytanie zadane 9 stycznia 2017 w C i C++ przez czujek22 Dyskutant (7,670 p.)
0 głosów
6 odpowiedzi 251 wizyt
pytanie zadane 23 marca 2016 w C# przez Vento Pasjonat (17,120 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...