Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Side Effects Rule PSR-1 konflikty
Forum PHP.pl > Forum > PHP > Object-oriented programming
trzczy
Przedstawiam 2 kody, które są niezgodne z Side Effects Rule.
KOD1
  1. <?php
  2. require __DIR__ . '/vendor/autoload.php';
  3. $obj = new Johny\Foo\Bar();


KOD2
  1. <?php
  2. require __DIR__ . '/vendor/autoload.php';
  3. include 'addresses_for_mailing.php';
  4. $mailer = new Johny\Foo\Mailer($addresses);
  5. $mailer->send();
  6. $mailer->report();


Mam nadzieję, że mniej więcej widać, co programista chciał osiągnąć...

KOD1
Wczytuje autoloader i od razu z niego korzysta.

KOD2
Korzysta z klasy Mailer oraz spisu adresów zawartego w oddzielnym pliku. Potem wysyła mejle i sporządza raport z wysyłania.

I teraz moje pytanie. Jak zbudować te aplikacje, żeby były zgodne z PSR-1 Side Effects Rule. Czy da się zachowując odrębność plików, czyli bez umieszczenia wszystkiego w jednym pliku. Czy może programiści jednak nie przejmują się tą zasadą?

Z góry dziękuję
Comandeer
Ta zasada nie pozwala mieszać deklarowania (klas, funkcji, ustawień etc.) z wykonywaniem kodu.

Jeśli masz w pliku deklarację klasy, to nie powinno być tam żadnego include. Jeśli natomiast w danym pliku coś robisz, to… nie da się przecież nie zrobić include.

Zresztą to jest w pierwszym zdaniu tej zasady:
Cytat
A file SHOULD declare new symbols (classes, functions, constants, etc.) and cause no other side effects, or it SHOULD execute logic with side effects, but SHOULD NOT do both.


Kod wykonujący konkretne działania może mieć skutki uboczne. Kod deklarujący klasy, funkcje itd. – nie.
trzczy
W pytaniu chodzi o to, jak przerobić podane aplikacje, aby były zgodne z tą zasadą.
Comandeer
A w moim poście masz odpowiedź…
trzczy
Nie żartuj. Pytam jak uniknąć stosowania deklaracji i includowania w 1 pliku, a Ty odpowiadasz, że przez uniknięcie stosowania deklaracji i includowania w 1 pliku. Chodzi mi o przepisanie podanego kodu na poprawny. I nie o to, jakie tam zastosować zasady PSR, tylko jak powinien kod wyglądać konkretnie.

Jeśli to prośba o gotowca, to proszę o podanie zarysu struktury aplikacji w sensie użytych klas i plików.
Fred1485
Nie wiem na ile moja odpowiedź jest zgodna ze standardami, ale skoro w pliku "adresses_for_mailing.php" trzymasz jedynie adresy mailowe, może wartoby przenieść to do jakiejś klasy, która byłaby za to odpowiedzialna.

  1. class Addresses
  2. {
  3. public static function load()
  4. {
  5. return 'addresses';
  6. }
  7. }
kpt_lucek
Cytat(Fred1485 @ 29.07.2016, 18:48:03 ) *
Nie wiem na ile moja odpowiedź jest zgodna ze standardami, ale skoro w pliku "adresses_for_mailing.php" trzymasz jedynie adresy mailowe, może wartoby przenieść to do jakiejś klasy, która byłaby za to odpowiedzialna.

  1. class Addresses
  2. {
  3. public static function load()
  4. {
  5. return 'addresses';
  6. }
  7. }


+ Namespace i konkret autoloader
trzczy
Klasa trzymająca dane to jednak chyba rozwiązanie wątpliwe, bo dane się mogą zmieniać, a zmiana danych nie powinna wymuszać zmiany klasy. Naturalnym wydaje się trzymanie danych gdzieś na zewnątrz, w jakimś xml albo csv, czy bazie danych. I teraz, pobieranie tych danych to zawsze będzie zjawiskiem Side Effect.
Comandeer
@trzczy, problem w tym, że przedstawiony przez Ciebie kod jest poprawny…

include nie może być tam, gdzie deklarujesz klasy lub masz config aplikacji. W reszcie to nieistotne.
viking
Dołączenie pliku np tablicy konfiguracyjnej nie ma zazwyczaj żadnych efektów ubocznych.. Problem się pojawi jak ten sam plik zacznie wykonywać ddatkowo logikę np zmieni ustawienia aplikacji przez redeklaracje ścieżek.
trzczy
Przypisywanie zmiennej i tworzenie obiektu może sąsiadować z Side Effects. Ok. Z kolei proste inkludowanie danych nie jest Side Effects.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.