Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Side Effects Rule PSR-1 konflikty
trzczy
post 29.07.2016, 10:18:19
Post #1





Grupa: Zarejestrowani
Postów: 460
Pomógł: 49
Dołączył: 5.06.2011

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


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ę

Ten post edytował trzczy 29.07.2016, 10:19:37
Go to the top of the page
+Quote Post
Comandeer
post 29.07.2016, 12:36:50
Post #2





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

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


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.


--------------------
Go to the top of the page
+Quote Post
trzczy
post 29.07.2016, 16:59:57
Post #3





Grupa: Zarejestrowani
Postów: 460
Pomógł: 49
Dołączył: 5.06.2011

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


W pytaniu chodzi o to, jak przerobić podane aplikacje, aby były zgodne z tą zasadą.
Go to the top of the page
+Quote Post
Comandeer
post 29.07.2016, 17:21:21
Post #4





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

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


A w moim poście masz odpowiedź…


--------------------
Go to the top of the page
+Quote Post
trzczy
post 29.07.2016, 17:42:11
Post #5





Grupa: Zarejestrowani
Postów: 460
Pomógł: 49
Dołączył: 5.06.2011

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


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.
Go to the top of the page
+Quote Post
Fred1485
post 29.07.2016, 17:48:03
Post #6





Grupa: Zarejestrowani
Postów: 361
Pomógł: 22
Dołączył: 10.02.2015

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


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. }


--------------------
  1. echo 'I was trying';
  2. die ();
Go to the top of the page
+Quote Post
kpt_lucek
post 29.07.2016, 18:12:10
Post #7





Grupa: Zarejestrowani
Postów: 428
Pomógł: 77
Dołączył: 10.07.2011
Skąd: Warszawa

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


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


--------------------


Cytat
There is a Bundle for that
Lukas Kahwe Smith - October 31th, 2014
Go to the top of the page
+Quote Post
trzczy
post 29.07.2016, 18:27:17
Post #8





Grupa: Zarejestrowani
Postów: 460
Pomógł: 49
Dołączył: 5.06.2011

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


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.
Go to the top of the page
+Quote Post
Comandeer
post 29.07.2016, 18:27:42
Post #9





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

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


@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.


--------------------
Go to the top of the page
+Quote Post
viking
post 29.07.2016, 19:04:35
Post #10





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


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.


--------------------
Go to the top of the page
+Quote Post
trzczy
post 29.07.2016, 19:22:00
Post #11





Grupa: Zarejestrowani
Postów: 460
Pomógł: 49
Dołączył: 5.06.2011

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


Przypisywanie zmiennej i tworzenie obiektu może sąsiadować z Side Effects. Ok. Z kolei proste inkludowanie danych nie jest Side Effects.

Ten post edytował trzczy 29.07.2016, 19:22:40
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: 19.04.2024 - 17:23