Jak radzic sobie z ifologia + dlugimi warunkami + skomplikowalnoscia metody + zaleznosc parametrow

0

Czesc zastanawiam sie jak najlepiej usprawnic metode ktora jest dosc skomplikowana (zawiera taki mix jak podalem w tytule). Przyklad:

 const onClick = ({index}) => {
        const { prop1, prop2, prop3, } = SomeService.calc1(index);
        const value = SomeService.calc();
        const value2 = SomeService.cal2(index);
        const value3 = SomeService.cal3(index);
        const value4 = SomeService.cal4(index);
        const value5 = SomeService.cal5(index);
        const value6 = SomeService.cal6(index);
        const value7 = SomeService.cal7(index);

       const automations = {
         automation1: prop1 && prop2 === 'OK' && value7,
         automation2: value6  && prop2 === 'OK' && (prop1 || prop2 || prop3),
         automation3: value5 && value5  && value4  && ( (prop1 || prop2) && !prop3)
         // i zalozmy wiecej automatow ...
      }

      const runAutomation = Object.keys(automations ).some(x => automations [x])

     if (runAutomation) {
       const makeSomeThing({value})
     }
   
   const reset = resetAutomations({
     automation1:value6  && prop2 === 'OK' && (prop1 || prop2 || prop3),
     automation2: value5 && value5  && value4  && ( (prop1 || prop2) && !prop3),
    // i zalozmy wiecej ...
   })  
   
    resetAutomat({reset })

   if ( value) {
     makeSomeOnCb({some:true});
   } else {
    makeSomeOnCb({some:false});
   }

  if (value2) {
     makeSomeOnCb({some:false});
  } else {
     makeSomeOnCb({some:true});
   }

  if (value3) {
     makeSomeOnCb2({some:true});
  }
 }

Tak mniej wiecej wyglada ta funkcja, nie moge podac realnych danych bo to kod firmowy, ale mniej wiecej tak to wyglada. Ten kod moze sie wydluzac, jesli dojda nowe automaty np. i nowe resetowanie automatow. I tak troche to usprawnilem bo wczesniej nie bylo funkcji resetAutomations tylko byly kolejne ladowanei warunkow cos jak w automations ale i tak wydaje mi sie to zbyt dluga metoda przy onclick.

Najwiekszy problem jaki widze, to ze kazda czesc kodu, ktora mozna podzielic na pewne fragmenty jest zalezna od parametrow ktora wystepuja na gorze do obliczenia, jak pobierzemy index przy onclick i musialbym rowniez z nich korzystac przy kazdym obliczeniu powiedzmy tych 3 fragmentow, bo moglbym podzielic ten kod na 3 fragmenty zalozmy i musialbym do kazdych tych potencjalnych 3 funkcji wpychac te wszystkie parametry (a moze byc ich sporo), nie wiem czy jest to problem, ktorym powinienem sie martwic, ale tak to widze. Robienie kolejnych dodatkowych funkcji, tylko po to zeby latwiej sie czytalo ta metode tak naprawde, zeby nie byla taka wielka.

Nie wiem jak ugryzc takie ciezke metody. Ma ktos moze sprawdzone metody jak sobie radzic z takimi rzeczami ?

0

Nie za bardzo ogarniam co tu sie dzieje, ale może to Ci pomoże facade pattern

0

Bez jakis sensownych danych i wytłumaczenia zastosowania tej funkcji (i tego so robi SomeService) ciężko cokolwiek podpowiedzieć - funkcja z tyloma warunkami i zmiennymi może świadczyć o skopanej architekturze rozwiązania, niekoniecznie tylko o skopaniu samej funkcji. Z takimi szczątkowymi informacjami moge jedynie podpowiedzieć czysto techniczny szczegół:

zamiast:

if (value) {
  makeSomeOnCb({ some: true })
} else {
  makeSomeOnCb({ some:false })
}

wystarczy (jeśli value zawiera true / false):

makeSomeOnCb({ some: value })

lub (jeśli value zawiera cos innego):

makeSomeOnCb({ some: Boolean(value) })
0

