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

Jak powinna wyglądać klasa w php?

Cloud VPS
+2 głosów
385 wizyt
pytanie zadane 13 grudnia 2020 w PHP przez Anedroid Obywatel (1,530 p.)

Witam. Jestem dosyć początkujący w kwestii programowania obiektowego, tzn. wiem mniej-więcej jak działają poszczególne mechanizmy, ale nie znam często stosowanych praktyk lub błędów których należy unikać. Bardzo zależy mi na czytelności, wydajności i elastyczności kodu ale często trudno jest mi to osiągnąć.

Stworzyłem sobie taką prostą klasę Locale, która ma wykonywać wszelkie zadania związane z lokalizacją strony: stworzyć listę alternatywną języków na podstawie: zmiennej $lc z innej klasy która oznacza bezpośredni wybór języka przez użytkownika, języków w nagłówku http wysłanym przez przeglądarkę i język angielski na końcu listy. Następnie klasa wybiera pierwszy dostępny język z tej listy z użyciem pętli po nazwach plików i w takim języku wyświetla stronę.

Drugim zadaniem klasy Locale jest wyświetlenie listy języków do wyboru podzielonej na dwie grupy (oczywiście generowaniem html zajmuje się inna klasa): sugerowane i pozostałe. Sugerowane to te języki z listy alternatywnej, oprócz domyślnego angielskiego, a pozostałe to te które nie znalazły się w grupie sugerowanych ale są również dostępne dla danej podstrony. Na całej liście muszą się znaleźć wszystkie dostępne języki i nie może się znaleźć taki który jest niedostępny.

Moim problemem nie jest stworzenie działającej klasy która będzie spełniać oba te zadania, ale optymalizacja kodu i jego uporządkowanie. Nie wiem:

  • jakie nazwy nadać stałym, zmiennym i funkcjom aby były wystarczająco czytelne,
  • jak optymalnie podzielić zadania między funkcje klasy,
  • jak zminimalizować liczbę użytych pętli aby zapewnić maksymalną wydajność strony,
  • jak poradzić sobie z obsługą błędów,
  • przekazywać dane do obiektu w formie argumentów funkcji czy deklaracji zmiennych (np. $lang->prefferences = ["pl"];)?

Niezbyt sobie również radzę z komentowaniem kodu i nieco się w nim gubię. Jeżeli jest to ważna informacja, to korzystam z frameworka Smarty.

komentarz 13 grudnia 2020 przez Anedroid Obywatel (1,530 p.)
I jeszcze jedno: jak często publikować zmiany w Githubie (git commit), oraz jak je opisywać?

1 odpowiedź

+4 głosów
odpowiedź 13 grudnia 2020 przez Comandeer Guru (607,060 p.)

Co do nazewnictwa: https://www.php-fig.org/psr/psr-12/

jak optymalnie podzielić zadania między funkcje klasy

Nie ma jakiejś jednej, złotej zasady. Po prostu wypada dzielić zadania tak, żeby każda metoda wykonywała jedną rzecz. Zresztą podobną zasadą powinno się kierować przy tworzeniu klas, więc jeśli zakładasz, że Twoja klasa ma robić dwie rzeczy, to prawdopodobnie jest tutaj miejsce do podziału na dwie klasy.

 jak zminimalizować liczbę użytych pętli aby zapewnić maksymalną wydajność strony,

Trudno cokolwiek powiedzieć, nie widząc kodu. Niemniej brzmi jak przedwczesna optymalizacja. Na razie bym się tym nie martwił.

 jak poradzić sobie z obsługą błędów

Klasa w razie problemów powinna rzucić wyjątkiem – tyle. Jak to zostanie obsłużone przez resztę systemu, to już zupełnie odrębny problem.

przekazywać dane do obiektu w formie argumentów funkcji czy deklaracji zmiennych (np. $lang->prefferences = ["pl"];)

Pytanie brzmi, czy te dane potrzebne są całej klasie, czy tylko tej metodzie? Ogólnie jako własności powinny być te dane, które stanowią tzw. stan klasy (np. aktualnie wybrany język), natomiast wszystko to, czego potrzebują metody do pracy powinno iść jako parametry metod. 

komentarz 13 grudnia 2020 przez Anedroid Obywatel (1,530 p.)
edycja 13 grudnia 2020 przez Anedroid

jeśli zakładasz, że Twoja klasa ma robić dwie rzeczy, to prawdopodobnie jest tutaj miejsce do podziału na dwie klasy.

2 zadania, ale oba związane z lokalizacją. Trochę trudno mi jest sobie wyobrazić dzielenie tego na 2 klasy, w końcu oba te zadania są ze sobą silnie powiązane i korzystają ze wspólnych zmiennych.

Trudno cokolwiek powiedzieć, nie widząc kodu. Niemniej brzmi jak przedwczesna optymalizacja. Na razie bym się tym nie martwił.

Tutaj masz link do Github: https://github.com/anedroid/magic-cloud/blob/master/classes/MagicCloud/Locale.php.

Trudno cokolwiek powiedzieć, nie widząc kodu. Niemniej brzmi jak przedwczesna optymalizacja. Na razie bym się tym nie martwił.

Czyli mam najpierw napisać byle jaki kod żeby działał, a potem go poprawiać i optymalizować?

komentarz 13 grudnia 2020 przez Comandeer Guru (607,060 p.)

Czyli mam najpierw napisać byle jaki kod żeby działał, a potem go poprawiać i optymalizować?

Tak.

A co do kodu, tak szczerze to ja bym tam widział nawet trzy klasy:

  • od parsowania języka z nagłówka HTTP (swoją drogą, źle go parsujesz; zwróć uwagę, że każdy język dostaje tzw. wagę i jeśli jest ona równa "0", to oznacza, że nie chcę danego języka – nie sprawdzasz tego);
  • od wyszukiwania dostępnych pakietów języków;
  • od łączenia tych obu klas i wystawiania prostego API.

Podobne pytania

+1 głos
1 odpowiedź 643 wizyt
pytanie zadane 9 grudnia 2017 w C i C++ przez Marcin_N_97 Stary wyjadacz (10,290 p.)
0 głosów
1 odpowiedź 1,496 wizyt
pytanie zadane 6 czerwca 2017 w PHP przez To Ja Początkujący (490 p.)
0 głosów
1 odpowiedź 869 wizyt
pytanie zadane 31 lipca 2018 w PHP przez Adam Ostrogórski Obywatel (1,070 p.)

93,454 zapytań

142,449 odpowiedzi

322,718 komentarzy

62,833 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

Kursy INF.02 i INF.03
...