Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony2][OOP][MVC] Miejsce dla Parsera CSV
daniel1302
post 20.11.2016, 21:59:32
Post #1





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

Ostrzeżenie: (0%)
-----


Mam taki przypadek:
Mam moduł który działa tak:
Użytkownik(redaktor) importuje plik CSV z danymi głównie liczbowymi.
Z pliku czyta jeden moduł który dodaje te dane cache, żeby nie parsować za każdym razem, Jako cache mam: BD sql albo Redisa, nie ważne.

Skłaniam się do pierwszego rozwiązania, ponieważ nowe dane są wgrywane raz na miesiąc i je nadpisuje.

Mam 5 rodzajów plików CSV, i zrobiłem to tak jak na diagramie(https://www.draw.io/i/jskflDS) i w kontrolerze wywołuję:
  1. ...
  2. $form = $this->createCsvUploadForm();
  3. $form->handleRequest($request);
  4. $this->validateFormSubmit();
  5. $newFilePath = $this->moveUploadedData($form->get('file')->getData());
  6. $csvFile = $this->getCsvFileObject($newFilePath);
  7.  
  8. $csvType = $this->getType($cvFile);
  9. $parser = $this->getCsvParser($csvType);
  10. try {
  11. $parser->validate();
  12. } catch (UserMessageException $e) {
  13. $this->addMessage($e->getMessage, self::MESSAGE_ERROR);
  14. $this->redirect(...);
  15. return;
  16. }
  17. $parser->parse();
  18. $this->cacheData($parser);


...

Teraz mam 3 pytania:
1) Pierwsze pytanie dotyczy, gdzie umieścilibyście te klasy do obsługi pliku CSV, ja dodałem je do modelu, czy utworzylibyście serwis? Wg mnie jest to obsługa logiki biznesowej, ale mogę się mylić.
Klasa CsvFile jest wykorzystywana w kilku miejscach do generowania plików CSV z tablicy i odwrotnie.
Klasy Parserów są wykorzystywane tylko tutaj. Dane exportujemy z programu i jest to jakiś rodzaj API do importu do innej aplikacji.

2) Jeśli coś jest nie tak, tzn jakiś wiersz jest niepoprawny, jakiś email zły, liczby są niepoprawne to metoda Parser::validate() rzuca wyjątek z informacją co jest nie tak. Nie miałem pomysłu jak to rozwiązać, myślałem nad zwróceniem tablicy z błędami, ale wg mnie chyba lepiej wykorzystać wyjątek, bo jest to jakiś rodzaj sytuacji wyjątkowej... Jak wy byście to zrobili?

3) Przed refaktoryzacją kodu akcji - kod miał około 250 lini, czy lepiej zostawić if'y w akcji np tak:
  1. if ($request->isMethod('POST')) {
  2. $form->submit($request->request->get($form->getName()));
  3.  
  4. if ($form->isSubmitted() && $form->isValid()) {
  5. // perform some action...
  6.  
  7. return $this->redirectToRoute('task_success');
  8. }
  9. }


czy rozbić to na metody takie jak zrobiłem, bez zagnieżdżeń? Gdzie jest granica, jak bardzo rozbijać funkcje?
Przyznam, że czasem zdarzy mi się napisać jednolinikowce: takie jak:
  1. private function isOpened() {
  2. return $this.status === self::STATUS_OPENED;
  3. }


Czasem dochodzi tez do sytuacji, że klasa ma po 20/30 metod prywatnych, często krótkich, które są używane w 4/5 metodach publicznych. Co wy robicie w takich przypadkach?
Go to the top of the page
+Quote Post
Pilsener
post 22.11.2016, 08:24:34
Post #2





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


1. Do wszystkiego najlepiej tworzyć serwisy, gdyż klasy takie jak encje czy repozytoria są z reguły mocno wyspecjalizowane. I co rozumiesz przez "model"?
2. Sterowanie workflowem aplikacji przy pomocy wyjątków to kiepski pomysł. Wyjątki są po to, żeby wygodnie i w jednym miejscu obsłużyć wszystko to, czego nie chcemy obsługiwać lub nie przewidzieliśmy. Czemu nie standardowy walidator, który zwraca tablicę błędów?
3. Nie ma to większego znaczenia, ważne, żeby kod był dobrze zorganizowany, udokumentowany, łatwy do zrozumienia itp. itd. etc.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 27.04.2024 - 04:04