Bez jakis sensownych danych i wytłumaczenia zastosowania tej funkcji (i tego so robi SomeService) ciężko cokolwiek podpowiedzieć - funkcja z tyloma warunkami i zmiennymi może świadczyć o skopanej architekturze rozwiązania, niekoniecznie tylko o skopaniu samej funkcji. Z takimi szczątkowymi informacjami moge jedynie podpowiedzieć czysto techniczny szczegół:

Ok, moze pokaze dokladniej jak to wyglada na czym to polega, bo troche tym przykladem wprowdzam w blad, bo nie chce pokazywac firmowego kodu, ale poprawie to teraz tak, zeby bylo to bardziej widac, dokladnie tak jak jest ukrywajac faktyczne zastosowanie.

1 ) To od poczatku. Mamy jakies zdarzenie onClick, ktore wywoluje dosc skomplikowana operacje. Do funkcji onClick jest przekazywany parametr (integer jako index czegos tam).
2 ) Mam serwis ktory rowniez przyjmuje parametr index, lub nie przyjmuje go wcale i robie pewne obliczenia (na tym indexie lub bez niego) - jest to potrzebne do warunkow dla pkt 3,4,5
3 ) Warunki dla automatow (nie wnikajac co to jest), po prostu potrzebuje pewnych outputow z serwisu
4 ) Resetowanie automatow (nie wnikajac co to jest) rowniez potrzeba tych samych outputow z serwisu
5 ) Callbacki do innego modulu znowuz potrzeba nam tych outputow z serwisu, bo nie zawsze ten callback do modulu bedzie wysylany

 const onClick = ({index}) => { // pkt. 1)
        /* pkt 2 ) */
        const { prop1, prop2, prop3, } = SomeService.calc1(index);
        const value = SomeService.calc();
        const value2 = SomeService.cal2(index);
        const value3 = SomeService.cal3(index);
        const value4 = SomeService.cal4(index);
        const value5 = SomeService.cal5(index);
        const value6 = SomeService.cal6(index);
        const value7 = SomeService.cal7(index);
        
      /* pkt 3 ) */
       const automations = {
         automation1: prop1 && prop2 === 'OK' && value7,
         automation2: value6  && prop2 === 'OK' && (prop1 || prop2 || prop3),
         automation3: value5 && value5  && value4  && ( (prop1 || prop2) && !prop3)
         // i zalozmy wiecej automatow ...
      }
 
      const runAutomation = Object.keys(automations ).some(x => automations [x])
 
     if (runAutomation) {
       const makeSomeThing({value})
     }
  
 /* pkt 4 */
   const reset = resetAutomations({
     automation1:value6  && prop2 === 'OK' && (prop1 || prop2 || prop3),
     automation2: value5 && value5  && value4  && ( (prop1 || prop2) && !prop3),
    // i zalozmy wiecej ...
   })  
 
    resetAutomat({reset })
 
   /* pkt 5 */
   if ( value) {
     makeSomeOnCb({index});
   } else {
    makeSomeOnCb2({index});
   }
 
  if (value2) {
     makeSomeOnCb3({index});
  } else {
     makeSomeOnCb4({index});
   }
 
  if (value3) {
     makeSomeOnCb5(false);
  }
 }

@Maciej Cąderek - od pkt 5), zle to napisalem, bo to nie jest odwolanie do tej samej funkcji, kazdy if to inny callback

Chcialem zastosowac do tej funkcji fasade, tak jak @Desu wspomnial, zeby automaty / resetowanie automatow / callbacki mialy dostep do tych samych danych, a jednoczesnie to podzielic.
Myslalem nawet nad tym, zeby do automatow zrobic osobny serwis. To nie jest dla mnie takie proste, bo potrzebuje tych zmiennych, tych warunkow i nie wiem jak to dobrze ulozyc.

Moze teraz bardziej do objasnilem.

0

Maciej, te warunki będą z uplywem czasu rosły, jak będzie więcej automatów. Samo zoptymalizowane warunków tylko to skróci ale metoda przy clicku i tak będzie kosmiczna A tego nie chce.

1 użytkowników online, w tym zalogowanych: 0, gości: 1